vue响应式更新机制及不使用框架实现简单的数据双向绑定问题


Posted in Javascript onJune 27, 2019

最近看到有些人说vue是双向数据绑定的,有些人说vue是单向数据流的,我认为这两种说法都是错误的,vue是一款具有响应式更新机制的框架,既可以实现单向数据流也可以实现数据的双向绑定。

2 单向数据流与数据双向绑定

单向数据流是指model中的数据发生改变时引起view的改变。

vue响应式更新机制及不使用框架实现简单的数据双向绑定问题

双向数据绑定是指model中的数据发生改变时view的改变,view的改变也会引起model的改变。

vue响应式更新机制及不使用框架实现简单的数据双向绑定问题

//这个是单向数据流,改变这个input的value值并不能是data中的text属性发生改变。
<input type="text" :value="text">
data:{
  return {
    text:'文本输入框'
  }
}
//这个是双向数据绑定,无论是修改model还是修改view都能引起另一方的改变。
<input type="text" v-model="text">
data:{
  return {
    text:'文本输入框'
  }
}

3 vue中的数据双向绑定实现原理

vue给我们提供了实现数据双向绑定的两种语法糖,分别v-model和.sync修饰符,v-model用于为表单元素提供数据双向绑定,.sync修饰符用于为任意属性提供数据双向绑定,接下来我们来尝试不使用vue提供的语法糖,自己实现数据双向绑定。

要想view发生改变的时候引起model的改变首先要监听到view的改变,view发生改变时再去改变model,有了思路之后下面是代码实现。

//首先通过input事件监听视图的改变
<input type="text" :value="inputTitle" @input="onInput">
data:{
  return {
    text:'文本输入框'
  }
},
methods:{
  //视图发生改变的时候,将视图的值赋予模型的值,实现数据双向绑定
  onInput(event) {
    this.text=event.target.value;
  }
}

4 vue中的单向数据流实现原理

vue的单向数据流涉及到Object.defineProperty()这个API。

Object.defineProperty用法:

//Object.defineProperty用于数据劫持,可以监听一个变量的读取与写入,并在发生读取与写入的时候执行回调函数
Object.defineProperty(obj,prop,desc);
//obj是要定义的对象,prop是要定义的属性名,desc是属性的描述符

举例:

//定义一个对象并监听他的text属性的存值操作与取值操作
let data={};
Object.defineProperty(data,'text',{
  get() {
    console.log('取值操作');
  },
  set(newVal) {
    console.log('存值操作');
  }
});
console.log('data');
===>输出:
===>{}
===>取值操作
data.text='文本输入框';
===>输出
===>存值操作

有了Object.defineProperty()这个API就可以监听model中数据的改变并在数据改变的时候修改视图达到单向数据流的效果。

5 实现一个简易的数据双向绑定

下面实现一个简易的数据双向绑定,目标是在修改view可以使model中的变量发生改变,修改model可以使视图发生改变。

//html
<div id="app">
  <input type="text" id="input">
</div>
//js
let input = document.querySelector('#input');
//定义model
let data={
  text:''
};
//监听model中text的变化,首先实现数据单向流
Object.defineProperty(data,text,{
  get() {
  
  },
  //text发生改变的时候,修改input元素的value值 
  set(newVal) {
    input.value=newVal;
  }
});
//监听input元素的改变并修改model的值,实现数据双向绑定
input.addEventLisener('input',event=> {
  data.text=event.target.value;
});

至此就实现了简易的数据双向绑定,可以在控制台中修改data.text的值来查看视图是否发生改变,修改input元素的值在控制台中打印data.text查看model是否发生改变。

总结

以上所述是小编给大家介绍的vue响应式更新机制及不使用框架实现简单的数据双向绑定问题 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
web开发人员学习jQuery的6大理由及jQuery的优势介绍
Jan 03 Javascript
jQuery.Validate验证库的使用介绍
Apr 26 Javascript
qq悬浮代码(兼容各个浏览器)
Jan 29 Javascript
使用jquery实现放大镜效果
Sep 02 Javascript
DOM 事件流详解
Jan 20 Javascript
基于jquery实现鼠标左右拖动滑块滑动附源码下载
Dec 23 Javascript
jQuery插件autocomplete使用详解
Feb 04 Javascript
关于Angular2 + node接口调试的解决方案
May 28 Javascript
js 毫秒转天时分秒的实例
Nov 17 Javascript
微信小程序时间控件picker view使用详解
Dec 28 Javascript
element-ui组件中input等的change事件中传递自定义参数
May 22 Javascript
详解Js模块化的作用原理和方案
Apr 29 Javascript
微信小程序实现form表单本地储存数据
Jun 27 #Javascript
ES6 class的应用实例分析
Jun 27 #Javascript
ES6 Promise对象的应用实例分析
Jun 27 #Javascript
使用Vue 实现滑动验证码功能
Jun 27 #Javascript
js变量值传到php过程详解 将php解析成数据
Jun 26 #Javascript
javascript触发模拟鼠标点击事件
Jun 26 #Javascript
JavaScript动态添加数据到表单并提交的几种方式
Jun 26 #Javascript
You might like
PHP用SAX解析XML的实现代码与问题分析
2011/08/22 PHP
PHP获取浏览器信息类和客户端地理位置的2个方法
2014/04/24 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
关于JS中的闭包浅谈
2013/08/23 Javascript
js 3种归并操作的实例代码
2013/10/30 Javascript
DOM基础教程之事件类型
2015/01/20 Javascript
javascript中mouseover、mouseout使用详解
2015/07/19 Javascript
基于jquery实现即时检查格式是否正确的表单
2016/05/06 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/15 Javascript
JavaScript循环_动力节点Java学院整理
2017/06/28 Javascript
javascript原生封装一个淡入淡出效果的函数测试实例代码
2018/03/19 Javascript
Vue表单类的父子组件数据传递示例
2018/05/03 Javascript
puppeteer库入门初探
2019/01/09 Javascript
[01:14:55]EG vs Spirit Supermajor 败者组 BO3 第三场 6.4
2018/06/05 DOTA
python实现的解析crontab配置文件代码
2014/06/30 Python
用python找出那些被“标记”的照片
2017/04/20 Python
Selenium定位元素操作示例
2018/08/10 Python
pytorch 预训练层的使用方法
2019/08/20 Python
django中media媒体路径设置的步骤
2019/11/15 Python
Python一行代码解决矩阵旋转的问题
2019/11/30 Python
150行Python代码实现带界面的数独游戏
2020/04/04 Python
Python如何把十进制数转换成ip地址
2020/05/25 Python
Python中的面向接口编程示例详解
2021/01/17 Python
HTML5 WebGL 实现民航客机飞行监控系统
2019/07/25 HTML / CSS
html5配合css3实现带提示文字的输入框(摆脱js)
2013/03/08 HTML / CSS
加拿大休闲和工业服装和鞋类零售商:L’Équipeur
2018/01/12 全球购物
英国拖鞋购买网站:Bedroom Athletics
2020/02/28 全球购物
神话般的珠宝:Ross-Simons
2020/07/13 全球购物
企业项目策划书
2014/01/11 职场文书
《我为你骄傲》教学反思
2014/02/20 职场文书
读书活动总结范文
2014/04/26 职场文书
投标诚信承诺书
2014/05/26 职场文书
社区法制宣传日活动总结
2015/05/05 职场文书
2015年政教主任工作总结
2015/07/23 职场文书
开业庆典嘉宾致辞
2015/08/01 职场文书
JavaScript 对象创建的3种方法
2021/11/17 Javascript