uniapp 微信小程序:v-model双向绑定问题(自定义 props 名无效)

uniapp 微信小程序:v-model双向绑定问题(自定义 props 名无效)

前言

VUE中父子组件传递数据的基本套路:

  1. 父传子 props
  2. 子传父 this.$emit('事件名', '数据');
  3. 使用 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

猜你喜欢

转载自blog.csdn.net/jx520/article/details/131973260