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