2021-09-09 vue3在setup中实现父子组件的双向绑定

vue3在setup中实现父子组件的双向绑定

  1. 父组件:引用custom-cell的子组件,这是自己写的一个自定义单元格,样式就不放出来
<template>
	<div>
	<!--引入子组件-->
		<custom-cell title="名字"  v-model:xx="list.name"></custom-cell>
	</div>
</template>
<script>
	import customCell from "@views/custom-cell/custom-cell.vue"
	import {reactive,watch} from "vue"
	export default{
		name:"test",
		components:{customCell},
		setup(){
		const list =reactive({
		name:"米老鼠",
		});
		watch(//此处只是用来监听看是否实现父子组件的双向绑定,父组件的值是否随着子组件的改变而改变
		()=>list.name,(nowVal,preVal)=>{
			console.log(nowVal)
		});
		return {list};
		}
}
	
</script>
  1. 子组件:这里简单的写了一个组件,主要是阐述父子组件双向绑定的问题。子组件双向绑定的变量一定不要是给父组件传的属性名,不然就会报“(error Unexpected mutation of “xxx“ prop vue/no-mutating-props)”这样的错,我的理解大概是属性和绑定的变量不能是同一个。
<template>
	<div>
	<!--标题-->
	   <div>{{title}}</div>
	   <!--右边输入框-->
	   <input :pox='xx' v-model='cc' @input="changeXX"/>
	</div>
</template>
<script>
	import {reactive,toRefs} from "vue"
	export default{
		name:"custom-cell",
		components:{},
		props:{
		xx:String
		}
		setup(props,context){
		const data =reactive({
		cc:''
		});
		const qq=toRefs(props);
		data.cc=qq.xx.value;//这一步是初始化实现父传子
		const changXX=function(){
			console.log(data.cc);
			context.emit("update:xx",data.cc);
		};
		watch(//子组件的监听一定要有,不然后期父组件传值不会改变子组件的值,这里是父组件值发生改变时同步修改子组件显示的值
		()=>qq.xx.value,(nowVal,preVal)=>{
			console.log(nowVal);
			data.cc=qq.xx.value;
		});
		return {...toRefs(data),changeXX};
		}
}
	
</script>

3.运行结果:图一是初始化的界面,图二是我在测试时添加了一个定时器让他在界面出现后的2s后在父组件将名字改成“杨亚亚”,(这里代码没写定时器),测试时可以自行添加。这里就不贴动态改变input框的截图了,但是我这边已经测试成功。
在这里插入图片描述
在这里插入图片描述

4.总结:父子组件的双向绑定大概是props和emit的结合使用(专业术语我表达不好,毕竟还是个小白),主要属性名和变量名不可共用,子组件一定要监听属性值的改变,不然后面父组件改变值不会使子组件的值改变。

ps:不要嫌弃界面丑,这个只是我做的测试用的界面,不强求样式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值