vuejs组件通信
程序员文章站
2022-03-09 19:46:38
...
组件通信
所有的组件通信都是单向的
父子组件通信
A:邦定的是简单数据类型
1、父组件中定义数据,通过单向数据绑定属性把父组件的数据绑定在子组件身上,属性是自定属性
2、子属性通过配置项中的props接收数据,props可以是一个数组,数组中放的是自定义属性
3、这个自定义属性可以像data的属性一样直接使用
4、父组件中数据一旦修改,子组件中的通信数据也会改变(单向数据邦定)
<Father></Father>
</div>
<template id="father">
<div class="father-box">
<h3>father 组件</h3>
<p>{{money}}</p>
<hr>
<Son :money="money"></Son>
</div>
</template>
<template id="son">
<div class="son-box">
<h3>son组件</h3>
、<input type="text" v-model='money'> 如果money不是引用数据类型就会出错
<p>这是我爸这个月给我的生活费:{{money}}</p>
</div>
</template>
<script>
Vue.component('Father', {
template: '#father',
data() {
return {
money: 1000
}
}
})
Vue.component('Son', {
template: '#son',
props: ['money']
})
new Vue({
el: '#app'
})
</script>
#### 子父通信(效果上像,间接的使用了父组件的东西)
B:邦定复杂数据类型--------【不推荐】
1、父组件中的数据类型是复杂数据类型,那么父组件邦定数据的时候,给子组件的是一个引用地址,
2、子组件可以通过这个引用地址,改修了这个数据
3、效果上,子组件和父组件通信了,违背单向数据流
html代码
html
<div id="app">
<Father></Father>
</div>
<template id="father">
<div>
<h3>father 组件</h3>
<p>私房钱{{money.moneys}}</p>
<hr>
<Son :money='money'></Son>
</div>
</template>
<template id="son">
<div>
<h3>son 组件</h3>
<input type="text" v-model='money.moneys'>
<p>这是我爸这个月给我的生活费{{money.moneys}}</p>
</div>
</template>
```
js代码
```js
<script>
Vue.component('Father', {
template: '#father',
data() {
return {
money: {
moneys: 1000
}
}
}
})
Vue.component('Son', {
template: '#son',
props: ['money']
})
new Vue({
el: '#app'
})
</script>
C:父组件可以传递一个方法给子组件
1、父组件定义方法,然后将这个方法通过单向数据绑定的形式传递给子组件
2、子组件通过props属性接收,然后通过@click = ‘方法名’
html:
<div id="app">
<King></King>
</div>
<template id="king">
<div>
<h3>king 组件</h3>
<p>{{money}}</p>
<hr>
<Pingming :getmoney='getMoney'> </Pingming>
</div>
</template>
<template id="pingming">
<div>
<h3>pingming 组件</h3>
<input type="button" @click='getmoney(1000)' value="上缴">
</div>
</template>
js:
<script>
Vue.component('King', {
template: '#king',
data() {
return {
money: 0
}
},
methods: {
getMoney(value) {
this.money += value
}
}
})
Vue.component('Pingming', {
template: '#pingming',
props: ['getmoney']
})
new Vue({
el: '#app'
})
</script>
D:通过自定义事件来实现通信
1、在父组件中定义 数据 和 方法 (方法是用来操作数据的)
2、在子组件身上绑定自定义事件
3、子组件定义方法,在这个方法中通过 this.$emit(eventType,实际参数) 来调用自定义事件处理程序
html代码
<div id="app">
<King></King>
</div>
<template id="king">
<div>
<p>King 组件</p>
<p>{{money}}</p>
<People @get="get"></People>
</div>
</template>
<template id="people">
<div>
<p>people组件</p>
<p>{{moneys}}</p>
<input type="button" value="上缴" @click='give'>
</div>
</template>
js代码
Vue.component('King', {
template: '#king',
data() {
return {
money: 0
}
},
methods: {
get(value) {
this.money += value
}
}
})
Vue.component('People', {
template: '#people',
data() {
return {
moneys: 1000
}
},
methods: {
give() {
this.$emit('get', this.moneys)
}
}
})
非父子组件通信
-使用ref来绑定组件,(注意:ref也可以绑定DOM元素)(ref链)
1、在父组件的模板中,使用ref = ‘name’绑定在两个兄弟组件身上,
2、在任意一个子组件中,就可以通过 this.$parent.$ref.refName 就可以获得另一个子组件了,同时这个子组件身上的数据和方法同样也得到 了
-通过事件总线(bus)(没有共同的父组件----根组件不算(new 实例))
1、它是通过事件的发布,以及事件的订阅(触发)来做的
2、首先在js中,创建一个bus对象(vm)
````javascript
var bus = new Vue()
```
3、在count组件中定义数据,和修改数据的方法
4、在count组件中 通过created钩子,进行bus事件的发布
```javascript
created:{
bus.$on('add',this.addCount)
}
5、在MyButton组件的方法中通过bus进行事件的订阅
```javascript
increment(){
bus.$emit('add')
}
推荐阅读
-
Asp.Net Core + SignalR 实现实时通信
-
c#socket TCP同步网络通信
-
小程序自定义组件——创建和使用自定义组件步骤 & 自定义组件属性properties数据列表、data数据、methods方法的用法
-
yii2组件之多图上传插件FileInput的详细使用,yii2fileinput
-
yii分页组件用法实例分析
-
PHP开发框架Yii Framework教程(30) Zii组件-ListView示例
-
jQuery循环动画与获取组件尺寸的方法_jquery
-
Angular4集成ng2-file-upload的上传组件
-
PHP与java 通信插件
-
父子组件之间传递Function,在vue组件中callback的应用