Vue的MVVM实现方法


Posted in Javascript onAugust 16, 2017

本文介绍了Vue的MVVM实现方法,分享给大家,具体如下:

1. Object.defineProperty() 定义属性

用意:给一个对象定义属性,那个属性原来是不存在的。这是一个初衷,属性是不存在的,需要额外添加。

①、使用说明

Object.defineProperty(obj,props)

第一个参数是将被添加或者修改的属性的对象

第二个参数是一个对象,表示将要添加的一个或多个键值对一直要添加属性的具体配置

{

​ '属性名':{value:'...',writable:true},

​ '属性名':{value:'...',writable:true}

}

②、属性的getter和setter

  • 一般用于局部变量
  • 给构造函数添加属性
// get和set的方法不能和value以及writable一起使用
var o ={},
Object.defineProperty(o,'p',{
 get(){
   console.log('调用属性后输出')
 },
   set(val){
   console.log(val+'赋值属性的时候调用')
   }
})
o.p // '调用属性后输出'
o.p = 'hcc' //hcc赋值属性的时候调用
// 可以根据Object.getOwnPropertyDescriptor(对象, '属性名')得到相应的属性配置

// 需求
//给一个对象的属性值不能超过30,超过30的按照30来算
var hcc = {} //全局对象
{
 var age = null //局部变量
 Object.defineProperty(hcc,'age',{
   get(){
     return age //设置hcc.age的值
   },
   set(val){
     age= val> 30?30:val //当赋值给hcc.age的值进行判定从而改变局部变量age的值 
   }  
 })
}

③、使用场景

// 简单的给元素添加属性
  var obj = {name:'hcc'}
  Object.defineProperties(obj,{
   'name':{value:'haaaaa',writable:true},
   'age':{value:24,writable:false}
  })

细节

今天楼主上午在思考,一般使用Object.defineProperty()为什么需要使用局部变量呢?

所有楼主就下了下面的代码

var obj = {}
Object.defineProperty(obj,'a',{
 get() {
  return 'gg';
 },
 set(value) {
  obj.a = value;
 }
})

解析: 为什么会出现堆溢栈呢 ? 我们在调用 obj.a = 'ff' 的时候,触发了set()方法,从而执行了obj.a = value,又给obj.a进行了赋值,调用set()方法,进入了死循环。

总结: 所以我们在使用Object.defineProperty()的时候,都是通过一个私有变量或者一个局部变量来实现对象的属性的赋值和设置。

// 局部变量,以一个变量为躯壳,设置返回值。
const obj = {}
{
 let bValue;
 Object.defineProperty(obj,'a',{
  get(){
   return bValue
  },
  set(value) {
   bValue = value;
  }
})
}
// 私有变量
const obj = {
 _data: {
  a: null
 }
}
Object.defineProperty(obj,'a', {
 get() {
  return obj._data.a
 },
 set(value) {
  obj._data.a = value
 }
})

总结: Vue中进行双向绑定就是通过私有变量data实现的。是不是和Vue的结构很相似。

实现Vue的双向绑定

  • 实现改变元素的值的时候,dom进行相应的更新数据。
  • dom的值进行更新的时候,元素的值同时也改变。

html部分

<div class="forms">
 <span>姓名</span> <input type='text' name="name">
 <span>年龄</span> <input type='text' name="age">
</div>

js部分

// 改变input的值得同时obj的值改变
const obj = {
 _data: {
  name: null,
  age: null
 }
}
const nameInput = document.querySelector('input[name]')
nameInput.addEventListener('input', (e) => {
  obj._data.name = e.target.value;
})
Object.definePeoperty(obj,'a',{
 get() {
  return obj._data.name
 },
 set(value) {
  nameInput.value = value;
  obj._data.name = value;
 }
})

// 简化
function bind(obj,dom) {
 let name = dom.getAttribute('name');
 Object.defineProperty(obj,name,{
  get() {
   return obj._data[name]
  },
  set(value) {
   dom.value = value;
   obj._data[name] = value;
  }
 })
 dom.addEventListener('input', (e) => {
  obj._data[name] = e.target.value;
 })
}
bind(obj,document.querySelector('input[name=name]'))
bind(obj,document.querySelector('input[name=age]'))

