浅析js中mvvm模式实现的原理


Posted in Javascript onOctober 06, 2018

以Vue.js框架为例子,使用的mvvm模式

浅析js中mvvm模式实现的原理

view指的是页面的html和css构成的视图。

model指的是从后端取到的数据模型

viewmodel 指的是前端开发人员组织生成和维护的视图数据层。这一层包含的是视图行为和数据。

视图行为指的是如页面加载进来时请求什么,将指定的数据放到指定的元素上,点击某个元素触发某事件。当viewmodel处理好后则会将对应的数据展现到view层。

MVVM模式的优点在于当view和viewmodel的双向绑定,当数据改变后不需要改修改DOM结构。

例如原生js实现一个input的值绑定另一个div的文本,首先需要监听input事件,每次改变触发一次div节点的文本子节点进行修改。使用了MVVM模式则可以自动检测到数据的改变从而修改div文本

mvvm的实现原理:利用Object.defineProperty(),该方法有get、set两个属性方法,从而获取对象属性的值,给对象属性重新赋值

//定义一个对象

let obj = {}

Object.defineProperty(obj,'txt'{

  //obj.txt属性赋值方法,同时为input、p文本赋同一个值

  set(val){

    document.getElementById('input').value = val

    document.getElementById('output').innerHTML = val

  },

  //获取txt属性的方法

  get(){

    return obj;

  }

})

//监听事件 触发的时候会给obj.txt重新赋值,从而实现双向绑定

 document.addEventListener('keyup',(e)=>{

  obj.txt = e.target.value;

 })
Javascript 相关文章推荐
javascript加号"+"的二义性说明
Mar 04 Javascript
Javascript基础 函数“重载” 详细介绍
Oct 25 Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
Nov 25 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
Aug 27 Javascript
Angular.JS内置服务$http对数据库的增删改使用教程
May 07 Javascript
解决React Native端口号修改的方法
Jul 28 Javascript
原生javascript实现的全屏滚动功能示例
Sep 19 Javascript
js捆绑TypeScript声明文件的方法教程
Apr 13 Javascript
angularjs使用div模拟textarea文本框的方法
Oct 02 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
Mar 28 Javascript
vue实现密码显示与隐藏按钮的自定义组件功能
Apr 23 Javascript
vue3.0生命周期的示例代码
Sep 24 Javascript
js for终止循环 跳出多层循环
Oct 04 #Javascript
iView-admin 动态路由问题的解决方法
Oct 03 #Javascript
Angular resolve基础用法详解
Oct 03 #Javascript
解决angularjs service中依赖注入$scope报错的问题
Oct 02 #Javascript
angular.js实现列表orderby排序的方法
Oct 02 #Javascript
Angularjs实现数组随机排序的方法
Oct 02 #Javascript
解决angular双向绑定无效果,ng-model不能正常显示的问题
Oct 02 #Javascript
You might like
关于手调机和数调机的选择
2021/03/02 无线电
深入php self与$this的详解
2013/06/08 PHP
php反射类ReflectionClass用法分析
2016/05/12 PHP
php 开发中加密的几种方法总结
2017/03/22 PHP
Yii框架布局文件的动态切换操作示例
2019/11/11 PHP
JavaScript 组件之旅(三):用 Ant 构建组件
2009/10/28 Javascript
javascript中onclick(this)用法介绍
2013/04/19 Javascript
js window.print实现打印特定控件或内容
2013/09/16 Javascript
jQuery中siblings()方法用法实例
2015/01/08 Javascript
使用C++为node.js写扩展模块
2015/04/22 Javascript
使用JavaScript实现旋转的彩圈特效
2015/06/23 Javascript
javascript 判断页面访问方式电脑或者移动端
2016/09/19 Javascript
详细讲解JavaScript中的this绑定
2016/10/10 Javascript
手机软键盘弹出时影响布局的解决方法
2016/12/15 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
Webpack中css-loader和less-loader的使用教程
2017/04/27 Javascript
微信小程序实现默认第一个选中变色效果
2018/07/17 Javascript
vue slot与传参实例代码讲解
2019/04/28 Javascript
纯js+css实现在线时钟
2020/08/18 Javascript
[01:12:53]完美世界DOTA2联赛PWL S2 Forest vs SZ 第一场 11.25
2020/11/26 DOTA
Pyramid将models.py文件的内容分布到多个文件的方法
2013/11/27 Python
详解Python使用simplejson模块解析JSON的方法
2016/03/24 Python
用tensorflow构建线性回归模型的示例代码
2018/03/05 Python
PyCharm在新窗口打开项目的方法
2019/01/17 Python
python 字典有序并写入json文件过程解析
2019/09/30 Python
python代码打印100-999之间的回文数示例
2019/11/24 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
在 Windows 下搭建高效的 django 开发环境的详细教程
2020/07/27 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
app内嵌H5 webview 本地缓存问题的解决
2020/10/19 HTML / CSS
“型”走纽约上东区:Sam Edelman
2017/04/02 全球购物
中文师范生自荐信
2014/01/30 职场文书
六查六看心得体会
2014/10/14 职场文书
护士工作心得体会
2016/01/25 职场文书
《勇者辞职不干了》上卷BD发售宣传CM公开
2022/04/08 日漫
Python采集爬取京东商品信息和评论并存入MySQL
2022/04/12 Python