组件的通信
- 为什么要进行组件通信?
组件是一个聚合体,将来项目要合并,那么各个组件之间必然需要建立联系,这个联系就是数据通信 - data选项为什么是一个函数?
组件是一个聚合体,也是一个整体,它需要一个独立的作用空间,也就是它的数据需要是独立的,目前js的最大特点是函数式编程,而函数恰好提供了一个独立作用域,所以我们data在出根组件外都是函数 - 为什么data函数需要返回一个返回值,返回值还是对象,不能是数组吗?
Vue通过es5的Object.definePerproty属性对一个对象进行getter和setter设置,而data选项是作为Vue深入响应式核心的选项
分类
- 父子组件通信
- 过程:
- 父组件将自己的数据同 v-bind 绑定在子组件身上
- 子组件通过 props属性接收
<body>
<div id="app">
<Father></Father>
</div>
<template id="father">
<div>
<Son :money = "money" />
</div>
</template>
<template id="son">
<div>
<p> {{ money }} </p>
<p> {{ money + 20 }} </p>
</div>
</template>
</body>
<script src="../../../lib/vue.js"></script>
<script>
Vue.component('Father',{
template: '#father',
data () {
return {
money: 4000
}
}
})
Vue.component('Son',{
template: '#son',
props: ['money']
props: {
}
}
}
})
new Vue({
el: '#app'
})
</script>
<body>
<div id="app">
<Father></Father>
</div>
<template id="father">
<div>
<p> {{ num }} </p>
<Son @hongbao = "get"/>
</div>
</template>
<template id="son">
<div>
<button @click = "give"> 发红包 </button>
</div>
</template>
</body>
<script src="../../../lib/vue.js"></script>
<script>
Vue.component('Father',{
template: '#father',
data () {
return {
num: 0
}
},
methods: {
get ( val ) {
this.num = val
}
}
})
Vue.component('Son',{
template: '#son',
data () {
return {
money: 2000
}
},
methods: {
give () {
this.$emit('hongbao',this.money)
}
}
})
new Vue({
el: '#app'
})
</script>
- 非父子组件通信
- 子父组件通信 ref 链 + 父子组件通信 props【自定义属性】
<body>
<div id="app">
<Father></Father>
</div>
<template id="father">
<div>
<h3> father组件 </h3>
<hr>
<Girl :aa = "getSon"></Girl>
<hr>
<Son ref = "son"></Son>
</div>
</template>
<template id="son">
<div>
<h3> son组件 </h3>
<p v-if = "flag"> Vue 1.0 </p>
<p v-else> Vue 2.0 </p>
</div>
</template>
<template id="girl">
<div>
<h3> girl组件 </h3>
<button @click = "bb"> btn </button>
</div>
</template>
</body>
<script src="../../../lib/vue.js"></script>
<script>
Vue.component('Father',{
template: '#father',
methods: {
getSon () {
console.log( this )
this.$refs.son.changeFlag()
}
}
})
Vue.component('Son',{
template: '#son',
data () {
return {
flag: true
}
},
methods: {
changeFlag () {
this.flag = !this.flag
}
}
})
Vue.component('Girl',{
template: '#girl',
props: ['aa'],
methods: {
bb () {
this.aa()
}
}
})
new Vue({
el: '#app'
})
</script>
<body>
<div id="app">
<Father></Father>
</div>
<template id="father">
<div>
<h3> father组件 </h3>
<hr>
<Girl></Girl>
<hr>
<Son></Son>
</div>
</template>
<template id="son">
<div>
<h3> son组件 </h3>
<p v-if = "flag"> Vue 1.0 </p>
<p v-else> Vue 2.0 </p>
</div>
</template>
<template id="girl">
<div>
<h3> girl组件 </h3>
<button @click = "bb"> btn </button>
</div>
</template>
</body>
<script src="../../../lib/vue.js"></script>
<script>
var bus = new Vue()
Vue.component('Father',{
template: '#father',
})
Vue.component('Son',{
template: '#son',
data () {
return {
flag: true
}
},
mounted () {
var _this = this
bus.$on('aa',function () {
_this.flag = !_this.flag
})
}
})
Vue.component('Girl',{
template: '#girl',
methods: {
bb () {
bus.$emit('aa')
}
}
})
new Vue({
el: '#app'
})
</script>
路由 vue-router(待续…)
多组件状态共享 vuex(待续…)