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 相关文章推荐
setInterval,setTimeout与jquery混用的问题
Apr 08 Javascript
jquery 实现窗口的最大化不论什么情况
Sep 03 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
Feb 25 Javascript
js类式继承与原型式继承详解
Apr 07 Javascript
jquery实现百叶窗效果
Jan 12 Javascript
在一个页面实现两个zTree联动的方法
Dec 20 Javascript
解决在vue项目中,发版之后,背景图片报错,路径不对的问题
Mar 06 Javascript
详解@Vue/Cli 3 Invalid Host header 错误解决办法
Jan 02 Javascript
Vue 2.0 侦听器 watch属性代码详解
Jun 19 Javascript
Vue商品控件与购物车联动效果的实例代码
Jul 21 Javascript
TypeScript类型声明书写详解
Aug 28 Javascript
原生JS与CSS实现软件卸载对话框功能
Dec 05 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
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
shopex主机报错误请求解决方案(No such file or directory)
2011/12/27 PHP
关于ob_get_contents(),ob_end_clean(),ob_start(),的具体用法详解
2013/06/24 PHP
PHP中使用array函数新建一个数组
2015/11/19 PHP
PHP精确计算功能示例
2016/11/29 PHP
HTML中事件触发列表与解说
2007/07/09 Javascript
javascript 点击整页变灰的效果(可做退出效果)。
2008/01/09 Javascript
CSS(js)限制页面显示的文本字符长度
2012/12/27 Javascript
js获取客户端外网ip的简单实例
2013/11/21 Javascript
JS+CSS实现另类带提示效果的竖向导航菜单
2015/10/15 Javascript
js+css简单实现网页换肤效果
2015/12/29 Javascript
Boostrap入门准备之border box
2016/05/09 Javascript
js 获取范围内的随机数实例代码
2016/08/02 Javascript
详解JavaScript中js对象与JSON格式字符串的相互转换
2017/02/14 Javascript
在vue-cli中组件通信的方法
2017/12/16 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
小程序实现横向滑动日历效果
2019/10/21 Javascript
Postman无法正常返回结果问题解决
2020/08/28 Javascript
[03:28]2014DOTA2国际邀请赛 走近EG战队天才中单Arteezy
2014/07/12 DOTA
wxPython事件驱动实例详解
2014/09/28 Python
python回溯法实现数组全排列输出实例分析
2015/03/17 Python
详解python中executemany和序列的使用方法
2017/08/12 Python
python监控linux内存并写入mongodb(推荐)
2017/09/11 Python
python异步编程 使用yield from过程解析
2019/09/25 Python
Python实现剪刀石头布小游戏(与电脑对战)
2019/12/31 Python
python反编译教程之2048小游戏实例
2021/03/03 Python
HTML5 CSS3给网站设计带来出色效果
2009/07/16 HTML / CSS
css3+jq创作含苞待放的荷花
2014/02/20 HTML / CSS
详解html5 canvas 微信海报分享(个人爬坑)
2018/01/12 HTML / CSS
Superdry极度乾燥官网:日本街头风格,纯英国制造品牌
2016/10/31 全球购物
劳动工资科岗位职责范本
2014/03/02 职场文书
感恩老师的演讲稿
2014/05/06 职场文书
领导干部群众路线剖析材料
2014/10/09 职场文书
防暑降温通知书
2015/04/27 职场文书
运动会800米赞词
2015/07/22 职场文书
基于flask实现五子棋小游戏
2021/05/25 Python