반응형

컴포넌트란?

  • 화면의 영역을 분리하여 개발하는 것
  • 컴포넌트를 사용함으로써 코드를 재사용하기 편해짐

예제

  • 전에 만들었던 더하기 문제 맞추기 예제를 (서로다른)두 개 만든다고 생각해보자
  • 이 때 생각할 수 있는 방법은 2가지 있는데,
<div id="test">
    <div>{{num1}} + {{num2}} = ?</div>
    <input type="number" v-model="input">
    <button v-on:click="SubmitForm">입력</button>
    <div>{{result}}</div>

    <div>{{num1}} + {{num2}} = ?</div>
    <input type="number" v-model="input">
    <button v-on:click="SubmitForm">입력</button>
    <div>{{result}}</div>
</div>
  • 첫번째 방법은 다음과 같이 2번 써주는 것
  • 이 때의 결과는 아래와 같이 두개가 같은 data와 methods를 공유함

  • 두번째 방법은 div를 하나 더 만들고 id를 test가 아닌 다른 id로 설정해 주는 것
  • 이 방법은 제대로 동작은 하지만 코드를 2번씩 써줘야 되기 때문에 코드가 너무 길어짐
  • 이를 해결하기 위해 컴포넌트 사용

전역 컴포넌트

<body>
    <div id="test">
        <plus_test></plus_test>
        <plus_test></plus_test>
    </div>
</body>
<script>
    Vue.component('plus_test', {
        template: `
            <div>
                <div>{{num1}} + {{num2}} = ?</div>
                <form v-on:submit="SubmitForm">
                    <input type="number" v-model="input"/>
                    <button type="submit">입력</button>
                    <div>{{result}}</div>
                </form>
            </div>
        `,
        data() {
            return {
                num1: Math.ceil(Math.random()*10 ),
                num2: Math.ceil(Math.random()*10 ) ,
                input: '',
                result: '',
            };
        },
        methods: {
            SubmitForm(event){
                event.preventDefault();
                if(this.num1 + this.num2 == this.input){
                    this.result="정답";
                    this.num1 = Math.ceil(Math.random()*10 );
                    this.num2 = Math.ceil(Math.random()*10 );
                    this.input = '';
                } else{
                    this.input =  '';
                    this.result = "오답";
                }
            },
        },
    });
</script>
<script>
    new Vue({
        el: "#test",
    });
</script>
  • 다음 코드와 같이 'plus_test'라는 컴포넌트를 생성하고, HTML 부분에서는 컴포넌트를 불러주기만 함
  • <plus_test></plus_test>를 2번 해줌으로서 컴포넌트를 2개 생성했다고 보면 됨
  • 이 때 중요한 점은 두 컴포넌트들이 서로 data와 methods를 공유하지 않는다는 것
  • template 부분 작성시 주의해야 할 점 : 가장 상위 태그가 여러개 있으면 안됨
    • 원래 코드에서는 div와 form이 가장 상위 태그였는데 수정한 코드에서는 div를 하나 더 만들어서 가장 상위 태그를 하나로 해줌
  • 결과는 다음과 같이 2개가 생성되지만, 서로 따로 동작함을 확인할 수 있음

지역 컴포넌트

  • 지역 컴포넌트는 다음과 같은 형태로 Vue 인스턴스 안에 컴포넌트를 선언해주면 됨.
<script>
    new Vue({
        el: "#test",
        components: {
            'plus_test': {
                template: `
                `,
                data() {
                    return {
                    };
                },
                methods: {
                },
            }
        }
    });
</script>
반응형

↓ 클릭시 이동

복사했습니다!