Vue的MVVM实现方法

缺点: 必须要事先的绑定dom。是不是和Vue里面的很想,必须事先申明data中的数据,如果需要额外的添加数据的时候,必须通过Vue.set()来申明。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js 学习笔记(三)
Dec 29 Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
Sep 21 Javascript
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
Feb 22 Javascript
当json键为数字时的取值方法解析
Nov 15 Javascript
js自动查找select下拉的菜单并选择(示例代码)
Feb 26 Javascript
JavaScript中setMonth()方法的使用详解
Jun 11 Javascript
Javascript的表单验证-揭开正则表达式的面纱
Mar 18 Javascript
分析JavaScript数组操作难点
Dec 18 Javascript
Vue实现导出excel表格功能
Mar 30 Javascript
js事件触发操作实例分析
Jun 21 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
Sep 04 Javascript
Vue单页面应用中实现Markdown渲染
Feb 14 Vue.js
利用JS制作万年历的方法
Aug 16 #Javascript
原生JavaScript来实现对dom元素class的操作方法(推荐)
Aug 16 #Javascript
React Native 集成jpush-react-native的示例代码
Aug 16 #Javascript
jQuery实现全选、反选和不选功能
Aug 16 #jQuery
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
Aug 16 #Javascript
微信小程序删除处理详解
Aug 16 #Javascript
微信小程序实现倒计时60s获取验证码
Apr 17 #Javascript
You might like
javascript高亮效果的二种实现方法
2008/09/14 Javascript
jQuery select控制插件
2009/08/17 Javascript
JavaScript null和undefined区别分析
2009/10/14 Javascript
Prototype源码浅析 Enumerable部分(二)
2012/01/18 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
2013/01/23 Javascript
下载文件个别浏览器文件名乱码解决办法
2013/03/19 Javascript
JavaScript中伪协议 javascript:使用探讨
2014/07/18 Javascript
jQuery实现的placeholder效果完整实例
2016/08/02 Javascript
JS实现图片延迟加载并淡入淡出效果的简单方法
2016/08/25 Javascript
JS 实现可停顿的垂直滚动实例代码
2016/11/23 Javascript
JavaScript中递归实现的方法及其区别
2017/09/12 Javascript
vue.js实现简单的计算器功能
2020/02/22 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
基于JavaScript的数据结构队列动画实现示例解析
2020/08/06 Javascript
vue 里面的 $forceUpdate() 强制实例重新渲染操作
2020/09/21 Javascript
Angular处理未可知异常错误的方法详解
2021/01/17 Javascript
[29:16]完美世界DOTA2联赛决赛日 Inki vs LBZS 第三场 11.08
2020/11/10 DOTA
[01:07:34]DOTA2-DPC中国联赛定级赛 RNG vs Aster BO3第二场 1月9日
2021/03/11 DOTA
Python 调用DLL操作抄表机
2009/01/12 Python
python实现井字棋游戏
2020/03/30 Python
Python中flatten( )函数及函数用法详解
2018/11/02 Python
详解Python requests 超时和重试的方法
2018/12/18 Python
python粘包问题及socket套接字编程详解
2019/06/29 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
2019/07/04 Python
详解Python 4.0 预计推出的新功能
2019/07/26 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作
2020/05/25 Python
python实现自动打卡的示例代码
2020/10/10 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
2021/01/27 Python
CSS超出文本指定宽度用省略号代替和文本不换行
2016/05/05 HTML / CSS
城市规划毕业生求职信
2013/10/10 职场文书
旷课检讨书2000字
2014/01/14 职场文书
环卫个人总结
2015/03/03 职场文书
2016年重阳节慰问信
2015/12/01 职场文书
《颐和园》教学反思
2016/02/19 职场文书
美元符号 $
2022/02/17 杂记