[Vue] ES5에서 vue Template 사용 방법


webpack 등 빌드 툴과, vue-cli 를 이용한 SPA 화면 개발이 아닌 Vue CDN을 추가하여 vue.js를 ES5 방식으로 개발 시에 컴포넌트 사용 예제이다.




github 코드 : https://github.com/linked2ev/springboot-thymeleaf-vue
참고 : https://blog.martinwork.co.kr/vuejs/2017/10/26/vue-component-template.html
참고 : https://vuejsdevelopers.com/2017/03/24/vue-js-component-templates/?jsdojo_id=medium_cot




Vue.js Template 을 컴포넌트화하는 방법

Vuejs 내에서도 각 template을 컴포넌트 방법 중에 전역/지역 컴포넌트 방식으로 아래와 같은 방식이다.

  • Template literal
  • X-Templates
  • Inline



Vue CDN 추가

<script th:src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<div id="app">
    <div>
        <h2>전역 컴포넌트</h2>

        <h4>Template literal 컴포넌트</h4>
        <ex1-string-component></ex1-string-component>

        <h4>X-Templates 컴포넌트</h4>
        <ex2-template-component></ex2-template-component>

        <h4>inline 컴포넌트</h4>
        <ex3-inline-example inline-template>
            <div class="module_tab" id="tab" data-module-tab="wrap">
                <ul>
                    <li v-for="(item, index) in items">
                        <button @click="btnClick( index )" type="button"><span></span></button>
                    </li>
                </ul>
                <div class="module_tab_contents">
                    
                </div>
            </div>
        </ex3-inline-example>
    </div>

    <hr>

    <div>
        <h2>전역 컴포넌트</h2>

        <h4>Template literal 컴포넌트</h4>
        <ex4-component></ex4-component>

        <h4>X-Templates 컴포넌트</h4>
        <ex5-component></ex5-component>
    </div>
</div><!-- //vue app id -->


<!-- ex2) ex2 컴포넌트 -->
<script type="text/x-template" id="ex2-template">
    <div class="module_tab" data-module-tab="wrap">
        <ul>
            <li v-for="(item, index) in items">
                <button @click="btnClick( index )" type="button"><span></span></button>
            </li>
        </ul>
        <div class="module_tab_contents">
            
        </div>
    </div>
</script>
/**
 * ES5 - Componet 사용예제
 */

/* 전역 컴포넌트 */
//Template literal 형태
Vue.component('ex1-string-component', {
    template: `
        <div class="module_tab" data-module-tab="wrap">
            <ul>
                <li v-for="(item, index) in items">
                    <button @click="btnClick( index )" type="button"><span></span></button>
                </li>
            </ul>
            <div class="module_tab_contents">
                
            </div>
        </div>
    `,
    data () {
        return {
            message: '',
            items: [{
                'button': '버튼1',
                'contents': '버튼1 클릭'
            },{
                'button': '버튼2',
                'contents': '버튼2 클릭'
            },{
                'button': '버튼3',
                'contents': '버튼3 클릭'
            }]
        }
    },
    methods: {
        btnClick (targetIndex) {
            this.message = this.items[targetIndex].contents;
        }
    }
})

//X-templates 형태 - Vue Root App Id <div> 밖에 선언
Vue.component('ex2-template-component', {
    template: '#ex2-template',//<x-template> Id
    data () {
        return {
            message: '',
            items: [{
                'button': '버튼1',
                'contents': '버튼1 클릭'
            },{
                'button': '버튼2',
                'contents': '버튼2 클릭'
            },{
                'button': '버튼3',
                'contents': '버튼3 클릭'
            }]
        }
    },
    methods: {
        btnClick (targetIndex) {
            this.message = this.items[targetIndex].contents;
        }
    }
});

//Inline templates 형태 - Vue Root App Id <Div> 안에 선언
Vue.component('ex3-inline-example', {
    data () {
        return {
            message: '',
            items: [{
                'button': '버튼1',
                'contents': '버튼1 클릭'
            },{
                'button': '버튼2',
                'contents': '버튼2 클릭'
            },{
                'button': '버튼3',
                'contents': '버튼3 클릭'
            }]
        }
    },
    methods: {
        btnClick (targetIndex) {
            this.message = this.items[targetIndex].contents;
        }
    }
});

/* 지역 컴포넌트 */
//Template literal 형태
let ex4StringComponent = {
    template: `
        <div class="module_tab" data-module-tab="wrap">
            <ul>
                <li v-for="(item, index) in items">
                    <button @click="btnClick( index )" type="button"><span></span></button>
                </li>
            </ul>
            <div class="module_tab_contents">
                
            </div>
        </div>
    `,
    data () {
        return {
            message: '',
            items: [{
                'button': '버튼1',
                'contents': '버튼1 클릭'
            },{
                'button': '버튼2',
                'contents': '버튼2 클릭'
            },{
                'button': '버튼3',
                'contents': '버튼3 클릭'
            }]
        }
    },
    methods: {
        btnClick (targetIndex) {
            this.message = this.items[targetIndex].contents;
        }
    }
}

//X-templates 형태 - Vue Root App Id <Div>밖에 선언
let ex5TemplateComponent = {
    template: '#ex2-template',//<x-template> Id
    data () {
        return {
            message: '',
            items: [{
                'button': '버튼1',
                'contents': '버튼1 클릭'
            },{
                'button': '버튼2',
                'contents': '버튼2 클릭'
            },{
                'button': '버튼3',
                'contents': '버튼3 클릭'
            }]
        }
    },
    methods: {
        btnClick (targetIndex) {
            this.message = this.items[targetIndex].contents;
        }
    }
}


/**
 * 컴포넌트는 vue app id 보다 위에 선언되어야 한다.
 * app
 */
let app = new Vue({
    el: '#app',
    components: {
        'ex4-component': ex4StringComponent,
        'ex5-component': ex5TemplateComponent
    }
})