TIL/Today I Learned

[TIL] 23.08.10 Today I Learned

임성장 2023. 8. 10. 22:30
728x90

요약: vue 문법

일시: 23.08.10

장소: 더휴먼컴퓨터아트아카데미

배운 점:

vue

ref

  • Vue 컴포넌트 내에서 DOM 요소나 다른 값을 참조하기 위해 사용
  • ref를 사용하면 Vue 컴포넌트 내에서 해당 요소나 값에 접근하고 조작 가능
<template>
  <div>
    <button @click="increaseCounter">카운터 증가</button>
    <p>카운터: {{ counter }}</p>
    <input type="text" ref="textInput" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      counter: 0,
    };
  },
  methods: {
    increaseCounter() {
      this.counter++;
      // ref를 통해 DOM 요소에 접근하여 포커스를 설정합니다.
      this.$refs.textInput.focus();
    },
  },
};
</script>

 

$emit

  • Vue 컴포넌트 내에서 사용자 정의 이벤트를 발생시키는 메서드
  • 이를 통해 부모 컴포넌트와 자식 컴포넌트 간에 통신하거나 데이터를 전달 가능
  • 발생한 이벤트는 부모 컴포넌트에서 v-on 또는 @ 디렉티브를 사용하여 감지하고 해당 이벤트가 발생했을 때 실행할 메서드를 지정 가능
// 자식 컴포넌트

<template>
  <button @click="sendMessage">메시지 보내기</button>
</template>

<script>
export default {
  methods: {
    sendMessage() {
      // 'send-message' 이벤트를 발생시킵니다.
      this.$emit('send-message', '안녕하세요!');
    }
  }
};
</script>
  • this.$emit('send-message', '안녕하세요!')는 "send-message"라는 이벤트를 발생
  • 이벤트 데이터로 '안녕하세요!' 문자열을 전달

 

// 부모 컴포넌트

<template>
  <div>
    <child-component @send-message="handleMessage"></child-component>
    <p>받은 메시지: {{ receivedMessage }}</p>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      receivedMessage: ''
    };
  },
  methods: {
    handleMessage(message) {
      this.receivedMessage = message;
    }
  }
};
</script>
  • @send-message="handleMessage" 부분은 자식 컴포넌트에서 발생한 "send-message" 이벤트를 감지
  • 해당 이벤트가 발생했을 때 handleMessage 메서드를 실행하도록 설정

 

export default 안에 들어가는 것들

  • export default 문은 Vue 컴포넌트를 정의하고 내보내는 데 사용
  • export default 내부에는 컴포넌트의 구조와 동작을 정의하는 여러 가지 속성과 옵션들이 포함

data

  • 컴포넌트의 상태를 정의하는 데이터 객체
  • 컴포넌트 내에서 사용되는 데이터들이 여기에 포함
  • 함수 형태

props

  • 부모 컴포넌트로부터 전달받은 속성을 정의하는 옵션
  • 이를 통해 부모 컴포넌트와 데이터를 주고받을 수 있음
  • 객체 형태

methods

  • 컴포넌트의 메서드를 정의하는 객체
  • 이벤트 처리나 기타 동작을 위한 메서드들이 여기에 포함
  • 객체 형태

computed

  • 계산된 속성을 정의하는 객체
  • 기존 데이터를 기반으로 계산된 값을 제공
  • 객체 형태

watch

  • 데이터나 속성의 변화를 감지
  • 이에 대응하는 동작을 정의하는 객체
  • 객체 형태

 created, mounted, updated, destroyed 등의 라이프사이클 훅

  •  컴포넌트의 라이프사이클 이벤트에 대한 처리를 정의하는 메서드
  •  함수 형태

components

  • 해당 컴포넌트 내에서 사용할 하위 컴포넌트들을 등록하는 객체
  • 객체 형태

propsData

  • 테스트 목적으로 컴포넌트에 전달할 초기 props 데이터를 정의
  • 객체 형태

 

slot

  • 컴포넌트의 템플릿 내부에서 컨텐츠를 삽입하는 데 사용되는 기능
  • 부모 컴포넌트에서 자식 컴포넌트의 템플릿을 확장하거나 커스터마이징할 때 유용하게 사용
  •  자식 컴포넌트의 일부 또는 전체 템플릿을 부모 컴포넌트에서 결정하고 제어 가능
  •  컴포넌트 재사용성을 높이고 동적인 컴포넌트 구성을 가능하게 함
// ChildComponent.vue

<template>
  <div class="child-component">
    <slot></slot>
  </div>
</template>
// ParentComponent.vue

