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 相关文章推荐
来自qq的javascript面试题
Jul 24 Javascript
DWZ刷新dialog解决方法
Mar 03 Javascript
setTimeout函数兼容各主流浏览器运行执行效果实例
Jun 13 Javascript
jQuery实现可用于博客的动态滑动菜单
Mar 09 Javascript
JavaScript中setUTCMilliseconds()方法的使用详解
Jun 12 Javascript
CSS3 3D 技术手把手教你玩转
Sep 02 Javascript
JS中showModalDialog关闭子窗口刷新主窗口用法详解
Mar 25 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
Mar 25 Javascript
Chrome调试折腾记之JS断点调试技巧
Sep 11 Javascript
使用mint-ui实现省市区三级联动效果的示例代码
Feb 09 Javascript
express 项目分层实践详解
Dec 10 Javascript
Webpack4 使用Babel处理ES6语法的方法示例
Mar 07 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
ThinkPHP控制器里javascript代码不能执行的解决方法
2014/11/22 PHP
教大家制作简单的php日历
2015/11/17 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
2015/12/25 PHP
php分页原理 分页代码 分页类制作教程
2016/09/23 PHP
php正则修正符用法实例详解
2016/12/29 PHP
CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患分析
2019/02/28 PHP
PHP实现简单用户登录界面
2019/10/23 PHP
用JSON做数据传输格式中的一些问题总结
2011/12/21 Javascript
Javascript全局变量var与不var的区别深入解析
2013/12/09 Javascript
javascript获取URL参数与参数值的示例代码
2013/12/20 Javascript
Jquery操作radio的简单实例
2014/01/06 Javascript
基于jQuery实现表单提交验证
2014/11/24 Javascript
js简单实现点击左右运动的方法
2015/04/10 Javascript
JavaScript正则表达式匹配 div  style标签
2016/03/15 Javascript
jQuery多选框选择数量限制方法
2017/02/08 Javascript
Javarscript中模块(module)、加载(load)与捆绑(bundle)详解
2017/05/28 Javascript
js编写简单的聊天室功能
2017/08/17 Javascript
使用node打造自己的命令行工具方法教程
2018/03/26 Javascript
Vue.js 实现微信公众号菜单编辑器功能(一)
2018/05/08 Javascript
详解Express笔记之动态渲染HTML(新手入坑)
2018/12/13 Javascript
AjaxFileUpload.js实现异步上传文件功能
2019/04/19 Javascript
layer.js open 隐藏滚动条的例子
2019/09/05 Javascript
如何解决jQuery 和其他JS库的冲突
2020/06/22 jQuery
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
python实现画圆功能
2018/01/25 Python
python调用c++ ctype list传数组或者返回数组的方法
2019/02/13 Python
django的ORM操作 增加和查询
2019/07/26 Python
秋季红领巾广播稿
2014/01/27 职场文书
2014年双拥工作总结
2014/11/21 职场文书
交通肇事罪辩护词
2015/05/21 职场文书
谢师宴学生致辞
2015/07/27 职场文书
虚拟机linux端mysql数据库无法远程访问的解决办法
2021/05/26 MySQL
Pytorch DataLoader shuffle验证方式
2021/06/02 Python
企业版Windows 11有哪些新功能? Win11适用于企业的功能介绍
2021/11/21 数码科技
CentOS下安装Jenkins的完整步骤
2022/04/07 Servers
如何利用python实现列表嵌套字典取值
2022/06/10 Python