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

深入了解Vue中雙向數(shù)據(jù)綁定原理

 更新時(shí)間:2022年05月19日 09:48:39   作者:幾何心涼  
vue是一個(gè)mvvm框架,即數(shù)據(jù)雙向綁定,即當(dāng)數(shù)據(jù)發(fā)生變化的時(shí)候,視圖也就發(fā)生變化,當(dāng)視圖發(fā)生變化的時(shí)候,數(shù)據(jù)也會(huì)跟著同步變化。本文將通過(guò)示例詳解其中原理,需要的可以參考一下

數(shù)據(jù)的變化反應(yīng)到視圖

前面我們了解到數(shù)據(jù)劫持之后,我們可以在數(shù)據(jù)發(fā)生修改之后做任何我們想要做的事情,操作視圖當(dāng)然也是OK的

命令式操作視圖

目標(biāo):我們通過(guò)原始的操作dom的方式讓每一次的name的最新值都能顯示到p元素內(nèi)部

<div id="app">
  <p></p>
</div>
<script>
   let data = {
        name: '小蘭同學(xué)',
        age: 18,
        height:180
    }
    // 遍歷每一個(gè)屬性
    Object.keys(data).forEach((key)=>{
        // key 屬性名
        // data[key] 屬性值
        defineReactive(data,key,data[key])
    })
    function defineReactive(data,key,value){
        Object.defineProperty(data,key,{
            get(){
               return value
            },
            set(newVal){
              value = newVal 
              // 數(shù)據(jù)發(fā)生變化,操作dom進(jìn)行更新
              document.querySelector('#app p').innerHTML = data.name
            }
        })
    }
  // 首次渲染
  document.querySelector('#app p').innerHTML = data.name
</script>

聲明式操作視圖

目標(biāo):我們將data中name屬性的值作為文本渲染到標(biāo)記了v-text的p標(biāo)簽內(nèi)部,在vue中,我們把這種標(biāo)記式的聲明式渲染叫做指令

<div id="app">
  <p v-text="name"></p>
</div>
<script>
  let data = {
    name: '小蘭同學(xué)',
    age: 18,
    height: 180
  }
  // 遍歷每一個(gè)屬性
  Object.keys(data).forEach((key) => {
    // key 屬性名
    // data[key] 屬性值
    // data 原對(duì)象
    defineReactive(data, key, data[key])
  })
  function defineReactive(data, key, value) {
    Object.defineProperty(data, key, {
      get() {
        return value
      },
      set(newVal) {
        value = newVal
        // 數(shù)據(jù)發(fā)生變化,操作dom進(jìn)行更新
        compile()
      }
    })
  }
  // 
  function compile() {
    let app = document.getElementById('app')
    // 1.拿到app下所有的子元素
    const nodes = app.childNodes   //  [text, input, text]
    //2.遍歷所有的子元素
    nodes.forEach(node => {
      // nodeType為1為元素節(jié)點(diǎn)
      if (node.nodeType === 1) {
        const attrs = node.attributes
        // 遍歷所有的attrubites找到 v-model
        Array.from(attrs).forEach(attr => {
          const dirName = attr.nodeName
          const dataProp = attr.nodeValue
          if (dirName === 'v-text') {
            node.innerText = data[dataProp]
          }
        })
      }
    })
  }
  // 首次渲染
  compile()
</script>

小結(jié)

不管是指令也好,插值表達(dá)式也好,這些都是將數(shù)據(jù)反應(yīng)到視圖的標(biāo)記而已,通過(guò)標(biāo)記我們可以把數(shù)據(jù)的變化響應(yīng)式的反應(yīng)到對(duì)應(yīng)的dom位置上去
找標(biāo)記,把數(shù)據(jù)綁定到dom的過(guò)程,我們稱之為binding

視圖的變化反應(yīng)到數(shù)據(jù)

目標(biāo):將data中的message屬性對(duì)應(yīng)的值渲染到input上面,同時(shí)input值發(fā)生修改之后,可以反向修改message的值,在vue系統(tǒng)中,v-model指令就是干這個(gè)事情的,下面我們就實(shí)現(xiàn)一下v-model的功能

<div id="app">
  <input v-model="name" />
</div>
<script>
  let data = {
    name: '小蘭同學(xué)',
    age: 18,
    height: 170
  }
  // 遍歷每一個(gè)屬性
  Object.keys(data).forEach((key) => {
    // key 屬性名
    // data[key] 屬性值
    // data 原對(duì)象
    defineReactive(data, key, data[key])
  })
  function defineReactive(data, key, value) {
    Object.defineProperty(data, key, {
      get() {
        return value
      },
      set(newVal) {
        // 數(shù)據(jù)發(fā)生變化,操作dom進(jìn)行更新
        if (newVal === value) {
          return
        }
        value = newVal
        compile()
      }
    })
  }
  // 編譯函數(shù)
  function compile() {
    let app = document.getElementById('app')
    // 1.拿到app下所有的子元素
    const nodes = app.childNodes   //  [text, input, text]
    //2.遍歷所有的子元素
    nodes.forEach(node => {
      // nodeType為1為元素節(jié)點(diǎn)
      if (node.nodeType === 1) {
        const attrs = node.attributes
        // 遍歷所有的attrubites找到 v-model
        Array.from(attrs).forEach(attr => {
          const dirName = attr.nodeName
          const dataProp = attr.nodeValue
          if (dirName === 'v-model') {
            node.value = data[dataProp]
            // 視圖變化反應(yīng)到數(shù)據(jù) 無(wú)非是事件監(jiān)聽(tīng)反向修改
            node.addEventListener('input', (e) => {
              data[dataProp] = e.target.value
            })
          }
        })
      }
    })
  }
  // 首次渲染
  compile()
