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 相关文章推荐
jQuery库与其他JS库冲突的解决办法
Feb 07 Javascript
JQuery 返回布尔值Is()条件判断方法代码
May 14 Javascript
jQuery中end()方法用法实例
Jan 08 Javascript
jQuery实现拖动调整表格单元格大小的代码实例
Jan 13 Javascript
JS+CSS实现仿触屏手机拨号盘界面及功能模拟完整实例
May 16 Javascript
AngularJS学习笔记之表单验证功能实例详解
Jul 06 Javascript
js实现水平滚动菜单导航
Jul 21 Javascript
jQuery选择器之表单元素选择器详解
Sep 19 jQuery
web前端vue filter 过滤器
Jan 12 Javascript
vue forEach循环数组拿到自己想要的数据方法
Sep 21 Javascript
javascript实现弹出层效果
Dec 10 Javascript
VSCode Vue开发推荐插件和VSCode快捷键(小结)
Aug 08 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
模板引擎Smarty深入浅出介绍
2006/12/06 PHP
php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
2010/10/22 PHP
php多功能图片处理类分享(php图片缩放类)
2014/03/14 PHP
php缩放gif和png图透明背景变成黑色的解决方法
2014/10/14 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
2014/12/17 PHP
调试php程序的简单步骤
2019/10/04 PHP
在textarea文本域中显示HTML代码的方法
2007/03/06 Javascript
刷新时清空文本框内容的js代码
2007/04/23 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
使用POST方式弹出窗口的两种方法示例介绍
2014/01/29 Javascript
点击button获取text内容并改变样式的js实现
2014/09/09 Javascript
javascript中bind函数的作用实例介绍
2014/09/28 Javascript
JQuery实现可直接编辑的表格
2015/04/16 Javascript
详解JavaScript编程中的数组结构
2015/10/24 Javascript
JavaScript基础语法之js表达式
2016/06/07 Javascript
将json转换成struts参数的方法
2016/11/08 Javascript
详解AngularJs路由之Ui-router-resolve(预加载)
2017/06/13 Javascript
微信小程序 同步请求授权的详解
2017/08/04 Javascript
vue生成token保存在客户端localStorage中的方法
2017/10/25 Javascript
实例讲解javascript实现异步图片上传方法
2017/12/05 Javascript
十分钟教你上手ES2020新特性
2020/02/12 Javascript
详细分析Node.js 模块系统
2020/06/28 Javascript
Jquery使用each函数实现遍历及数组处理
2020/07/14 jQuery
Python安装及Pycharm安装使用教程图解
2019/09/20 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
keras之权重初始化方式
2020/05/21 Python
Python 的 __str__ 和 __repr__ 方法对比
2020/09/02 Python
Python基于Faker假数据构造库
2020/11/30 Python
CSS3实现粒子旋转伸缩加载动画
2016/04/22 HTML / CSS
Chi Chi London官网:购买连衣裙和礼服
2020/10/25 全球购物
村委会换届选举方案
2014/05/03 职场文书
拆迁委托协议书
2014/09/15 职场文书
2015年外贸业务员工作总结范文
2015/05/23 职场文书
python3 sqlite3限制条件查询的操作
2021/04/07 Python
仅仅使用 HTML/CSS 实现各类进度条的方式汇总
2021/11/11 HTML / CSS
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript