轻松理解vue的双向数据绑定问题


Posted in Javascript onOctober 30, 2017

Vue介绍

Vue是当前很火的一款MVVM的轻量级框架,它是以数据驱动和组件化的思想构建的。因为它提供了简洁易于理解的api,使得我们很容易上手。

Vue与MVVM

如果你之前已经习惯了用jQuery操作DOM,学习Vue.js时请先抛开手动操作DOM的思维,因为Vue.js是数据驱动的,你无需手动操作DOM。Vue以数据为驱动,将自身的Dom元素与数据进行绑定,一旦创建绑定,Dom和数据保持同步。

双向绑定

主流双向数据绑定实现原理

脏值检测 : 这是AngularJS实现双向数据绑定的方式。 原理是 当数据进行变更的时候对所有Model和View的绑定关系进行一次检查,识别是否有数据进行了变更,如果有变化则进行处理,由于可能进一步引发其他数据的改变,会再次循环这个过程,知道没有数据的变化之后。发送数据到视图重新渲染。 可想而知,这样的方式性能不高。

单向数据绑定

指的是我们先把模板写好,然后把模板和数据(数据可能来自后台)整合到一起形成HTML代码,然后把这段HTML代码插入到文档流里面。
单向数据绑定缺点:HTML代码一旦生成完以后,就没有办法再变了,如果有新的数据来了,那就必须把之前的HTML代码去掉,再重新把新的数据和模板一起整合后插入到文档流中。 简单的来说就是DOM操作直接改变

数据数据双向

数据模型(Module)和视图(View)之间的双向绑定。

用户在视图上的修改会自动同步到数据模型中去,同样的,如果数据模型中的值发生了变化,也会立刻同步到视图中去。双向数据绑定的优点是无需进行和单向数据绑定的那CRUD(Create,Retrieve,Update,Delete)操作双向数据绑定最经常的应用场景就是表单了,这样当用户在前端页面完成输入后,不用任何操作,我们就已经拿到了用户的数据存放到数据模型中了。

如何使用js达到双向数据绑定

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<input type="text" id="userName">
<br>
<span id ="uName"></span>
<script>
  var obj={
    pwd:"1234"
  };
  //主要使用到了get和set方法,最为关键
  Object.defineProperty(obj,"userName",{
    get:function(){
      console.log('get init');
    },
    set:function(val){
      console.log("set init");
      document.getElementById("uName").innerText=val;
      document.getElementById("userNmae").value=val;
    }
  });
  document.getElementById("userName").addEventListener("keyup",function(event){
    obj.userName=event.target.value;
  }
  )
</script>
</body>
</html>

运行上述的dome,可以使用控制台,obj.username=123赋值,会自动触发set方法。若我们在控制台使用obj.username拿值可以触发get方法,这也就是vue的双向数据绑定的核心点。

总结

以上所述是小编给大家介绍的轻松理解vue的数据双向绑定问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
ajax 缓存 问题 requestheader
Aug 01 Javascript
Javascript基础教程之数据类型转换
Jan 18 Javascript
javascript实现在线客服效果
Jul 15 Javascript
Bootstrap响应式侧边栏改进版
Sep 17 Javascript
SelecT下拉框选中和取值的解决方法
Nov 22 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
Nov 28 Javascript
基于javascript实现数字英文验证码
Jan 25 Javascript
解决vue中虚拟dom,无法实时更新的问题
Sep 15 Javascript
vue单页面应用打开新窗口显示跳转页面的实例
Sep 21 Javascript
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
Oct 12 Javascript
Bootstrap 时间日历插件bootstrap-datetimepicker配置与应用小结
May 28 Javascript
微信小程序实现星级评价
Nov 20 Javascript
jQuery 禁止表单用户名、密码自动填充功能
Oct 30 #jQuery
移动端网页开发调试神器Eruda的介绍与使用技巧
Oct 30 #Javascript
ES6 javascript的异步操作实例详解
Oct 30 #Javascript
React Native 搭建开发环境的方法步骤
Oct 30 #Javascript
Bootstrap框架建立树形菜单(Tree)的实例代码
Oct 30 #Javascript
react实现一个优雅的图片占位模块组件详解
Oct 30 #Javascript
ES6 javascript中class类的get与set用法实例分析
Oct 30 #Javascript
You might like
php INI配置文件的解析实现分析
2011/01/04 PHP
PHP基于自定义类随机生成姓名的方法示例
2017/08/05 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
JavaScript 解析读取XML文档 实例代码
2009/07/07 Javascript
调用js时ie6和ie7,ff的区别
2009/08/19 Javascript
JS去除右边逗号的简单方法
2013/07/03 Javascript
JavaScript回调(callback)函数概念自我理解及示例
2013/07/04 Javascript
JS+DIV实现鼠标划过切换层效果的实例代码
2013/11/26 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
2015/05/11 Javascript
jQuery动画显示和隐藏效果实例演示(附demo源码下载)
2015/12/31 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
Nodejs搭建wss服务器教程
2017/05/24 NodeJs
利用canvas实现的加载动画效果实例代码
2017/07/05 Javascript
浅谈react前后端同构渲染
2017/09/20 Javascript
Nodejs 发布自己的npm包并制作成命令行工具的实例讲解
2018/05/15 NodeJs
clipboard.js在移动端复制失败的解决方法
2018/06/13 Javascript
[38:40]2018DOTA2亚洲邀请赛 4.6淘汰赛 mineski vs LGD 第一场
2018/04/10 DOTA
[43:57]Liquid vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
[55:56]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.22
2019/09/05 DOTA
Python3基础之基本运算符概述
2014/08/13 Python
python 根据正则表达式提取指定的内容实例详解
2016/12/04 Python
基于python实现名片管理系统
2018/11/30 Python
Python中的枚举类型示例介绍
2019/01/09 Python
python内打印变量之%和f的实例
2020/02/19 Python
Python实现爬取网页中动态加载的数据
2020/08/17 Python
python实现图片,视频人脸识别(opencv版)
2020/11/18 Python
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
比较基础的php面试题及答案-编程题
2012/10/14 面试题
造价工程师个人求职信
2013/09/21 职场文书
大二法学专业职业生涯规划范文
2014/02/12 职场文书
规划编制实施方案
2014/03/15 职场文书
《广玉兰》教学反思
2014/04/14 职场文书
企业宣传标语
2014/06/09 职场文书
父亲节活动策划方案
2014/08/24 职场文书
社区党支部公开承诺书
2015/04/29 职场文书
MySQL主从切换的超详细步骤
2022/06/28 MySQL