位置: IT常识 - 正文

【Vue2从入门到精通】详解Vue数据双向绑定原理及手动实现双向绑定(vue2-elm)

编辑:rootadmin
【Vue2从入门到精通】详解Vue数据双向绑定原理及手动实现双向绑定 文章目录✨什么是数据双向绑定✨数据双向绑定的原理✨Vue数据双向绑定原理✨实现数据双向绑定的步骤✨手动实现自定义组件的双向绑定的步骤✨写在最后

推荐整理分享【Vue2从入门到精通】详解Vue数据双向绑定原理及手动实现双向绑定(vue2-elm),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue2教程,vue 入门,vue2-elm,vue2-elm,vue2.0教程,vue2.,vue2教程,vue2-elm,内容如对您有帮助,希望把文章链接给更多的朋友!

✨什么是数据双向绑定

我们先从单向绑定切入单向绑定非常简单,就是把Model绑定到View。

什么是双向绑定呢?当我们用JavaScript代码更新Model时,View就会自动更新,在单向绑定的基础上,用户更新了View,Model的数据也自动被更新了,这种情况就是双向绑定。

✨数据双向绑定的原理

数据双向绑定的原理之前,我们先来了解一下什么是MVVM。

MVVM是一种设计思想,它是Model-View-ViewModel的缩写。它也是MVC的增强版。

Model是代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑。View是代表UI组件,它负责将数据模型转化成UI展现出来。ViewModel是一个同步View和Model的对象。

ViewModel的主要职责:

数据变化后更新视图视图变化后更新数据

当然,它还有两个主要部分组成

监听器(Observer):对所有数据的属性进行监听解析器(Compiler):对每个元素节点的指令进行扫描跟解析,根据指令模板替换数据,以及绑定相应的更新函数✨Vue数据双向绑定原理

Vue是采用数据劫持结合发布者-订阅者模式的方式,通过使用ES5中的Object.defineProperty()方法来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调来渲染视图。

Object.defineProperty()允许在对象上定义新的属性,以及修改或删除现有属性的特性,其中包括get、set、enumerable和configurable等。

【Vue2从入门到精通】详解Vue数据双向绑定原理及手动实现双向绑定(vue2-elm)

✨实现数据双向绑定的步骤创建Vue实例时,在data属性中定义需要双向绑定的数据。在模板中使用v-model指令将输入控件绑定到数据属性上。 在Vue内部,使用Object.defineProperty()方法将数据属性转换为getter/setter形式,从而实现数据的响应式变化。当输入控件的值发生变化时,Vue会自动调用数据属性的setter方法,从而更新数据的值。当数据的值发生变化时,Vue会自动更新相关的DOM元素,从而实现数据与视图的双向绑定。

示例代码如下:

html

<div id="app"> <input v-model="message"> <p>{{ message }}</p></div>

javascript

var vm = new Vue({ el: '#app', data: { message: '' }});

在上面的代码中,v-model指令将输入框和message属性进行了双向绑定。当输入框的值发生变化时,message属性的setter方法会被调用,从而更新数据。当message属性的值发生变化时,相关的DOM元素也会自动更新,从而实现了数据与视图的双向绑定。

需要注意的是,Vue的双向绑定仅适用于一些特定的输入控件,如input、textarea和select等。对于自定义组件,需要手动实现数据的双向绑定。

如何手动实现数据的双向绑定呢?请继续往下看。

✨手动实现自定义组件的双向绑定的步骤在自定义组件中,通过props属性接收父组件传递的数据,并在组件中定义一个内部变量来保存这些数据。在组件内部使用v-model指令将输入控件绑定到内部变量上。在组件内部监听输入控件的变化事件,并在事件处理函数中更新内部变量的值。在组件内部通过$emit()方法触发一个自定义事件,并将内部变量作为参数传递给父组件。在父组件中使用自定义事件的处理函数来更新父组件中的数据。

示例代码如下:

<!-- 父组件 --><template> <div> <my-component v-model="message"></my-component> <p>{{ message }}</p> </div></template><script> import MyComponent from './MyComponent.vue'; export default { components: { 'my-component': MyComponent }, data() { return { message: '' } } }</script><!-- 自定义组件 --><template> <div> <input type="text" v-model="internalValue"> </div><template><script> export default { props: ['value'], data() { return { internalValue: '' } }, mounted() { this.internalValue = this.value; }, watch: { internalValue() { this.$emit('input', this.internalValue); } } }</script>