<template>
  <div class="parent-component">
    <child-component>
      <p>부모 컴포넌트에서 추가된 컨텐츠</p>
    </child-component>
  </div>
</template>

<script>
import ChildComponent from "@/components/ChildComponent.vue";

export default {
  components: {
    ChildComponent,
  },
};
</script>
  • 자식 컴포넌트의 <slot></slot> 부분은 부모 컴포넌트에서 삽입한 컨텐츠를 표시할 위치를 나타냄
  • 부모 컴포넌트에서 <child-component> 태그 안에 있는 내용이 자식 컴포넌트의 slot을 통해 삽입됨

 

Provide와 Inject

  • Vue에서 컴포넌트 간에 데이터를 전달하고 공유하기 위한 고급 기능
  • 부모 컴포넌트가 자식 컴포넌트에게 데이터를 제공하고, 자식 컴포넌트가 해당 데이터를 주입받아 사용할 수 있게 해줌
  • provide는 부모 컴포넌트에서 데이터를 제공하고, inject는 자식 컴포넌트에서 해당 데이터를 주입받아 사용하는 역할
// ParentComponent.vue

<template>
  <div>
    <child-component></child-component>
  </div>
</template>

<script>
import ChildComponent from "@/components/ChildComponent.vue";

export default {
  components: {
    ChildComponent,
  },
  provide: {
    message: "부모로부터 전달된 메시지",
  },
};
</script>
// ChildComponent.vue

<template>
  <div>
    <p>부모로부터 받은 메시지: {{ parentMessage }}</p>
  </div>
</template>

<script>
export default {
  inject: ["message"],
  computed: {
    parentMessage() {
      return this.message;
    },
  },
};
</script>
  • 부모 컴포넌트에서 provide 옵션을 사용하여 message 데이터를 제공
  • 자식 컴포넌트에서는 inject 옵션을 사용하여 message 데이터를 주입받아 사용

 

Composition API

  • Vue 3에서 새롭게 도입된 기능 중 하나로, Vue 애플리케이션을 구성하고 관리하는 데 사용되는 기능의 집합
  • 코드를 더 선언적이고 모듈화된 방식으로 작성할 수 있게 해주며, 코드의 재사용성과 가독성을 향상시키는 목적으로 만들어졌음
  • 기존의 Options API와는 다르게 코드를 더 작은 함수로 분리하여 구성하고 이들 함수를 조합하여 컴포넌트를 만들어내는 방식

장점

  • 코드 재사용성: 로직을 함수 단위로 분리하고 컴포넌트 간에 쉽게 공유 가능
  • 가독성: 관련된 코드들이 함께 묶여 있기 때문에 코드의 의도를 이해하기 쉬움
  • 코드 스케일링: 큰 규모의 애플리케이션에서도 코드를 보다 관리 가능한 단위로 분할하여 작성 가능

reactive

  • Vue 3의 Composition API에서 사용되는 함수로, 상태 데이터를 반응형으로 만들고 사용하는 데 도움을 주는 함수
  • 반응형 데이터는 Vue가 해당 데이터의 변경을 감지하고 자동으로 화면을 업데이트할 수 있게 해줌
  • 객체 또는 배열을 인자로 받아 반응형 데이터 객체를 반환
<script>
import { reactive } from "vue";

export default {
  setup() {
    const state = reactive({
      count: 0,
      message: "안녕하세요!",
    });

    return {
      state,
    };
  },
};
</script>

toRefs

  • reactive로 만들어진 객체의 프로퍼티들을 개별적인 반응형 참조로 분리하여 반환
  • 특히 반복문에서 반응형 데이터를 사용할 때, 객체의 프로퍼티들이 잘 동작하게 만들어줌
<template>
  <div>
    <p>{{ state.count }}</p>
    <p>{{ state.message }}</p>
    <button @click="increment">증가</button>
  </div>
</template>

<script>
import { reactive, toRefs } from "vue";

export default {
  setup() {
    const state = reactive({
      count: 0,
      message: "안녕하세요!",
    });

    const increment = () => {
      state.count++;
    };

    // toRefs 함수를 사용하여 반응형 데이터의 프로퍼티를 참조로 변환
    return {
      ...toRefs(state),
      increment,
    };
  },
};
</script>
  • toRefs 함수를 사용하여 state 객체의 프로퍼티들을 개별적인 반응형 참조로 변환한 후, 컴포넌트 내에서 사용할 수 있게 반환

 

부족한 점:

리액트가 익숙해진지 얼마 되지 않아 vue를 배워서 그런지 아직 헷갈리게 많다. 우선은 리액트를 좀 더 깊게 공부한 뒤 vue가 필요해지면 그 때 제대로 공부해야 할 것 같다.

728x90