- 若是传递的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>