亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

vue用Object.defineProperty手寫一個(gè)簡(jiǎn)單的雙向綁定的示例

 更新時(shí)間:2018年07月09日 14:48:42   作者:小楓學(xué)幽默  
這篇文章主要介紹了用Object.defineProperty手寫一個(gè)簡(jiǎn)單的雙向綁定的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

前言 上次寫了一個(gè)Object.defineProperty() 不詳解,文末說(shuō)要寫用它來(lái)寫個(gè)雙向綁定。說(shuō)話算話,說(shuō)來(lái)就來(lái)

前文鏈接 Object.defineProperty() 不詳解

先看最后效果

model演示.gif

什么是雙向綁定?

1.當(dāng)一個(gè)對(duì)象(或變量)的屬性改變,那么調(diào)用這個(gè)屬性的地方顯示也應(yīng)該改變,模型到視圖(model => view)

2.當(dāng)調(diào)用屬性的這個(gè)地方改變了這個(gè)屬性(通常是一個(gè)表單元素),那么這個(gè)對(duì)象(或變量)的屬性也會(huì)改為最新的值 ,即視圖到模型(view => model)

我們?cè)趺粗缹?duì)象的屬性變了?

上文說(shuō)到,Object.defineProperty 設(shè)置對(duì)象屬性的描述字段里面有兩個(gè)屬性 set (設(shè)置屬性時(shí)被調(diào)用)和get(獲取屬性時(shí)被調(diào)用),只說(shuō)不練,你再講什么?眼見(jiàn)為實(shí)好嗎?OK ,上代碼

var user = {};
var defaultName = "狂奔的蝸牛";
Object.defineProperty(user,"name",{
  get:function(){
    console.log("你是不是來(lái)獲取值啦");
    return defaultName;
  },
  set:function(value){
    console.log("你是不是來(lái)設(shè)置值啦");
    defaultName = value;
  }
})

console.log(user.name);
user.name = "狂奔的蘿卜";
console.log(user.name);

get和set存取時(shí)被調(diào)用

如上圖所示 每當(dāng)我獲取user.name屬性時(shí),get方法被調(diào)用,get 方法對(duì)應(yīng)的函數(shù)被執(zhí)行,輸出 你是不是來(lái)獲取值啦;每當(dāng)我設(shè)置user.name屬性時(shí),set方法對(duì)應(yīng)的函數(shù)被執(zhí)行,輸出 你是不是來(lái)設(shè)置值啦 ; 是的,我們監(jiān)控到了代碼對(duì)user.name屬性的存取。

說(shuō)明 假設(shè)id="model" 的元素的 value 是user.name的值,既然我們可以在改變屬性的執(zhí)行日志輸出(console.log("你是不是來(lái)設(shè)置值啦");),那么,我們?cè)谠O(shè)置值的時(shí)候給id="model" 的元素設(shè)置下新值,不就實(shí)現(xiàn)了從模型到視圖???!,說(shuō)干就干

模型到視圖(model => view)的同步

說(shuō)明 假設(shè)id="model" 的元素的 value 是user.name的值,既然我們可以在改變屬性的執(zhí)行日志輸出(console.log("你是不是來(lái)設(shè)置值啦");),那么,我們?cè)谠O(shè)置值的時(shí)候給id="model" 的元素設(shè)置下新值,不就實(shí)現(xiàn)了從模型到視圖?!!,說(shuō)干就干

<body>
  手寫一個(gè)簡(jiǎn)單雙向綁定<br/>
  <input type="text" id="model"><br/>
  <div id="modelText"></div>
</body>
<script>
var user = {};
var defaultName = "狂奔的蝸牛";

document.querySelector("#model").value = defaultName;
document.querySelector("#modelText").textContent = defaultName;

