vue 自定义组件 v-model
平时在开发项目写组件时,父子组件间相互传值,父组件传递过去的值通过props,遵循单向数据流规则,子组件不可修改父组件传递过来的值,如需修改需要使用this.$emit('自定义属性', this.XXX),类似这种情况可以使用 v-model 更为合适
平时我们使用 v-model 一般用在 input 标签上
1 <input v-model= 'content' ></input> 2 3 export default{ 4 data(){ 5 return { 6 content: ' ' 7 } 8 } 9 }
等价于
1 <input v-bind:value='content' v-on:input='content = $event.target.value' ></input>
用在组件上类似于
1 Vue.component( 'base-input' , { 2 props: ['value'], 3 template:` <input v-bind:value = 'value' v-on:input = "$emit( 'input', $emit.target.value )" ></input> ` 4 })
一个组件上的 v-model
默认会利用名为 value
的 prop 和名为 input
的事件
所以当我们把 v-model 用在自定义组件上时
1 父组件: 2 <Child v-model = 'flag' ></Child> 3 export default { 4 data(){ 5 return { 6 flag: true 7 } 8 } 9 } 10 11 子组件: 12 <button @click = "$emit( 'input',!value )" ></button> 13 export default { 14 props: { 15 value: Boolean 16 } 17 }
父组件使用 v-model 绑定在data中定义的属性 flag 传递给子组件(Child),子组件通过 props 接收,名为 value ,通过按钮触发对父组件中 flag 进行修改 ( $emit( 'input',!value ) )
通过在model属性中自定义事件:
如果遇到单选框、复选框等类型的输入控件可能会将 value
attribute 用于不同的目的,model
选项可以用来避免这样的冲突:
1 父组件: 2 <Child v-model = ‘flag’></Child> 3 export default { 4 data() { 5 return { 6 flag:true 7 } 8 } 9 } 10 11 子组件: 12 <button @click = " $emit('aliasFlag', !flag)"></button> 13 export default { 14 props:{ 15 flag: Boolean 16 }, 17 model:{ 18 prop: 'flag', 19 event: 'aliasFlag' 20 } 21 }
通过使用 model 里的 event 方法自定义属性名,prop代表和props里的变量相对应