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 相关文章推荐
javascript hashtable 修正版 下载
Dec 30 Javascript
IE事件对象(The Internet Explorer Event Object)
Jun 27 Javascript
批量修改标签css样式以input标签为例
Jul 31 Javascript
深入理解Javascript中this的作用域
Aug 12 Javascript
JavaScript模拟可展开、拖动与关闭的聊天窗口实例
May 12 Javascript
Jquery uploadify 多余的Get请求(404错误)的解决方法
Jan 26 Javascript
Angular.js跨controller实现参数传递的两种方法
Feb 20 Javascript
详解使用grunt完成requirejs的合并压缩和js文件的版本控制
Mar 02 Javascript
Vue cli 引入第三方JS和CSS的常用方法分享
Jan 20 Javascript
微信小程序实现禁止分享代码实例
Oct 19 Javascript
详解JavaScript 的执行机制
Sep 18 Javascript
使用vant的地域控件追加全部选项
Nov 03 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
77A一级收信机修理记
2021/03/02 无线电
通过PHP CLI实现简单的数据库实时监控调度
2009/07/01 PHP
php下载文件源代码(强制任意文件格式下载)
2014/05/09 PHP
php实现将数组转换为XML的方法
2015/03/09 PHP
[原创]PHP实现逐行删除文件右侧空格的方法
2015/12/25 PHP
Yii2创建多界面主题(Theme)的方法
2016/10/08 PHP
返回对象在当前级别中是第几个元素的实现代码
2011/01/20 Javascript
上传的js验证(图片/文件的扩展名)
2013/04/25 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
JavaScript中 ES6 generator数据类型详解
2016/08/11 Javascript
js实现符合国情的日期插件详解
2017/01/19 Javascript
JavaScript设计模式之策略模式详解
2017/06/09 Javascript
js 中rewrap-ajax.js插件实例代码
2017/10/20 Javascript
Vue-Router模式和钩子的用法
2018/02/28 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
微信小程序class封装http代码实例
2019/08/24 Javascript
JS中==、===你分清楚了吗
2020/03/04 Javascript
Python查看多台服务器进程的脚本分享
2014/06/11 Python
在win和Linux系统中python命令行运行的不同
2016/07/03 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
2017/04/14 Python
简单实现python收发邮件功能
2018/01/05 Python
python使用tornado实现简单爬虫
2018/07/28 Python
win8下python3.4安装和环境配置图文教程
2018/07/31 Python
python实现图片筛选程序
2018/10/24 Python
对IPython交互模式下的退出方法详解
2019/02/16 Python
Flask框架学习笔记之使用Flask实现表单开发详解
2019/08/12 Python
Python操作注册表详细步骤介绍
2020/02/05 Python
Python如何安装第三方模块
2020/05/28 Python
CSS3 渐变(Gradients)之CSS3 径向渐变
2016/07/08 HTML / CSS
印度低票价航空公司:GoAir
2017/10/11 全球购物
Bandier官网:奢侈、时尚前卫的健身服装首选目的地
2020/07/05 全球购物
PHP面试题集
2016/12/18 面试题
中国梦演讲稿3分钟
2014/08/19 职场文书
小学语文继续教育研修日志
2015/11/13 职场文书
2016党员学习作风建设心得体会
2016/01/21 职场文书
Python中如何处理常见报错
2022/01/18 Python