在上面的代码中,我们定义了一个名为value的props属性来接收父组件传递的数据,同时定义了一个名为internalValue的内部变量来保存这些数据。在组件挂载后,我们将value的值赋值给internalValue。

在组件内部使用v-model指令将输入控件绑定到internalValue上。当输入控件的值发生变化时,我们使用watch来监听internalValue的变化事件,并在事件处理函数中使用$emit()方法触发一个名为input的自定义事件,并将internalValue作为参数传递给父组件。

在父组件中,我们可以通过v-model指令将message属性与自定义组件的value属性进行双向绑定。当自定义组件的input事件被触发时,我们可以在事件处理函数中将事件的参数作为message属性的值进行更新。

示例代码如下:

<!-- 父组件 --><template> <div> <my-component v-model="message"></my-component> <p>{{ message }}</p> </div></template><script> import MyComponent from './MyComponent.vue'; export default { components: { 'my-component': MyComponent }, data() { return { message: '' } } }</script><!-- 自定义组件 --><template> <div> <input type="text" v-model="internalValue"> </div></template><script> export default { props: ['value'], data() { return { internalValue: '' } }, mounted() { this.internalValue = this.value; }, watch: { internalValue() { this.$emit('input', this.internalValue); } } }</script>

在上面的代码中,我们定义了一个名为message的数据属性,并将它与自定义组件的value属性进行了双向绑定。

同时,在自定义组件中,我们实现了数据的双向绑定,并通过$emit()方法触发了一个名为input的自定义事件来与父组件进行通信。这样就实现了自定义组件的双向绑定。

✨写在最后✨ 原创不易,希望各位大佬多多支持。👍 点赞,你的认可是我创作的动力。⭐️ 收藏,感谢你对本文的喜欢。✏️ 评论,你的反馈是我进步的财富。
本文链接地址:https://www.jiuchutong.com/zhishi/300665.html 转载请保留说明!

上一篇:es6新增哪些特性(es6特性及使用场景)

