浅析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 相关文章推荐
收集的一些Array及String原型对象的扩展实现代码
Dec 05 Javascript
Extjs gridpanel 出现横向滚动条问题的解决方法
Jul 04 Javascript
JavaScript中数组的排序、乱序和搜索实现代码
Nov 30 Javascript
『JavaScript』限制Input只能输入数字实现思路及代码
Apr 22 Javascript
javascript之typeof、instanceof操作符使用探讨
May 19 Javascript
读取input:file的路径并显示本地图片的方法
Sep 23 Javascript
javascript通过获取html标签属性class实现多选项卡的方法
Jul 27 Javascript
关于Vue的路由权限管理的示例代码
Mar 06 Javascript
javascript原生封装一个淡入淡出效果的函数测试实例代码
Mar 19 Javascript
微信小程序实现人脸检测功能
May 25 Javascript
scrapyd schedule.json setting 传入多个值问题
Aug 07 Javascript
vue-video-player视频播放器使用配置详解
Oct 23 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
Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
2008/10/13 PHP
PHP 基于文件头的文件类型验证类函数
2012/05/01 PHP
php读取目录所有文件信息dir示例
2014/03/18 PHP
Javascript hasOwnProperty 方法 & in 关键字
2008/11/26 Javascript
用JavaScript实现单继承和多继承的简单方法
2009/03/29 Javascript
javascript Firefox与IE 替换节点的方法
2010/02/24 Javascript
jQueryUI如何自定义组件实现代码
2010/11/14 Javascript
jQuery实现可展开合拢的手风琴面板菜单
2015/09/15 Javascript
jQuery插件支持同一页面被多次调用
2016/02/14 Javascript
BootStrap网页中代码显示用法详解
2016/10/21 Javascript
JavaScript给每一个li节点绑定点击事件的实现方法
2016/12/01 Javascript
JS判断鼠标进入容器的方向与window.open新窗口被拦截的问题
2016/12/23 Javascript
深入理解在JS中通过四种设置事件处理程序的方法
2017/03/02 Javascript
Vue.js鼠标悬浮更换图片功能
2017/05/17 Javascript
Vue实现一个返回顶部backToTop组件
2017/07/25 Javascript
分析JS单线程异步io回调的特性
2017/12/01 Javascript
利用Vue构造器创建Form组件的通用解决方法
2018/12/03 Javascript
[45:59]完美世界DOTA2联赛PWL S2 FTD vs GXR 第二场 11.22
2020/11/24 DOTA
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
2016/06/29 Python
python实现windows下文件备份脚本
2018/05/27 Python
python安装virtualenv虚拟环境步骤图文详解
2019/09/18 Python
Python使用matplotlib绘制Logistic曲线操作示例
2019/11/28 Python
django创建超级用户时指定添加其它字段方式
2020/05/14 Python
什么是python的必选参数
2020/06/21 Python
浅析Python迭代器的高级用法
2020/07/16 Python
详解解决jupyter不能使用pytorch的问题
2021/02/18 Python
用canvas实现图片滤镜效果附演示
2013/11/05 HTML / CSS
手工制作的豪华英式沙发和沙发床:Willow & Hall
2019/05/03 全球购物
个人找工作自荐信格式
2013/09/21 职场文书
《中国的气候》教学反思
2014/02/23 职场文书
《三亚落日》教学反思
2014/04/26 职场文书
乡镇三严三实学习心得体会
2014/10/13 职场文书
个人党性分析总结
2015/03/05 职场文书
电台广播稿范文
2015/08/19 职场文书
导游词之江南周庄
2019/12/06 职场文书
基于Redis的List实现特价商品列表功能
2021/08/30 Redis