トッカンソフトウェア

Vue.js コンポーネント

コンポーネントは<aaa>のようにオリジナルのタグを作る機能です。
				
    <aaa></aaa>

			


定義

				
<html>

<head>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
    <div id="app">
        <aaa></aaa>
    </div>
    <script>
        Vue.component('aaa', {
            data: function () {
                return {
                    count: 0
                }
            },
            template: '<button v-on:click="exec"> Click!! {{ count }} </button>',
            methods: {
                exec: function () {
                    this.count++;
                }
            }
        });

        var app = new Vue({
            el: '#app'
        });
    </script>
</body>

</html>

			
画面イメージ


Vue.componentでコンポーネントを定義します。

Vue.componentの中は基本的にnew Vueと同様ですが、
el が使えないのとdataの中は関数の形にします。


propsで親→子にデータ連携(属性値そのまま)

				
<html>

<head>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
    <div id="app">
        <aaa bbb="Hello World"></aaa>
    </div>
    <script>
        Vue.component('aaa', {
            props: ['bbb'],
            template: '<h3>{{ bbb }}</h3>'
        })

        var app = new Vue({
            el: '#app'
        });
    </script>
</body>

</html>

			
画面イメージ


親のタグ(aaa)の属性(bbb)の値を子(h3)で表示しています。
propsで連携する属性を指定します。


propsで親→子にデータ連携(属性値とJavaScript処理の連携)

				
<html>

<head>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
    <div id="app">
        <aaa v-bind:bbb="message"></aaa>
    </div>
    <script>
        Vue.component('aaa', {
            props: ['bbb'],
            template: '<h3>{{ bbb }}</h3>'
        })

        var app = new Vue({
            el: '#app',
            data: {
                message: 'Hello World!!'
            }
        });
    </script>
</body>

</html>

			
画面イメージ


親のタグ(aaa)の属性(bbb)で指定したJavaScriptの値(message)を子(h3)で表示しています。
propsで連携する属性を指定し、v-bindでJavaScriptの値と紐付けます。


$emitで子→親にイベント連携

				
<html>

<head>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
    <div id="app">
        <aaa v-on:bbb="ccc"></aaa>
    </div>
    <script>
        Vue.component('aaa', {
            template: `
    <button v-on:click="$emit('bbb', 'World')">
      Hello
    </button>
  `
        });

        var app = new Vue({
            el: '#app',
            methods: {
                ccc: function (ddd) {
                    alert(ddd)
                }
            }
        });
    </script>
</body>

</html>

			
画面イメージ


$emitで親にイベント送信できます。引数には送信先を指定します。
引数を渡したい場合は送信先の後ろに付けられます。


$emitで子→親にイベント連携(データ送信)

				
<html>

<head>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
    <div id="app">
        <aaa v-on:bbb="ccc"></aaa>
    </div>

    <script>
        Vue.component('aaa', {
            template: `
    <div>
        <input type="text" v-model="eee" />
        <button v-on:click="fff">
            Hello
        </button>
    </div>
  `,
            data: function () {
                return {
                    eee: 'World'
                }
            },
            methods: {
                fff: function () {
                    this.$emit('bbb', this.eee);
                }
            }
        });

        var app = new Vue({
            el: '#app',
            methods: {
                ccc: function (ddd) {
                    alert(ddd)
                }
            }
        });
    </script>
</body>

</html>

			
画面イメージ


template下は複数のタグを指定できない?のでdivで囲んでみました。
v-modelで属性値を連携させ、それを親に送っています。

ページのトップへ戻る