본문 바로가기
study/Vue.js

Vue.js 컴포넌트 component, v-bind:is 동적할당, 템플릿만들기

by 고기만두(개발자) 2022. 6. 6. 10:44
728x90
반응형
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14"></script>
    <script>
        Vue.component('component1', {
            template :  '<div>'
                      + '<h3>첫번째 h3태그입니다</h3>'
                      + '<h3>두번째 h3태그입니다</h3>'
                      + '</div>'    //여러 태그를 한꺼번에 넣는 경우 div로 묶어줘야함
        })

        Vue.component('component2', {
            template :  '<div>'
                      + '<h3>세번째 h3태그입니다</h3>'
                      + '</div>'    //여러 태그를 한꺼번에 넣는 경우 div로 묶어줘야함
        })

        Vue.component('data_component', {
            template :  '<div>'
                       + '<h3>데이터를 사용하는 템플릿</h3>'
                       + '<h3>{{a1}}</h3>'
                       + '<h3>{{a2}}</h3>'
                       + '<h3>{{test_method1()}}</h3>'
                       + '</div>',
            data : function(){  //단순 문자열로 가져오면 에러 남 : function을 사용해야
                rtn_obj = {
                    a1 : '문자열1',
                    a2 : '문자열2'
                }
                return rtn_obj
            },
            methods : {
                test_method1 : function(){
                    return '메서드 호출'
                }
            }
        })

        window.onload = function(){
            var test1 = new Vue({
                el : '#test1'
            })
            var test2 = new Vue({
                el : '#test2'
            })
            var test3 = new Vue({
                el : '#test3',
                components : {  //이런식으로 객체 안에 COMPONENT 설정을 저장도 가능
                    'component3' : {
                        template : '<h3>네번째 h3태그입니다</h3>'
                    },
                    'component4' : {
                        template : '<h3>다섯번째 h3태그입니다</h3>'
                    }
                }
            })
            var test4 = new Vue({
                el : '#test4'
            })

            var a1 = 1

            var test5 = new Vue({
                el : '#test5',
                components: { //이런식으로 components 목록 잡아놓고 불러다 써도 됨
                    'component5' : {
                        template : '<h3>여섯번째 h3태그입니다</h3>'
                    },
                    'component6' : {
                        template : '<h3>일곱번째 h3태그입니다</h3>'
                    },
                },
                /*data : {
                    view1 : 'component5',
                    view2 : 'component6'    //components를 data에서 불러다 쓰고
                }*/
                data : function(){ //함수꼴로 불러오기도 가능
                    if (a1 == 0){
                        return {
                            view1 : 'component5',
                            view2 : 'component1'
                        }
                    } else if(a1 == 1) {
                        return{
                            view1 : 'component6',
                            view2 : 'component2'
                        }
                    }
                }

            })

        }
    </script>
</head>
<body>
    <div id = "test1">
        <component1></component1>   <!--component1 이라는 vue 컴포넌트의 내용을 그대로 가져옴-->
    </div>
    <hr/>
    <div id = "test2">
        <component1></component1>   <!--객체 여러개가 컴포넌트 하나를 사용해도 됨-->
        <component2></component2>   <!--div하나에 여러 컴포넌트가 들어가도 됨-->
        <!-- <component3></component3>   타 객체에서 저장된 컴포넌트는 불러와도 반응이 없음-->
    </div>
    <hr/>
    <div id = "test3">
        <component1></component1>  <!--외부 컴포넌트들은 자유롭게 갖다 쓸 수 있음-->
        <component2></component2>
        <component3></component3>   <!--객체 여러개가 컴포넌트 하나를 사용해도 됨-->
        <component4></component4>   <!--TEST3 객체 하나에 컴포넌트 여러개 가능-->
    </div>
    <hr/>
    <div id = "test4">
        <data_component></data_component>
    </div>
    <hr/>
    <div id = "test5">
        <!--
        <component5></component5>
        <component6></component6> -->
        <!-- 이렇게 하면 동적으로 컴포넌트 셋팅가능-->
        <component v-bind:is='view1'></component>
        <component v-bind:is='view2'></component>
    </div>
</body>
</html>

Vue.component를 활용하면 해당 컴포넌트 이름을 태그처럼 불러다 쓸 수 있다.

 

component 밑으로 템플릿을 만들어 data를 지정하고, method를 지정할 수 있으며 이를 함수 형태로 콜할 수도 있음.

데이터를 지정하는 경우에도 함수의 형태로 return시켜야 한다는 점에 유의하자.

 

타 객체 안에 지정된 컴포넌트는 다른 객체가 불러다 쓸 수 없지만,

범위를 지정하지 않은 경우 다른 객체들이 한 컴포넌트를 동시에 갖다 써도 무방하다.

그리고 객체 하나가 컴포넌트를 여러개 불러쓰는것도 당연히 문제되지 않음.

 

객체 안에서 components 를 직접 지정하여 호출할 수도 있음 : var test3 부분.

 

v-bind:is 를 사용하면, 동적으로 컴포넌트를 조건에 맞게 호출할 수도 있음.

 

결과물

v-bind
vue.js

 

728x90
반응형

댓글