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 相关文章推荐
window.open被浏览器拦截后的自定义提示效果代码
Nov 19 Javascript
用js脚本控制asp.net下treeview的NodeCheck的实现代码
Mar 02 Javascript
extjs之去除s.gif的影响
Dec 25 Javascript
Javascript对象中关于setTimeout和setInterval的this介绍
Jul 21 Javascript
javascript窗口宽高,鼠标位置,滚动高度(详细解析)
Nov 18 Javascript
使用jQuery在移动页面上添加按钮和给按钮添加图标
Dec 04 Javascript
简述JavaScript提交表单的方式 (Using JavaScript Submit Form)
Mar 18 Javascript
基于jQuery实现页面搜索功能
Mar 26 Javascript
HTML页面,测试JS对C函数的调用简单实例
Aug 09 Javascript
js创建对象几种方式的优缺点对比
Sep 28 Javascript
浅谈ajax在jquery中的请求和servlet中的响应
Jan 22 jQuery
JS中async/await实现异步调用的方法
Aug 28 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/08 PHP
PHP 数组遍历方法大全(foreach,list,each)
2010/06/30 PHP
PHP通过header实现文本文件下载的代码
2010/08/08 PHP
PHP APC缓存配置、使用详解
2014/03/06 PHP
php读取mssql的ntext字段返回值为空的解决方法
2014/12/30 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
2019/10/12 PHP
利用jQuery 实现GridView异步排序、分页的代码
2010/02/06 Javascript
dojo学习第二天 ajax异步请求之绑定列表
2011/08/29 Javascript
javascript中typeof的使用示例
2013/12/19 Javascript
简要了解jQuery移动web开发的响应式布局设计
2015/12/04 Javascript
javascript单页面手势滑屏切换原理详解
2016/03/21 Javascript
JS Attribute属性操作详解
2016/05/19 Javascript
JS常用字符串方法(推荐)
2021/01/15 Javascript
微信小程序开发之麦克风动画 帧动画 放大 淡出
2017/04/18 Javascript
微信小程序封装http访问网络库实例代码
2017/05/24 Javascript
JavaScript实现职责链模式概述
2018/01/25 Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
2018/05/28 jQuery
js异步上传多张图片插件的使用方法
2018/10/22 Javascript
Vue 使用Props属性实现父子组件的动态传值详解
2019/11/13 Javascript
vue elementui 实现搜索栏公共组件封装的实例代码
2020/01/20 Javascript
[01:38]2018DOTA2亚洲邀请赛主赛事第二日现场采访 神秘商人痛陈生计不易
2018/04/05 DOTA
Python实现SQL注入检测插件实例代码
2019/02/02 Python
DJango的创建和使用详解(默认数据库sqlite3)
2019/11/18 Python
详解pandas.DataFrame.plot() 画图函数
2020/06/14 Python
python批量修改交换机密码的示例
2020/09/22 Python
Jupyter notebook命令和编辑模式常用快捷键汇总
2020/11/17 Python
python 简单的调用有道翻译
2020/11/25 Python
让ie浏览器成为支持html5的浏览器的解决方法(使用html5shiv)
2014/04/08 HTML / CSS
西班牙太阳镜品牌:Hawkers
2018/03/11 全球购物
大学自我评价
2014/02/12 职场文书
施工安全责任书
2014/04/14 职场文书
无财产离婚协议书范本
2014/10/28 职场文书
2015年幼儿园元旦亲子活动方案
2014/12/09 职场文书
500字作文之周记
2019/12/13 职场文书
vue+elementUI实现表格列的显示与隐藏
2022/04/13 Vue.js