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报$ is not a function 的问题的解决方法
Jan 20 Javascript
js图片滚动效果时间可随意设定当鼠标移上去时停止
Jun 26 Javascript
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
Oct 16 Javascript
js实现宇宙星空背景效果的方法
Mar 03 Javascript
jQuery页面加载初始化的3种方法(推荐)
Jun 02 Javascript
js中使用使用原型(prototype)定义方法的好处详解
Jul 04 Javascript
Ionic+AngularJS实现登录和注册带验证功能
Feb 09 Javascript
AngularJs实现聊天列表实时刷新功能
Jun 15 Javascript
Angular2 组件通信的实例代码
Jun 23 Javascript
JS实现图片预览的两种方式
Jun 27 Javascript
JavaScript满天星导航栏实现方法
Mar 08 Javascript
微信小程序开发(一):服务器获取数据列表渲染操作示例
Jun 01 Javascript
利用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
PHP stristr() 函数(不区分大小写的字符串查找)
2010/06/03 PHP
flash用php连接数据库的代码
2011/04/21 PHP
PHP实现格式化文件数据大小显示的方法
2015/01/03 PHP
Yii学习总结之安装配置
2015/02/22 PHP
深入分析PHP优化及注意事项
2016/07/04 PHP
PHP设计模式(八)装饰器模式Decorator实例详解【结构型】
2020/05/02 PHP
如何解决Jquery库及其他库之间的$命名冲突
2013/09/15 Javascript
jquery转盘抽奖功能实现
2015/11/13 Javascript
jQuery基于$.ajax设置移动端click超时处理方法
2016/05/14 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
2017/02/08 Javascript
微信分享调用jssdk实例
2017/06/08 Javascript
nodejs文件夹深层复制功能
2019/09/03 NodeJs
Vue toFixed保留两位小数的3种方式
2020/10/23 Javascript
vue浏览器返回监听的具体步骤
2021/02/03 Vue.js
[01:04:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第二场 1月31日
2021/03/11 DOTA
使用grappelli为django admin后台添加模板
2014/11/18 Python
《与孩子一起学编程》python自测题
2018/05/27 Python
如何基于python操作json文件获取内容
2019/12/24 Python
TensorFlow查看输入节点和输出节点名称方式
2020/01/04 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
ubuntu 安装pyqt5和卸载pyQt5的方法
2020/03/24 Python
python正则表达式的懒惰匹配和贪婪匹配说明
2020/07/13 Python
TensorFlow的环境配置与安装方法
2021/02/20 Python
CSS3按钮鼠标悬浮实现光圈效果源码
2016/09/11 HTML / CSS
创伤外科专业推荐信范文
2013/11/19 职场文书
家长对小学生的评语
2014/01/28 职场文书
初三政治教学反思
2014/01/30 职场文书
企业金融服务方案
2014/06/03 职场文书
学习考察心得体会
2014/09/04 职场文书
贫困证明模板(3篇)
2014/09/16 职场文书
2014年教研组工作总结
2014/11/26 职场文书
小学教育见习总结
2015/06/23 职场文书
酒桌上的祝酒词
2015/08/12 职场文书
CSS3通过var()和calc()函数实现动画特效
2021/03/30 HTML / CSS
Linux安装Nginx步骤详解
2021/03/31 Servers
python flask框架快速入门
2021/05/14 Python