uniapp 微信小程序:v-model双向绑定问题(自定义 props 名无效)
- 前言
- 问题
- 双向绑定示例
- 使用 v-model
- 使用 v-bind + v-on
- 使用 sync 修饰符
- 参考资料
前言
VUE中父子组件传递数据的基本套路:
- 父传子
props
- 子传父
this.$emit('事件名', '数据');
- 使用
sync
修饰符,实现支持同步数据
问题
因为用的是 uniapp 开发小程序,所以要考虑到兼容性问题,不要把自己当正经VUE2。
小程序虽然支持 v-model
指令,但不支持 model
选项。
所以要么子组件中声明默认的 value
这个 props 来接收值。
要么手动:绑定属性
和事件
双向绑定示例
使用 v-model
由于小程序不支持 model
选项。
这个方案中:子组件里只能使用 value
接收数据,更新时触发 input
。
- 父组件
<template><view><view><text>父组件:{{ msg }}</text></view><vmodel-component v-model="msg"></vmodel-component></view>
</template><script>export default {data() {return { msg: '大家好,我是:使用 v-model' }},methods: {}}
</script><style>
</style>
- 子组件
<template><view> <view> 子组件:{{value}} </view><button @click="onclick" >更新</button></view>
</template><script>export default {data() {return {};},props:{value:{ type: String, default: "未收到父值" }},methods:{onclick(e){this.$emit('input', '我是笨笨'); // v-mode }}}
</script><style>
</style>
使用 v-bind + v-on
当然一般都会用简写形式:
v-bind:
缩写为 :
v-on:
缩写为 @
由于是自己手绑定,props
和 事件名
都可以自己定。
比如在子组件中我就用 msg
接收数据。
事件我自己取名叫 customEvent
。
<template><view><view><text>父组件:{{ msg }}</text></view><novmodel-component :msg="msg" @customEvent="e => msg = e"></novmodel-component><!-- <novmodel-component :msg="msg" @input=" msg = $event "></novmodel-component> --></view>
</template><script>export default {data() {return { msg: '大家好,我是:不使用 v-model' }},methods: {}}
</script><style>
</style>
- 子组件
<template><view> <view> 子组件:{{msg}} </view><button @click="this.$emit('customEvent', '我是笨笨')" >更新</button></view>
</template><script>export default {data() {return {};},props:{msg:{ type: String, default: "未收到父值" }},methods:{}}
</script><style>
</style>
使用 sync 修饰符
使用 sync 时可以自己决定绑到子组件的哪个 props
上,比如就绑到了 msg
上。
同步数据时触发 update:要更新的props
- 父组件
<template><view><view><text>父组件:{{ msg }}</text></view><sync-component :msg.sync="msg"></sync-component></view>
</template><script>export default {data() {return { msg: '大家好,我是:使用 sync 修饰符,实现同步数据' }},methods: {}}
</script><style>
</style>
- 子组件
<template><view> <view> 子组件:{{msg}} </view><button @click="$emit('update:msg', '我是笨笨')" >更新</button></view>
</template><script>export default {data() {return {};},props: {msg: { type: String, default: "未收到父值" }},methods:{}}
</script><style>
</style>
参考资料
uniapp官方文档 :模板指令 v-model
uniapp官方文档 :.sync 修饰符
vue2官方文档:选项 model