vue自定义组件是怎么实现双向绑定的,有哪些要点
Admin 2022-06-01 群英技术资讯 1403 次浏览
这篇文章给大家分享的是“vue自定义组件是怎么实现双向绑定的,有哪些要点”,对大家学习和理解有一定的参考价值和帮助,有这方面学习需要的朋友,接下来就跟随小编一起学习一下吧。场景:
我们比较常用的父子组件之间的交互方式:
父组件通过props将数据流入到子组件;
子组件通过$emit将更新后的数组发送的父组件;
今天,我们通过另一种方式实现交互,参考input框的v-model,实现自定义组件的双向数据绑定。
即:父组件值改变,子组件的值跟着改变;反之,子组件值发生变化,父组件值随之变化
子组件定义:
由于不能直接修改props属性值,我们这里定义valueData,通过监听实时接收value值,通过click方法修改valueData。
这里注意model语法糖prop 是接收的props属性value,保持一致。event是先上传递的事件名。
代码如下:
<template>
<div>
<div>{{ `子组件值: ${value}` }}</div>
<div @click="click">点击此处修改值</div>
</div>
</template>
<script>
export default {
name: "",
model: {
prop: "value",
event: "change"
},
props: {
value: Number
},
components: {},
data() {
return {
valueData: ""
};
},
watch: {
value(newValue, oldValue) {
this.valueData = newValue;
console.log(`子组件值:${newValue}`);
}
},
created() {
},
mounted() {
},
methods: {
click() {
this.valueData++;
this.$emit("change", this.valueData);
}
}
};
</script>
<style lang='less' scoped>
</style>
父组件定义:
父组件通过v-model绑定text值,名称不一定是value,可以是其他任意符合命名规范的字符串,这里是text。
子组件通过change事件更新数据后,v-mode绑定值随之变化。
或者父组件修改text值后,子组件value值随之变化。
代码如下:
<template>
<div>
<div>{{ `父组件值:${text}` }}</div>
<div @click="click">点击此处修改值</div>
<span>-----------------------------------------------------------</span>
<test-children v-model="text"></test-children>
</div>
</template>
<script>
import TestChildren from "@/views/TestChildren";
export default {
name: "",
components: { TestChildren },
data() {
return {
text: 1
};
},
created() {
},
mounted() {
},
watch: {
text(newValue, oldValue) {
console.log(`父组件值:${newValue}`);
}
},
methods: {
click() {
this.text--;
}
}
};
</script>
<style lang='less' scoped>
</style>
结果:
直接copy代码到自己项目测试。无论是通过父组件改变值,还是子组件改变值。两个组件通过v-mode绑定的值始终保持一致。
答疑:
有同学就问了 ,这不是和通过props向下流入数据,再通过$emit方式向上传递数据一样么也能实现我这种双向绑定的效果。 其实不然,如果不通过v-model,那么我们势必会在父组件写这样的代码:
<test-children @change="changeText"></test-children>
然后在通过定义changeText方法修改text值。
试想,当我们的页面比较复杂,引用组件量比较庞大,页面中就需要多定义这样十几、二十几个方法。可阅读行大大降低,增加了维护成本。
扩展:
vue2.3之后提供了sync方式,也能实现双向绑定
父组件中的写法:
<test-children :value.sync="text"></test-children>
子组件中不需要使用下面model定义,直接删除即可。
model: {
prop: “value”,
event: “change”
},
向父组件传递数据使用如下方式:
this.$emit("update:value", this.valueData);
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了如何实现无感刷新token,当token过期的时候,刷新token,前端需要做到无感刷新token,即刷token时要做到用户无感知,避免频繁登录。下面我们大家一起进入文章看看实现思路即详细内容,需要的朋友可以参考一下
本篇文章给大家带来了关于JavaScript的相关知识,其中主要整理了日期对象Date的相关问题,包括了Date对象的创建、Date对象的方法等等内容,下面一起来看一下,希望对大家有帮助。
本篇文章带大家了解一下RPC通信,介绍一下RPC和Ajax的相同点和不同点,希望对大家有所帮助!
es6新增加了一个运算符,叫做扩展运算符,这个运算符用在数组前面,会把数组展开变成各个独立的值,这篇文章主要给大家介绍了关于ES6扩展运算符的相关资料,需要的朋友可以参考下
本篇文章整理总结了一些基于jQuery的前端面试来分享给大家,里面jQuery的常见面试问题,以及移动端常见问题,希望对大家有所帮助!
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008