uni-app 自定义组件设置支持v-model在小程序中无法双向绑定
uni-app 自定义组件设置支持v-model在小程序中无法双向绑定
示例代码:
子组件
<template>
<view>
<button @click="onClick">{{ value }}</button>
</view>
</template>
<script>
export default {
name: '',
components: {},
props: {
value: {
type: Number,
default: 0,
},
},
model: {
prop: 'value',
event: 'change',
},
data() {
return {}
},
methods: {
onClick() {
let new_value = this.value + 1
this.$emit('change', new_value)
},
},
}
</script>
<style scoped lang="scss"></style>
父组件
<template>
<view>
<demo v-model="number"></demo>
<view>{{ number }}</view>
</view>
</template>
<script>
import demo from '../components/demo.vue'
export default {
name: '',
components: {
demo,
},
data() {
return {
number: 1,
}
},
methods: {},
}
</script>
<style scoped lang="scss"></style>
操作步骤:
父组件使用代码示例中的组件时 在小程序中value的值没有实现双向绑定效果
预期结果:
小程序中可以支持像h5中那样数据的双向绑定
实际结果:
小程序中不支持像h5中那样数据的双向绑定
bug描述:
自己定义的组件设置支持v-model但是小程序中无法双向绑定,h5中是可以的,如果是二次封装的input组件小程序和h5都正常,其他的小程序中无法双向绑定
| 信息类别 | 信息内容 |
|---|---|
| 产品分类 | uniapp/小程序/微信 |
| PC开发环境 | Windows |
| PC开发环境版本 | windows10 |
| 第三方工具版本 | 1.05.2107221 |
| 基础库版本 | 2.19.2 |
| 项目创建方式 | CLI |
| CLI版本 | ^2.0.0-31920210709003 |
更多关于uni-app 自定义组件设置支持v-model在小程序中无法双向绑定的实战教程也可以访问 https://www.itying.com/category-93-b0.html
2 回复
正式版本此问题有没有得到官方解决?
更多关于uni-app 自定义组件设置支持v-model在小程序中无法双向绑定的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在小程序中,自定义组件使用 v-model 双向绑定确实存在限制。这是因为小程序平台本身不支持自定义组件的双向绑定,而 H5 端基于 Vue 原生机制可以正常使用。
问题原因:
- 小程序自定义组件通信机制与 Vue 不同,其
model选项在小程序中无效。 - 小程序中,父组件向子组件传递数据通过
properties(对应 Vue 的props),子组件向父组件通信通过triggerEvent(对应 Vue 的$emit),但无法自动实现双向绑定。
解决方案:
使用 sync 修饰符替代 v-model:
子组件:
<template>
<view>
<button @click="onClick">{{ value }}</button>
</view>
</template>
<script>
export default {
props: {
value: {
type: Number,
default: 0
}
},
methods: {
onClick() {
let new_value = this.value + 1
this.$emit('update:value', new_value)
}
}
}
</script>
父组件:
<template>
<view>
<demo :value.sync="number"></demo>
<view>{{ number }}</view>
</view>
</template>
<script>
import demo from '../components/demo.vue'
export default {
components: { demo },
data() {
return {
number: 1
}
}
}
</script>