</script>

現(xiàn)存的問(wèn)題

無(wú)法做到精準(zhǔn)更新

<div id="app">
  <p v-text="name"></p>
  <p v-text="age"></p>
  <p v-text="name"></p>
</div>
<script>
  let data = {
    name: '小蘭同學(xué)',
    age: 18,
    height: 180
  }
  // 遍歷每一個(gè)屬性
  Object.keys(data).forEach((key) => {
    // key 屬性名
    // data[key] 屬性值
    // data 原對(duì)象
    defineReactive(data, key, data[key])
  })
  function defineReactive(data, key, value) {
    Object.defineProperty(data, key, {
      get() {
        return value
      },
      set(newVal) {
        // 數(shù)據(jù)發(fā)生變化,操作dom進(jìn)行更新
        if (newVal === value) {
          return
        }
        value = newVal
        compile()
      }
    })
  }
  // 編譯函數(shù)
  function compile() {
    let app = document.getElementById('app')
    // 1.拿到app下所有的子元素
    const nodes = app.childNodes   //  [text, input, text]
    //2.遍歷所有的子元素
    nodes.forEach(node => {
      // nodeType為1為元素節(jié)點(diǎn)
      if (node.nodeType === 1) {
        const attrs = node.attributes
        Array.from(attrs).forEach(attr => {
          const dirName = attr.nodeName
          const dataProp = attr.nodeValue
          console.log( dirName,dataProp)
          if (dirName === 'v-text') {
            console.log(`更新了${dirName}指令,需要更新的屬性為${dataProp}`)
            node.innerText = data[dataProp]
          }
        })
      }
    })
  }
  // 首次渲染
  compile()
</script>

以上就是深入了解Vue中雙向數(shù)據(jù)綁定原理的詳細(xì)內(nèi)容,更多關(guān)于Vue雙向數(shù)據(jù)綁定的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue+ElementUI 關(guān)閉對(duì)話框清空驗(yàn)證,清除form表單的操作

    vue+ElementUI 關(guān)閉對(duì)話框清空驗(yàn)證,清除form表單的操作

    這篇文章主要介紹了vue+ElementUI 關(guān)閉對(duì)話框清空驗(yàn)證,清除form表單的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • vue2.0/3.0的響應(yīng)式原理及區(qū)別淺析

    vue2.0/3.0的響應(yīng)式原理及區(qū)別淺析

    這篇文章主要給大家介紹了關(guān)于vue2.0/3.0響應(yīng)式原理及區(qū)別的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • vue組件父子間通信詳解(三)

    vue組件父子間通信詳解(三)

    這篇文章主要為大家詳細(xì)介紹了vue組件父子間通信的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Vue的子組件props如何設(shè)置多個(gè)校驗(yàn)類型

    Vue的子組件props如何設(shè)置多個(gè)校驗(yàn)類型

    這篇文章主要介紹了Vue的子組件props如何設(shè)置多個(gè)校驗(yàn)類型問(wèn)題。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Vue 中如何利用 new Date() 獲取當(dāng)前時(shí)間

    Vue 中如何利用 new Date() 獲取當(dāng)前時(shí)間

    在 Vue 開(kāi)發(fā)中,利用 new Date() 方法可以方便地獲取當(dāng)前時(shí)間,并通過(guò) Date 對(duì)象的方法進(jìn)行時(shí)間格式化和操作。通過(guò)本文的介紹,您應(yīng)該對(duì)在 Vue 中獲取當(dāng)前時(shí)間有了更深入的了解,并了解了一些常見(jiàn)的時(shí)間操作方法,需要的朋友可以參考下
    2023-07-07
  • 使用vue導(dǎo)出excel遇到的坑及解決

    使用vue導(dǎo)出excel遇到的坑及解決

    這篇文章主要介紹了使用vue導(dǎo)出excel遇到的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue選項(xiàng)之propsData傳遞數(shù)據(jù)方式

    Vue選項(xiàng)之propsData傳遞數(shù)據(jù)方式

    這篇文章主要介紹了Vue選項(xiàng)之propsData傳遞數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • VUE使用docxtemplater導(dǎo)出word文檔實(shí)例(帶圖片)

    VUE使用docxtemplater導(dǎo)出word文檔實(shí)例(帶圖片)

    docxtemplate支持的功能很多,語(yǔ)法包含變量替換、條件判斷、循環(huán)、列表循環(huán)、表格循環(huán)等,下面這篇文章主要給大家介紹了關(guān)于VUE使用docxtemplater導(dǎo)出word功能(帶圖片)的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • Vue中CSS?scoped的原理詳細(xì)講解

    Vue中CSS?scoped的原理詳細(xì)講解

    在組件中增加的css加了scoped屬性之后,就在會(huì)在當(dāng)前這個(gè)組件的節(jié)點(diǎn)上增加一個(gè)data-v-xxx屬性,下面這篇文章主要給大家介紹了關(guān)于Vue中CSS?scoped原理的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • 解決vue.js 數(shù)據(jù)渲染成功仍報(bào)錯(cuò)的問(wèn)題

    解決vue.js 數(shù)據(jù)渲染成功仍報(bào)錯(cuò)的問(wèn)題

    今天小編就為大家分享一篇解決vue.js 數(shù)據(jù)渲染成功仍報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08

最新評(píng)論