//定義屬性 監(jiān)控改變
Object.defineProperty(user,"name",{
  get:function(){
    console.log("你是不是來(lái)獲取值啦");
    return defaultName;
  },
  set:function(newValue){
    console.log("設(shè)置新值");
    defaultName = newValue;
    console.log("實(shí)現(xiàn) 模型 => 視圖");
    document.querySelector("#model").value = newValue;
    document.querySelector("#modelText").textContent = newValue;
  }
})

console.log("2s 后改變值");

setTimeout(() => {
  //改變值
  user.name = "狂奔的蘿卜";
}, 2000);
</script>

模型到視圖(model => view)的同步

視圖到模型(view => model)的同步

問(wèn): 我們能捕捉到view對(duì)值更改嗎?

答:可以?。?id="model" 的input元素的 value 是user.name的值,填充在這個(gè)文本框里面,文本框有個(gè)“ keyup” 事件,當(dāng)我們?cè)谖谋究蛑休斎胛淖值臅r(shí)候,文本框的值會(huì)跟著改變,并且會(huì)連續(xù)觸發(fā)keyup事件,那么我們只需要監(jiān)聽(tīng)這個(gè)事件,是不是就可以捕捉到view對(duì)值的更改了??既然文本框的值會(huì)跟著改變,我們獲取最新的值再把新值更新到user.name屬性,不就實(shí)現(xiàn)了視圖到模型(view => model)的同步?沒(méi)代碼說(shuō)個(gè)啥

<body>
  手寫一個(gè)簡(jiǎn)單雙向綁定<br/>
  <input type="text" id="model"><br/>
  <div id="modelText"></div>
</body>
<script>
  var user = {};
  var defaultName = "狂奔的蝸牛";
  var model = document.querySelector("#model");
  var modelText = document.querySelector("#modelText");

  model.value = defaultName;
  modelText.textContent = defaultName;

  //定義屬性 監(jiān)控改變
  Object.defineProperty(user,"name",{
    get:function(){
      console.log("你是不是來(lái)獲取值啦");
      return defaultName;
    },
    set:function(newValue){
      console.log("設(shè)置新值");
      defaultName = newValue;
      model.value = newValue;
      modelText.textContent = newValue;
    }
  })

  model.addEventListener("keyup", function () {
    user.name = this.value;
    console.log("實(shí)現(xiàn) 視圖 => 模型");
  }, false)
</script>

view2model.gif

【最終源碼】

在上述代碼的基礎(chǔ)上,加入了 用戶輸入中文的判斷(用戶輸入中文時(shí),頻繁觸發(fā) keyup事件,但實(shí)際上輸入并沒(méi)有結(jié)束。)

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>雙向綁定</title>
</head>
<body>
  手寫一個(gè)簡(jiǎn)單雙向綁定<br/>
  <input type="text" id="model"><br/>
  <div id="modelText"></div>
</body>
<script>
  var model = document.querySelector("#model");
  var modelText = document.querySelector("#modelText");
  var defaultName = "defaultName";
  var userInfo = {}
  model.value = defaultName;
  Object.defineProperty(userInfo, "name", {
    get: function () {
      return defaultName;
    },
    set: function (value) {
      defaultName = value;
      model.value = value;
      console.log("-----value");
      console.log(value);
      modelText.textContent = value;
    }
  })

  userInfo.name = "new value";
  var isEnd = true;

  model.addEventListener("keyup", function () {
    if (isEnd) {
      userInfo.name = this.value;
    }
  }, false)
  //加入監(jiān)聽(tīng)中文輸入事件
  model.addEventListener("compositionstart", function () {
    console.log("開始輸入中文");
    isEnd = false;
  })
  model.addEventListener("compositionend", function () {
    isEnd = true;
    console.log("結(jié)束輸入中文");
  })
</script>
</html>

【完結(jié)】

