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 插件 将this下的div轮番显示
Apr 09 Javascript
javascript 页面只自动刷新一次
Jul 10 Javascript
基于jquery的loading效果实现代码
Nov 05 Javascript
基于Jquery实现表格动态分页实现代码
Jun 21 Javascript
jQuery.extend 函数的详细用法
Jun 27 Javascript
利用a标签自动解析URL分析网址实例
Oct 20 Javascript
需灵活掌握的Bootstrap预定义排版类 你精通吗?
Jun 20 Javascript
vue.js中mint-ui框架的使用方法
May 12 Javascript
微信小程序实现移动端滑动分页效果(ajax)
Jun 13 Javascript
微信小程序的部署方法步骤
Sep 04 Javascript
对layui中table组件工具栏的使用详解
Sep 19 Javascript
javascript+css实现进度条效果
Mar 25 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安全配置
2006/12/06 PHP
探讨PHP删除文件夹的三种方法
2013/06/09 PHP
php+curl 发送图片处理代码分享
2015/07/09 PHP
php下载文件,添加响应头的简单实例
2016/09/22 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
2016/09/22 PHP
javascript函数库-集合框架
2007/04/27 Javascript
jquery 注意事项与常用语法小结
2010/06/07 Javascript
JS下拉框内容左右移动效果的具体实现
2013/07/10 Javascript
js的Prototype属性解释及常用方法
2014/05/08 Javascript
javascript将异步校验表单改写为同步表单
2015/01/27 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
js获取新浪天气接口的实现代码
2016/06/06 Javascript
bootstrap是什么_动力节点Java学院整理
2017/07/14 Javascript
Redux实现组合计数器的示例代码
2018/07/04 Javascript
Javascript 之封装(Package)
2018/09/14 Javascript
实例讲解JS中pop使用方法
2019/01/27 Javascript
jQuery实现简易聊天框
2020/02/08 jQuery
[12:51]71泪洒现场!是DOTA2让经典重现
2014/03/24 DOTA
Python制作爬虫采集小说
2015/10/25 Python
python3设计模式之简单工厂模式
2017/10/17 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
Django数据库连接丢失问题的解决方法
2018/12/29 Python
python使用minimax算法实现五子棋
2019/07/29 Python
余弦相似性计算及python代码实现过程解析
2019/09/18 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
2020/04/10 Python
贝玲妃英国官网:Benefit英国
2018/02/03 全球购物
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
JAVA代码查错题
2014/10/10 面试题
暑期研修感言
2014/02/17 职场文书
开学典礼决心书
2014/03/11 职场文书
洗发水广告词
2014/03/13 职场文书
小学端午节活动方案
2014/03/13 职场文书
物理分数没达标检讨书
2014/09/13 职场文书
大学生村官个人对照检查材料(群众路线)
2014/09/26 职场文书
信贷客户经理岗位职责
2015/04/09 职场文书
python调试工具Birdseye的使用教程
2021/05/25 Python