- 若是傳遞的prop僅僅用做展現,不涉及修改,則在模板中直接使用便可
- 若是須要對prop的值進行轉化而後展現,則應該使用computed計算屬性
- 若是prop的值用做初始化,應該定義一個子組件的data屬性並將prop做爲其初始值
prop
向下傳遞,事件event
向上傳遞provide
和inject
來實現eventBus
或者vuex
等方式來實現每一個父組件都要實現
changeValue
方法來接收數據並更新數據vue
// 子組件 <template> <div> <van-button @click="add" type="default">加一</van-button> <div> {{countsVal}} </div> <van-button @click="reduce" type="default">減一</van-button> </div> </template> <script> export default { props: { value: Number }, model: { prop: 'value', event: 'input' }, data () { return { // props的初始化比data的初始化要靠前 countsVal: this.value } }, methods: { add () { this.countsVal++ this.$emit('add', this.countsVal) }, reduce() { this.countsVal-- this.$emit('reduce', this.countsVal) } } }; </script> // 父組件 <template> <div> <counter :value='value' @add='changeValue' @reduce='changeValue'/> </div> </template> <script> export default { data () { return { value: 10 } }, methods: { changeValue (data) { this.value = data } } }; </script>
每一個父組件都要實現
add
和reduce
兩個方法vuex
// 子組件 <template> <div> <van-button @click="add" type="default">加一</van-button> <div> {{countsVal}} </div> <van-button @click="reduce" type="default">減一</van-button> </div> </template> <script> export default { props: { value: Number, add: Function, reduce: Function } }; </script> // 父組件 <template> <div> <counter :value='value' :add='add' :reduce='reduce'/> </div> </template> <script> export default { data () { return { value: 10 } }, methods: { add (data) { this.value++ }, reduce (data) { this.value-- } } }; </script>
v-model
語法糖實現,父子組價的數據雙綁Vue內置了v-model指令,v-model 是一個語法糖,能夠拆解爲 props: value 和 events: input。就是說組件只要提供一個名爲 value 的 prop,以及名爲 input 的自定義事件,知足這兩個條件,使用者就能在自定義組件上使用 v-model,戳這裏看model配置api
// 子組件 <template> <div> <van-button @click="changeVal(1)" type="default">加一</van-button> <div> {{countsVal}} </div> <van-button @click="changeVal(-1)" type="default">減一</van-button> </div> </template> <script> export default { props: { value: Number }, data () { return { // props的初始化比data的初始化要靠前 countsVal: this.value } }, methods: { changeVal (data) { this.countsVal += parseInt(data) this.$emit('input', this.countsVal) } } } </script> // 父組件只須要經過v-model將數據傳進去就行了 <template> <div> <counter v-model='counts'/> </div> </template> <script> import counter from './base/counter' export default { components: { counter }, data () { return { counts: 10 } } } </script>