Object.defineProperty 可以做很多好玩兒的,自己慢慢探索哈~

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue3 拖拽hooks(可兼容移動(dòng)端)和自定義指令拖拽的實(shí)現(xiàn)代碼

    vue3 拖拽hooks(可兼容移動(dòng)端)和自定義指令拖拽的實(shí)現(xiàn)代碼

    這篇文章主要介紹了vue3 拖拽hooks(可兼容移動(dòng)端)和自定義指令拖拽的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • antd vue表格可編輯單元格以及求和實(shí)現(xiàn)方式

    antd vue表格可編輯單元格以及求和實(shí)現(xiàn)方式

    這篇文章主要介紹了antd vue表格可編輯單元格以及求和實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • vue3+vite動(dòng)態(tài)加載路由,本地路由和線上路由匹配方式

    vue3+vite動(dòng)態(tài)加載路由,本地路由和線上路由匹配方式

    這篇文章主要介紹了vue3+vite動(dòng)態(tài)加載路由,本地路由和線上路由匹配方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • vue中tinymce的使用實(shí)例詳解

    vue中tinymce的使用實(shí)例詳解

    TinyMCE Vue是TinyMCE官方發(fā)布的Vue組件,可以更輕松地在Vue應(yīng)用程序中使用TinyMCE,這篇文章主要介紹了vue中tinymce的使用,需要的朋友可以參考下
    2022-11-11
  • 關(guān)于Vue中this.$set的正確使用

    關(guān)于Vue中this.$set的正確使用

    我們?cè)陧?xiàng)目開發(fā)的過(guò)程中,經(jīng)常會(huì)遇到這種情況:為data中的某一個(gè)對(duì)象添加一個(gè)屬性,我們?cè)撊绾谓鉀Q這個(gè)問(wèn)題呢,下面小編給大家?guī)?lái)了Vue中this.$set的正確使用,感興趣的朋友跟隨小編一起看看吧
    2022-12-12
  • vue封裝jquery修改自身及兄弟元素的方法

    vue封裝jquery修改自身及兄弟元素的方法

    本文主要介紹了vue封裝jquery修改自身及兄弟元素的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Vue接口封裝的完整步驟記錄

    Vue接口封裝的完整步驟記錄

    對(duì)于中小型企業(yè),vue應(yīng)用越來(lái)越多,學(xué)習(xí)vue相對(duì)于react的成本要低點(diǎn),入門相對(duì)簡(jiǎn)單。這篇文章主要給大家介紹了關(guān)于Vue接口封裝的相關(guān)資料,需要的朋友可以參考下
    2021-05-05
  • Vue過(guò)濾器,生命周期函數(shù)和vue-resource簡(jiǎn)單介紹

    Vue過(guò)濾器,生命周期函數(shù)和vue-resource簡(jiǎn)單介紹

    這篇文章主要介紹了Vue過(guò)濾器,生命周期函數(shù)和vue-resource簡(jiǎn)單介紹,幫助大家更好的理解和使用vue,感興趣的朋友可以了解下
    2021-01-01
  • Vue實(shí)現(xiàn)無(wú)限輪播效果時(shí)動(dòng)態(tài)綁定style失效的解決方法

    Vue實(shí)現(xiàn)無(wú)限輪播效果時(shí)動(dòng)態(tài)綁定style失效的解決方法

    最近在開發(fā)中遇到了一個(gè)新需求:列表輪播滾動(dòng),實(shí)現(xiàn)方式也有很多,比如使用第三方插件,但是由于不想依賴第三方插件,想自己實(shí)現(xiàn),于是我開始了嘗試,但是在這個(gè)過(guò)程中遇到了動(dòng)態(tài)綁定style樣式不生效,所以本文介紹了Vue實(shí)現(xiàn)無(wú)限輪播效果時(shí)動(dòng)態(tài)綁定style失效的解決方法
    2024-08-08
  • 解決Vue調(diào)用springboot接口403跨域問(wèn)題

    解決Vue調(diào)用springboot接口403跨域問(wèn)題

    這篇文章主要介紹了解決Vue調(diào)用springboot接口403跨域問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論