Vue的MVVM實現(xiàn)方法
本文介紹了Vue的MVVM實現(xiàn)方法,分享給大家,具體如下:
1. Object.defineProperty() 定義屬性
用意:給一個對象定義屬性,那個屬性原來是不存在的。這是一個初衷,屬性是不存在的,需要額外添加。
①、使用說明
Object.defineProperty(obj,props)
第一個參數(shù)是將被添加或者修改的屬性的對象
第二個參數(shù)是一個對象,表示將要添加的一個或多個鍵值對一直要添加屬性的具體配置
{
'屬性名':{value:'...',writable:true},
'屬性名':{value:'...',writable:true}
}
②、屬性的getter和setter
- 一般用于局部變量
- 給構(gòu)造函數(shù)添加屬性
// get和set的方法不能和value以及writable一起使用
var o ={},
Object.defineProperty(o,'p',{
get(){
console.log('調(diào)用屬性后輸出')
},
set(val){
console.log(val+'賦值屬性的時候調(diào)用')
}
})
o.p // '調(diào)用屬性后輸出'
o.p = 'hcc' //hcc賦值屬性的時候調(diào)用
// 可以根據(jù)Object.getOwnPropertyDescriptor(對象, '屬性名')得到相應的屬性配置
// 需求
//給一個對象的屬性值不能超過30,超過30的按照30來算
var hcc = {} //全局對象
{
var age = null //局部變量
Object.defineProperty(hcc,'age',{
get(){
return age //設(shè)置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}
})
細節(jié)
今天樓主上午在思考,一般使用Object.defineProperty()為什么需要使用局部變量呢?
所有樓主就下了下面的代碼
var obj = {}
Object.defineProperty(obj,'a',{
get() {
return 'gg';
},
set(value) {
obj.a = value;
}
})
解析: 為什么會出現(xiàn)堆溢棧呢 ? 我們在調(diào)用 obj.a = 'ff' 的時候,觸發(fā)了set()方法,從而執(zhí)行了obj.a = value,又給obj.a進行了賦值,調(diào)用set()方法,進入了死循環(huán)。
總結(jié): 所以我們在使用Object.defineProperty()的時候,都是通過一個私有變量或者一個局部變量來實現(xiàn)對象的屬性的賦值和設(shè)置。
// 局部變量,以一個變量為軀殼,設(shè)置返回值。
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
}
})
總結(jié): Vue中進行雙向綁定就是通過私有變量data實現(xiàn)的。是不是和Vue的結(jié)構(gòu)很相似。
實現(xiàn)Vue的雙向綁定
- 實現(xiàn)改變元素的值的時候,dom進行相應的更新數(shù)據(jù)。
- 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]'))

缺點: 必須要事先的綁定dom。是不是和Vue里面的很想,必須事先申明data中的數(shù)據(jù),如果需要額外的添加數(shù)據(jù)的時候,必須通過Vue.set()來申明。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue computed計算屬性顯示undefined的解決
這篇文章主要介紹了vue computed計算屬性顯示undefined的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11
Vue在頁面右上角實現(xiàn)可懸浮/隱藏的系統(tǒng)菜單
這篇文章主要介紹了Vue在頁面右上角實現(xiàn)可懸浮/隱藏的系統(tǒng)菜單,實現(xiàn)思路大概是通過props將showCancel這個Boolean值傳遞到子組件,對父子組件分別綁定事件,來控制這個系統(tǒng)菜單的顯示狀態(tài)。需要的朋友可以參考下2018-05-05
vue3?setup語法糖中獲取slot插槽的dom對象代碼示例
slot元素是一個插槽出口,標示了父元素提供的插槽內(nèi)容將在哪里被渲染,這篇文章主要給大家介紹了關(guān)于vue3?setup語法糖中獲取slot插槽的dom對象的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-04-04
vuejs前后端數(shù)據(jù)交互之從后端請求數(shù)據(jù)的實例
今天小編就為大家分享一篇vuejs前后端數(shù)據(jù)交互之從后端請求數(shù)據(jù)的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08

