Vue2.0 傳值方式:
???????在Vue的框架開(kāi)發(fā)的項(xiàng)目過(guò)程中禁悠,經(jīng)常會(huì)用到組件來(lái)管理不同的功能,有一些公共的組件會(huì)被提取出來(lái)兑宇。這時(shí)必然會(huì)產(chǎn)生一些疑問(wèn)和需求碍侦?比如一個(gè)組件調(diào)用另一個(gè)組件作為自己的子組件,那么我們?nèi)绾芜M(jìn)行給子組件進(jìn)行傳值呢隶糕?如果是電商網(wǎng)站系統(tǒng)的開(kāi)發(fā)瓷产,還會(huì)涉及到購(gòu)物車的選項(xiàng),這時(shí)候就會(huì)涉及到非父子組件傳值的情況枚驻。當(dāng)然你也可以用Vuex狀態(tài)管理工具來(lái)實(shí)現(xiàn)濒旦,這部分我們后續(xù)會(huì)單獨(dú)介紹。我先給大家介紹Vue開(kāi)發(fā)中常用的三種傳值方式测秸。
Vue常用的三種傳值方式有:
1.父?jìng)髯?br>
2.子傳父
3.非父子傳值
???????引用官網(wǎng)的一句話:父子組件的關(guān)系可以總結(jié)為 prop 向下傳遞疤估,事件向上傳遞。父組件通過(guò) prop 給子組件下發(fā)數(shù)據(jù)霎冯,子組件通過(guò)事件給父組件發(fā)送消息铃拇,如下圖所示:
image.png
接下來(lái),我們通過(guò)實(shí)例來(lái)看可能會(huì)更明白一些:
1. 父組件向子組件進(jìn)行傳值
image.png
父組件:
<template>
<div>
父組件:
<input type="text" v-model="name">
<br>
<br>
<!-- 引入子組件 -->
<child :inputName="name"></child>
</div>
</template>
<script>
import child from './child'
export default {
components: {
child
},
data () {
return {
name: ''
}
}
}
</script>
子組件:
<template>
<div>
子組件:
<span>{{inputName}}</span>
</div>
</template>
<script>
export default {
// 接受父組件的值
props: {
inputName: String,
required: true
}
}
</script>
2. 子組件向父組件傳值
image.png
子組件:
<template>
<div>
子組件:
<span>{{childValue}}</span>
<!-- 定義一個(gè)子組件傳值的方法 -->
<input type="button" value="點(diǎn)擊觸發(fā)" @click="childClick">
</div>
</template>
<script>
export default {
data () {
return {
childValue: '我是子組件的數(shù)據(jù)'
}
},
methods: {
childClick () {
// childByValue是在父組件on監(jiān)聽(tīng)的方法
// 第二個(gè)參數(shù)this.childValue是需要傳的值
this.$emit('childByValue', this.childValue)
}
}
}
</script>
父組件:
<template>
<div>
父組件:
<span>{{name}}</span>
<br>
<br>
<!-- 引入子組件 定義一個(gè)on的方法監(jiān)聽(tīng)子組件的狀態(tài)-->
<child v-on:childByValue="childByValue"></child>
</div>
</template>
<script>
import child from './child'
export default {
components: {
child
},
data () {
return {
name: ''
}
},
methods: {
childByValue: function (childValue) {
// childValue就是子組件傳過(guò)來(lái)的值
this.name = childValue
}
}
}
</script>
3. 非父子組件進(jìn)行傳值
非父子組件之間傳值沈撞,需要定義個(gè)公共的公共實(shí)例文件bus.js慷荔,作為中間倉(cāng)庫(kù)來(lái)傳值,不然路由組件之間達(dá)不到傳值的效果缠俺。
公共bus.js
//bus.js
import Vue from 'vue'
export default new Vue()
組件A:
<template>
<div>
A組件:
<span>{{elementValue}}</span>
<input type="button" value="點(diǎn)擊觸發(fā)" @click="elementByValue">
</div>
</template>
<script>
// 引入公共的bug显晶,來(lái)做為中間傳達(dá)的工具
import Bus from './bus.js'
export default {
data () {
return {
elementValue: 4
}
},
methods: {
elementByValue: function () {
Bus.$emit('val', this.elementValue)
}
}
}
</script>
組件B:
<template>
<div>
B組件:
<input type="button" value="點(diǎn)擊觸發(fā)" @click="getData">
<span>{{name}}</span>
</div>
</template>
<script>
import Bus from './bus.js'
export default {
data () {
return {
name: 0
}
},
mounted: function () {
var vm = this
// 用$on事件來(lái)接收參數(shù)
Bus.$on('val', (data) => {
console.log(data)
vm.name = data
})
},
methods: {
getData: function () {
this.name++
}
}
}
</script>