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 相关文章推荐
客户端静态页面玩分页
Jun 26 Javascript
Node.js实现Excel转JSON
Apr 24 Javascript
JQuery中DOM事件合成用法实例分析
Jun 13 Javascript
JavaScript中利用Array和Object实现Map的方法
Jul 27 Javascript
使用impress.js制作幻灯片
Sep 09 Javascript
小心!AngularJS结合RequireJS做文件合并压缩的那些坑
Jan 09 Javascript
Vue.js组件tabs实现选项卡切换效果
Dec 01 Javascript
EasyUI学习之Combobox下拉列表(1)
Dec 29 Javascript
jQuery.cookie.js使用方法及相关参数解释
Mar 06 Javascript
JavaScript数组和对象的复制
Mar 21 Javascript
JS隐藏号码中间4位代码实例
Apr 09 Javascript
解决Can't find variable: SockJS vue项目的问题
Sep 22 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
js刷新框架子页面的七种方法代码
2008/11/20 Javascript
JQuery 构建客户/服务分离的链接模型中Table分页代码效率初探
2010/01/22 Javascript
js在输入框屏蔽按键,只能键入数字的示例代码
2014/01/03 Javascript
javascript作用域和闭包使用详解
2014/04/25 Javascript
Eclipse配置Javascript开发环境图文教程
2015/01/29 Javascript
jQuery实现垂直半透明手风琴特效代码分享
2015/08/21 Javascript
JavaScript实现页面跳转的方式汇总
2016/05/16 Javascript
Bootstrap3学习笔记(三)之表格
2016/05/20 Javascript
Bootstrap学习笔记之css样式设计(2)
2016/06/07 Javascript
JS去除空格和换行的正则表达式(推荐)
2016/06/14 Javascript
JavaScript使用小插件实现倒计时的方法讲解
2019/03/11 Javascript
原生js实现下拉选项卡
2019/11/27 Javascript
vue3.0 上手体验
2020/09/21 Javascript
[55:47]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第三局
2016/02/27 DOTA
[08:53]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS 选手采访
2021/03/11 DOTA
python3.0 字典key排序
2008/12/24 Python
Python实现向QQ群成员自动发邮件的方法
2014/11/19 Python
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
2015/04/24 Python
在Django中创建动态视图的教程
2015/07/15 Python
Python语言实现将图片转化为html页面
2017/12/06 Python
Python实现的读写json文件功能示例
2018/06/05 Python
Python爬虫包BeautifulSoup实例(三)
2018/06/17 Python
基于python3实现socket文件传输和校验
2018/07/28 Python
python字符串格式化方式解析
2019/10/19 Python
解决pycharm修改代码后第一次运行不生效的问题
2021/02/06 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
canvas三角函数模拟水波效果的示例代码
2018/07/03 HTML / CSS
世界上最大的餐具公司:Oneida
2016/12/17 全球购物
Book Depository亚太地区:一家领先的国际图书零售商
2019/05/05 全球购物
高三语文教学反思
2014/01/15 职场文书
岗位职责风险防控
2014/02/18 职场文书
大学生毕业评语
2014/12/31 职场文书
导游词之崇武古城
2019/10/07 职场文书
ORACLE数据库对long类型字段进行模糊匹配的解决思路
2021/04/07 Oracle
python内置模块之上下文管理contextlib
2022/06/14 Python
python如何利用cv2.rectangle()绘制矩形框
2022/12/24 Python