Vue的MVVM實(shí)現(xiàn)方法
本文介紹了Vue的MVVM實(shí)現(xiàn)方法,分享給大家,具體如下:
1. Object.defineProperty() 定義屬性
用意:給一個(gè)對(duì)象定義屬性,那個(gè)屬性原來(lái)是不存在的。這是一個(gè)初衷,屬性是不存在的,需要額外添加。
①、使用說(shuō)明
Object.defineProperty(obj,props)
第一個(gè)參數(shù)是將被添加或者修改的屬性的對(duì)象
第二個(gè)參數(shù)是一個(gè)對(duì)象,表示將要添加的一個(gè)或多個(gè)鍵值對(duì)一直要添加屬性的具體配置
{
'屬性名':{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+'賦值屬性的時(shí)候調(diào)用') } }) o.p // '調(diào)用屬性后輸出' o.p = 'hcc' //hcc賦值屬性的時(shí)候調(diào)用 // 可以根據(jù)Object.getOwnPropertyDescriptor(對(duì)象, '屬性名')得到相應(yīng)的屬性配置 // 需求 //給一個(gè)對(duì)象的屬性值不能超過(guò)30,超過(guò)30的按照30來(lái)算 var hcc = {} //全局對(duì)象 { var age = null //局部變量 Object.defineProperty(hcc,'age',{ get(){ return age //設(shè)置hcc.age的值 }, set(val){ age= val> 30?30:val //當(dāng)賦值給hcc.age的值進(jìn)行判定從而改變局部變量age的值 } }) }
③、使用場(chǎng)景
// 簡(jiǎn)單的給元素添加屬性 var obj = {name:'hcc'} Object.defineProperties(obj,{ 'name':{value:'haaaaa',writable:true}, 'age':{value:24,writable:false} })
細(xì)節(jié)
今天樓主上午在思考,一般使用Object.defineProperty()為什么需要使用局部變量呢?
所有樓主就下了下面的代碼
var obj = {} Object.defineProperty(obj,'a',{ get() { return 'gg'; }, set(value) { obj.a = value; } })
解析: 為什么會(huì)出現(xiàn)堆溢棧呢 ? 我們?cè)谡{(diào)用 obj.a = 'ff' 的時(shí)候,觸發(fā)了set()方法,從而執(zhí)行了obj.a = value,又給obj.a進(jìn)行了賦值,調(diào)用set()方法,進(jìn)入了死循環(huán)。
總結(jié): 所以我們?cè)谑褂肙bject.defineProperty()的時(shí)候,都是通過(guò)一個(gè)私有變量或者一個(gè)局部變量來(lái)實(shí)現(xiàn)對(duì)象的屬性的賦值和設(shè)置。
// 局部變量,以一個(gè)變量為軀殼,設(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中進(jìn)行雙向綁定就是通過(guò)私有變量data實(shí)現(xiàn)的。是不是和Vue的結(jié)構(gòu)很相似。
實(shí)現(xiàn)Vue的雙向綁定
- 實(shí)現(xiàn)改變?cè)氐闹档臅r(shí)候,dom進(jìn)行相應(yīng)的更新數(shù)據(jù)。
- dom的值進(jìn)行更新的時(shí)候,元素的值同時(shí)也改變。
html部分
<div class="forms"> <span>姓名</span> <input type='text' name="name"> <span>年齡</span> <input type='text' name="age"> </div>
js部分
// 改變input的值得同時(shí)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; } }) // 簡(jiǎn)化 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]'))
缺點(diǎn): 必須要事先的綁定dom。是不是和Vue里面的很想,必須事先申明data中的數(shù)據(jù),如果需要額外的添加數(shù)據(jù)的時(shí)候,必須通過(guò)Vue.set()來(lái)申明。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue computed計(jì)算屬性顯示undefined的解決
這篇文章主要介紹了vue computed計(jì)算屬性顯示undefined的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Vue在頁(yè)面右上角實(shí)現(xiàn)可懸浮/隱藏的系統(tǒng)菜單
這篇文章主要介紹了Vue在頁(yè)面右上角實(shí)現(xiàn)可懸浮/隱藏的系統(tǒng)菜單,實(shí)現(xiàn)思路大概是通過(guò)props將showCancel這個(gè)Boolean值傳遞到子組件,對(duì)父子組件分別綁定事件,來(lái)控制這個(gè)系統(tǒng)菜單的顯示狀態(tài)。需要的朋友可以參考下2018-05-05el-table樹(shù)形表格表單驗(yàn)證(列表生成序號(hào))
這篇文章主要介紹了el-table樹(shù)形表格表單驗(yàn)證(列表生成序號(hào)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05vue3?setup語(yǔ)法糖中獲取slot插槽的dom對(duì)象代碼示例
slot元素是一個(gè)插槽出口,標(biāo)示了父元素提供的插槽內(nèi)容將在哪里被渲染,這篇文章主要給大家介紹了關(guān)于vue3?setup語(yǔ)法糖中獲取slot插槽的dom對(duì)象的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04輕松理解vue的雙向數(shù)據(jù)綁定問(wèn)題
Vue是當(dāng)前很火的一款MVVM的輕量級(jí)框架,它是以數(shù)據(jù)驅(qū)動(dòng)和組件化的思想構(gòu)建的。因?yàn)樗峁┝撕?jiǎn)潔易于理解的api,使得我們很容易上手。這篇文章給大家介紹了vue雙向數(shù)據(jù)綁定問(wèn)題,感興趣的朋友一起看看吧2017-10-10vue項(xiàng)目實(shí)現(xiàn)按鈕可隨意移動(dòng)
這篇文章主要為大家詳細(xì)介紹了vue項(xiàng)目實(shí)現(xiàn)按鈕可隨意移動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03vuejs前后端數(shù)據(jù)交互之從后端請(qǐng)求數(shù)據(jù)的實(shí)例
今天小編就為大家分享一篇vuejs前后端數(shù)據(jù)交互之從后端請(qǐng)求數(shù)據(jù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08