Vue的MVVM实现方法

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

1. Object.defineproperty() 定义属性

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

①、使用说明

Object.defineProperty(obj,props)

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

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

{

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

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

}

②、属性的getter和setter

// 需求
//给一个对象的属性值不能超过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的值
}
})
}

③、使用场景

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

细节

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

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

rush:js;"> 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()的时候,都是通过一个私有变量或者一个局部变量来实现对象的属性的赋值和设置。

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

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

实现Vue的双向绑定

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

html部分

rush:xhtml;">
姓名 年龄

js部分

{ obj._data.name = e.target.value; }) Object.definePeoperty(obj,{ 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]'))

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

相关文章

可以通过min-width属性来设置el-table-column的最小宽度。以...
yarn dev,当文件变动后,会自动重启。 yanr start不会自动重...
ref 用于创建一个对值的响应式引用。这个值可以是原始值(如...
通过修改 getWK005 函数来实现这一点。这里的 query 参数就是...
<el-form-item label="入库类型" ...
API 变动 样式类名变化: 一些组件的样式类名有所变动,可能需...