欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue的MVVM實(shí)現(xiàn)方法

 更新時(shí)間:2017年08月16日 16:59:25   作者:sunny519111  
本篇文章主要主要介紹了Vue的MVVM實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

本文介紹了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的解決

    這篇文章主要介紹了vue computed計(jì)算屬性顯示undefined的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Vue在頁(yè)面右上角實(shí)現(xiàn)可懸浮/隱藏的系統(tǒng)菜單

    Vue在頁(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-05
  • Vue的自定義組件不能使用click方法的解決

    Vue的自定義組件不能使用click方法的解決

    這篇文章主要介紹了Vue的自定義組件不能使用click方法的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • el-table樹(shù)形表格表單驗(yàn)證(列表生成序號(hào))

    el-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-05
  • vue3?setup語(yǔ)法糖中獲取slot插槽的dom對(duì)象代碼示例

    vue3?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的雙向數(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-10
  • vue底部加載更多的實(shí)例代碼

    vue底部加載更多的實(shí)例代碼

    本文通過(guò)實(shí)例代碼給大家介紹了vue底部加載更多,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-06-06
  • vue項(xiàng)目實(shí)現(xiàn)按鈕可隨意移動(dòng)

    vue項(xiàng)目實(shí)現(xiàn)按鈕可隨意移動(dòng)

    這篇文章主要為大家詳細(xì)介紹了vue項(xiàng)目實(shí)現(xiàn)按鈕可隨意移動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • vuejs前后端數(shù)據(jù)交互之從后端請(qǐng)求數(shù)據(jù)的實(shí)例

    vuejs前后端數(shù)據(jù)交互之從后端請(qǐng)求數(shù)據(jù)的實(shí)例

    今天小編就為大家分享一篇vuejs前后端數(shù)據(jù)交互之從后端請(qǐng)求數(shù)據(jù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • 詳解Vuex下Store的模塊化拆分實(shí)踐

    詳解Vuex下Store的模塊化拆分實(shí)踐

    這篇文章主要介紹了詳解Vuex下Store的模塊化拆分實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07

最新評(píng)論