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 相关文章推荐
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
Dec 08 Javascript
js单例模式详解实例
Nov 21 Javascript
href下载文件根据id取url并下载
May 28 Javascript
jquery+php实现搜索框自动提示
Nov 28 Javascript
jquery拼接ajax 的json和字符串拼接的方法
Mar 11 Javascript
JS简单生成随机数(随机密码)的方法
May 11 Javascript
jquery实现用户登陆界面(示例讲解)
Sep 06 jQuery
Node.js学习之TCP/IP数据通讯(实例讲解)
Oct 11 Javascript
JavaScript常用工具方法封装
Feb 12 Javascript
JS寄快递地址智能解析的实现代码
Jul 16 Javascript
微信小程序实现列表左右滑动
Nov 19 Javascript
JavaScript高级程序设计之变量与作用域
Nov 17 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
解析使用ThinkPHP应该掌握的调试手段
2013/06/20 PHP
PHP日期函数date格式化UNIX时间的方法
2015/03/19 PHP
Yii框架日志操作图文与实例详解
2019/09/09 PHP
PHP超全局变量实现原理及代码解析
2020/09/01 PHP
接收键盘指令的脚本
2006/06/26 Javascript
javascript 获取元素位置的快速方法 getBoundingClientRect()
2009/11/26 Javascript
原生js实现日期联动
2015/01/12 Javascript
JS实现在线统计一个页面内鼠标点击次数的方法
2015/02/28 Javascript
JS for循环中i++ 和 ++i的区别介绍
2016/07/20 Javascript
遍历json 对象的属性并且动态添加属性的实现
2016/12/02 Javascript
JS实现获取来自百度,Google,soso,sogou关键词的方法
2016/12/21 Javascript
javascript 中的try catch应用总结
2017/04/01 Javascript
Javascript中click与blur事件的顺序详析
2017/04/25 Javascript
微信小程序上传图片到服务器实例代码
2017/11/07 Javascript
js 原生判断内容区域是否滚动到底部的实例代码
2017/11/15 Javascript
jQuery动态添加li标签并添加属性和绑定事件方法
2018/02/24 jQuery
js实现图片上传并预览功能
2018/08/06 Javascript
Vue动态获取width的方法
2018/08/22 Javascript
javascript实现简易聊天室
2019/07/12 Javascript
layui-table获得当前行的上/下一行数据的例子
2019/09/24 Javascript
小程序接口的promise化的实现方法
2019/12/11 Javascript
Element的el-tree控件后台数据结构的生成以及方法的抽取
2020/03/05 Javascript
VueX模块的具体使用(小白教程)
2020/06/05 Javascript
vue+swiper实现左右滑动的测试题功能
2020/10/30 Javascript
[03:01]完美世界DOTA2联赛PWL S2 集锦第二期
2020/12/03 DOTA
python 实现归并排序算法
2012/06/05 Python
Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
2013/12/04 Python
Python实现判断一个整数是否为回文数算法示例
2019/03/02 Python
Python实现字典按key或者value进行排序操作示例【sorted】
2019/05/03 Python
python+selenium自动化实战携带cookies模拟登陆微博
2021/01/19 Python
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
给男朋友的道歉信
2014/01/12 职场文书
聘任证明怎么写
2015/03/02 职场文书
Python识别花卉种类鉴定网络热门植物并自动整理分类
2022/04/08 Python
apache ftpserver搭建ftp服务器
2022/05/20 Servers
Python使用pandas导入xlsx格式的excel文件内容操作代码
2022/12/24 Python