가수면

[Vue] 심화 본문

Vue

[Vue] 심화

니비앙 2024. 5. 25. 14:29

computed vs watch

computed

종속된 데이터가 변경될 때 자동으로 다시 계산되는 속성을 정의할 때 사용

watch와 다르게 데이터 값의 변경이 일어나지 않더라도 최초에 정의된 함수가 실행됨.

<template>
  <div>
    <p>Full Name: {{ fullName }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      firstName: 'John',
      lastName: 'Doe'
    }
  },
  computed: {
    fullName() {
      return this.firstName + ' ' + this.lastName;
    }
  }
}
</script>

watch

정의된 데이터 값 하나만을 감시

computed와 다르게 실제 변경이 일어나기 전까지 실행되지 않음.(값이 할당되지 않음)

 

props로 객체 전달

props: {
    // 기본 타입 체크 ('null'과 'undefined'는 모든 타입 유효성 검사를 통과합니다.)
    propA: Number, // Number 타입 체크
    propB: [String, Number], // 여러 타입 허용
    propC: { // 문자열이고 부모 컴포넌트로부터 반드시 데이터가 필수로 전달되어야 함
        type: String,
        required: true
    },
    propD: { // 기본 값(100)을 갖는 숫자형
        type: Number,
        default: 100
    },
    propE: { // 기본 값을 갖는 객체 타입
        type: Object,
        // 객체나 배열의 기본 값은 항상 팩토리 함수로부터 반환되어야 합니다.
        default: function() {
            return { message: 'hello' }
        }
    },
    propF: { // 커스텀 유효성 검사 함수
        validator: function(value) {
            // 값이 꼭 아래 세 문자열 중 하나와 일치해야 합니다.
            return ['success', 'warning', 'danger'].indexOf(value) !== -1
        }
    },
    propG: { // 기본 값을 갖는 함수
        type: Function,
        // 객체나 배열과 달리 아래 표현은 팩토리 함수가 아닙니다. 기본 값으로 사용되는 함수입니다.
        default: function() {
            return 'Default function'
        }
    }
}

provide/inject

상위 컴포넌트에서 하위 컴포넌트로 데이터를 전달하기 위한 수단으로, 상위 컴포넌트에서 데이터를 제공(provide)하고, 하위 컴포넌트에서 이를 주입(inject) 받아 사용.

리액트로 치면 context api

<!-- ParentComponent.vue -->
<template>
  <ChildComponent />
</template>

<script>
import { provide } from 'vue';

export default {
  setup() {
    const message = 'Hello from parent';
    provide('message', message);	// 키, 값
  }
}
</script>

<!-- ChildComponent.vue -->
<template>
  <p>{{ message }}</p>
</template>

<script>
import { inject } from 'vue';

export default {
  setup() {
    const message = inject('message');
    return { message };
  }
}
</script>

mixins

여러 컴포넌트 간에 재사용 가능한 기능을 공유할 수 있는 방법

mixin 파일 정의

// myMixin.js
export const myMixin = {
  data() {
    return {
      mixinData: 'This is data from mixin'
    }
  },
  methods: {
    mixinMethod() {
      console.log('This is a method from mixin');
    }
  }
}

mixin 사용

<template>
  <div>
    <p>{{ mixinData }}</p>
    <button @click="mixinMethod">Call Mixin Method</button>
  </div>
</template>

<script>
import { myMixin } from './myMixin';

export default {
  mixins: [myMixin],	// 사용할 믹스인 파일을 배열로 등록
  data() {
    return {
      localData: 'This is local data'
    }
  },
  methods: {
    localMethod() {
      console.log('This is a local method');
    }
  }
}
</script>

마운트, 언마운트

mixin파일에 mount, unmount를 설정하면 사용하는 컴포넌트에서 마운트, 언마운트에 컴포넌트에서 설정한 작업보다 먼저 실행됨.

// myMixin.js
  mounted() {
    console.log("믹스인 mounted");
  },
  unmounted() {
    console.log("믹스인 unmounted");
  },
// 컴포넌트
  mixins: [myMixin],
  mounted() {
    console.log("컴포넌트 mounted");
    // 믹스인 mounted
    // 컴포넌트 mounted
  },
  unmounted() {
    console.log("컴포넌트 unmounted");
    // 믹스인 unmounted
    // 컴포넌트 unmounted
  },

전역 파일로 등록

main.js에 추가하여 전역 파일로 등록할 수 있음

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import { myMixin } from "./asdas"

createApp(App).mixin(myMixin).mount('#app')

Composition API에서의 mixin

유틸 함수처럼 좀 더 간단하게 사용할 수 있음

import { ref } from 'vue';

export function useMyComposable() {
  const mixinData = ref('This is data from composable');
  const mixinMethod = () => {
    console.log('This is a method from composable');
  };
  
  return { mixinData, mixinMethod };
}
<template>
  <div>
    <p>{{ mixinData }}</p>
    <button @click="mixinMethod">Call Composable Method</button>
  </div>
</template>

<script>
import { useMyComposable } from './useMyComposable';

export default {
  setup() {
    const { mixinData, mixinMethod } = useMyComposable();
    
    return { mixinData, mixinMethod };
  }
}
</script>

'Vue' 카테고리의 다른 글

Vuetify 컴포넌트 자식 요소의 스타일 커스텀하는 방법  (0) 2024.08.26
[Vue] 전역 상태 관리  (0) 2024.05.16
[Vue] Router  (0) 2024.05.16
[Vue] Composition API 방식  (0) 2024.05.13
[Vue] 기본  (0) 2024.05.13
Comments