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 相关文章推荐
javascript天然的迭代器
Oct 29 Javascript
读jQuery之十 事件模块概述
Jun 27 Javascript
简略说明Javascript中的= =(等于)与= = =(全等于)区别
Apr 16 Javascript
JS验证邮件地址格式方法小结
Dec 01 Javascript
如何让一个json文件显示在表格里【实现代码】
May 09 Javascript
html中鼠标滚轮事件onmousewheel的处理方法
Nov 11 Javascript
微信小程序网络请求wx.request详解及实例
May 18 Javascript
详解微信小程序 登录获取unionid
Jun 27 Javascript
深入理解React中何时使用箭头函数
Aug 23 Javascript
vue中echarts3.0自适应的方法
Feb 26 Javascript
vue使用v-for实现hover点击效果
Sep 29 Javascript
微信小程序 生成携带参数的二维码
Oct 23 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
《神奇女侠:血脉》神力女超人大战犯罪公司
2020/04/09 欧美动漫
Thinkphp中Create方法深入探究
2014/06/16 PHP
php实现图片上传、剪切功能
2016/05/07 PHP
Yii 2.0自带的验证码使用经验分享
2017/06/19 PHP
goto语法在PHP中的使用教程
2020/09/17 PHP
HTML长文本截取含有HTML代码同样适用的两种方法
2013/07/31 Javascript
JS正则表达式大全(整理详细且实用)
2013/11/14 Javascript
JS延迟加载加快页面打开速度示例代码
2013/12/30 Javascript
javascript读写json示例
2014/04/11 Javascript
JavaScript File分段上传
2016/03/10 Javascript
jquery分页插件jquery.pagination.js实现无刷新分页
2016/04/01 Javascript
javascript汉字拼音互转的简单实例
2016/10/09 Javascript
微信公众平台获取access_token的方法步骤
2019/03/29 Javascript
JS实现返回上一页并刷新页面的方法分析
2019/07/16 Javascript
关于Python中Inf与Nan的判断问题详解
2017/02/08 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
Python面向对象编程之继承与多态详解
2018/01/16 Python
Django中url的反向查询的方法
2018/03/14 Python
python提取图像的名字*.jpg到txt文本的方法
2018/05/10 Python
Python使用pyodbc访问数据库操作方法详解
2018/07/05 Python
对python3 Serial 串口助手的接收读取数据方法详解
2019/06/12 Python
Python操作qml对象过程详解
2019/09/26 Python
Python中__repr__和__str__区别详解
2019/11/07 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
HTML5 Plus 实现手机APP拍照或相册选择图片上传功能
2016/07/13 HTML / CSS
HTML5制作表格样式
2016/11/15 HTML / CSS
精美的手工家居和生活用品:Nkuku
2019/11/01 全球购物
HomeAway英国:全球领先的度假租赁在线市场
2020/02/03 全球购物
文员个人的求职信范文
2013/09/26 职场文书
计算机网络毕业生自荐信
2013/10/01 职场文书
优秀应届生推荐信
2013/11/09 职场文书
淘宝活动策划方案
2014/02/06 职场文书
房地产公司见习自我鉴定
2014/04/28 职场文书
2014年调度员工作总结
2014/11/19 职场文书
技术股东合作协议书
2014/12/02 职场文书
Python基础知识学习之类的继承
2021/05/31 Python