下一篇:jQuery 获取与设置 元素属性【一篇文章轻松拿下】(jquery获取值的几种方法)

  • 离线码和健康码有什么区别(离线码和健康码有什么区别照片)

    离线码和健康码有什么区别(离线码和健康码有什么区别照片)

  • 苹果手机怎么图片识别文字(苹果手机怎么图片编辑)

    苹果手机怎么图片识别文字(苹果手机怎么图片编辑)

  • 荣耀x10是否有呼吸灯呢(荣耀x10是否有呼吸灯功能)

    荣耀x10是否有呼吸灯呢(荣耀x10是否有呼吸灯功能)

  • 如何设置输入法(如何设置输入法快捷键)

    如何设置输入法(如何设置输入法快捷键)

  • 拼多多618活动什么时候开始(拼多多618活动什么时候开始力度大)

    拼多多618活动什么时候开始(拼多多618活动什么时候开始力度大)

  • 电脑更新要多久(电脑怎么更新系统)

    电脑更新要多久(电脑怎么更新系统)

  • 抖音发朋友圈怎么不清晰(抖音发朋友圈怎么发完整版)

    抖音发朋友圈怎么不清晰(抖音发朋友圈怎么发完整版)

  • 亲情号码怎么设置(亲情号码怎么设置OPPO)

    亲情号码怎么设置(亲情号码怎么设置OPPO)

  • 墨墨背单词封号了怎么办(墨墨背单词封号解封)

    墨墨背单词封号了怎么办(墨墨背单词封号解封)

  • 苹果设置来电关机状态(苹果设置来电关闭闪光灯)

    苹果设置来电关机状态(苹果设置来电关闭闪光灯)

  • mfd是什么格式(mfd是什么格式的文件)

    mfd是什么格式(mfd是什么格式的文件)

  • 手机可以设置儿童模式吗(手机设置打开)

    手机可以设置儿童模式吗(手机设置打开)

  • ipad支持快充吗(苹果2019款ipad支持快充吗)

    ipad支持快充吗(苹果2019款ipad支持快充吗)

  • 文档中画出的直线怎么变色(文档中画出的直线怎么画)

    文档中画出的直线怎么变色(文档中画出的直线怎么画)

  • 苹果手机死机怎么办(苹果手机死机了屏幕动不了无法重启)

    苹果手机死机怎么办(苹果手机死机了屏幕动不了无法重启)

  • word文档打印页面设置(word文档打印页面显示不全)

    word文档打印页面设置(word文档打印页面显示不全)

  • 苹果11是什么材质的机身(苹果11是什么材质的边框)

    苹果11是什么材质的机身(苹果11是什么材质的边框)

  • 手机流量ip地址固定吗(手机流量ip地址查询位置)

    手机流量ip地址固定吗(手机流量ip地址查询位置)

  • 土星五号为什么不用了(土星五号为什么不造了)

    土星五号为什么不用了(土星五号为什么不造了)

  • 小米9发热严重吗(小米9发热严重怎么回事)

    小米9发热严重吗(小米9发热严重怎么回事)

  • 抖音看过的视频有记录吗(抖音看过的视频在哪里能找到)

    抖音看过的视频有记录吗(抖音看过的视频在哪里能找到)

  • r15屏幕分辨率设置(r15屏幕分辨率多少)

    r15屏幕分辨率设置(r15屏幕分辨率多少)

  • 一接通电源就自动开机(一接通电源就自动关机)

    一接通电源就自动开机(一接通电源就自动关机)

  • 高德地图的2种引入方式(高德地图的2种导航方式)

    高德地图的2种引入方式(高德地图的2种导航方式)

  • 运输发票税率是9
  • 公司向个人借款是否合法
  • 预付账款和应付账款的区别
  • 应交税费贷方发生额表示什么金额
  • 差额征税怎么填写申报表
  • 劳务派遣用工的岗位只能在哪些工作岗位上实施
  • 增值税申报表更正情况说明怎么写
  • 进项税有余额但没有余额
  • 职工福利费计提比例一般是多少
  • 工程维修费用怎么入账
  • 新会计准则有预提费用吗
  • 代交社保费会计账务处理
  • 应付税款法账务处理
  • 个体各商户的社保
  • 报废固定资产增值税税率
  • 增资的印花税纳税义务时间
  • 网上银行转账被骗能追回吗
  • 经营用的固定资产
  • 个体工商户交企业所得
  • 一般纳税人问题
  • 安全库存的三种算法
  • 外贸出口换汇成本怎么计算
  • 开出去的发票没有进项发票应怎么核算成本?
  • 销售产品库存商品怎么减
  • PHP:apache_reset_timeout()的用法_Apache函数
  • 注销库存股的会计分录怎么理解
  • uniapp页面loading
  • 漏记收入 罚款
  • 借入资金一般采用借入()进行
  • php进程太多
  • 红字发票步骤
  • 未认证用户是什么意思
  • 增值税纳税申报表在哪里打印
  • 收入凭证填写
  • torch.nn.Conv3d
  • php远程访问
  • 集团公司对子公司的内部审计
  • 零申报的申报表怎么填
  • 公路修路步骤
  • 电缆租赁发票开具属于什么项目
  • 物价变动的影响因素
  • 开工程款发票有什么规定?
  • 年金现值和终值的计算
  • 个别计价法和先进先出法的相同点
  • 企业开办费如何在税前扣除
  • 公司福利可以发现金吗
  • 发票开9个点
  • 查看、修改mysql的用户名和密码
  • 建筑工程企业人才优势怎么写
  • 处置无形资产属于投资活动吗
  • 跨年度少计摊销怎么做账
  • 如何计算生产费用
  • 私企固定资产报废程序
  • 高速过路费发票图片
  • 期末结转生产成本的账户
  • 建筑企业预缴增值税款
  • 不动产分期抵扣表数据
  • 一般纳税人企业所得税政策最新2023
  • 汇算清缴要补交0.01怎么调成0
  • 利润表每股收益增加说明什么
  • 明细账要如何做账
  • SQL SELECT 语句的表连接
  • windowxp怎么改ip地址
  • windows8如何安装
  • linux交换空间的作用
  • 最小化安装centos7怎么装图形界面
  • WinCinemaMgr.exe - WinCinemaMgr是什么进程
  • dvd rom drive bbs priorities
  • win8任务栏图标太大了
  • win7系统通知
  • 什么是从零开始
  • Node.js中的什么模块是用于处理文件和目录的
  • android javascript 混淆配置。
  • JavaScript浏览器扩展
  • Windows环境下搭建Python开发环境的方法
  • python多进程共享对象
  • 运输服务费税率9%还是6%
  • 福建省茶叶协会会长名单
  • 从印度往中国邮寄药品
  • 白酒生产企业向百货公司销售试制药酒
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设