var bus = new Vue() Vue.component('friends-list', { template: '#friends-list', data: function() { return { friends: [] } }, created: function() { var self = this; bus.$on('add', function(prof) { self.friends.push(prof) }) bus.$on('iine', function(id, count) { self.friends.map(function(val) { if (val.id == id) { val.count = count } }) }) } }) Vue.component('friends-member', { props: ['member-id'], data: function() { return { count: 0 } }, template: '#friends-member', mounted: function() { bus.$emit('add', { id: this.memberId, name: this.$slots.default[0].text, count: 0 }) }, methods: { iine: function() { bus.$emit('iine', this.memberId, ++this.count) } } }) new Vue({ el: '#app1' })
<div id="app1"> <friends-member member-id="f1">サーバル</friends-member> <friends-member member-id="f2">フェネック</friends-member> <friends-member member-id="f3">アライグマ</friends-member> <friends-list></friends-list> </div> <script type="text/x-template" id="friends-list"> <div class="friends-list"> <h3>現在のフレンズ</h3> <ul> <li v-for="val in friends" :key="val.id"> {{ val.name }} [{{ val.count }}] </li> </ul> </div> </script> <script type="text/x-template" id="friends-member"> <div class="friends">({{memberId}}) <slot/> が仲間になった!<button @click="iine">イイネ({{count}})</button> </div> </script>