最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

命令式操作視圖

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

<div id="app">
  <p></p>
</div>
<script>
   let data = {
        name: '小蘭同學',
        age: 18,
        height:180
    }
    // 遍歷每一個屬性
    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進行更新
              document.querySelector('#app p').innerHTML = data.name
            }
        })
    }
  // 首次渲染
  document.querySelector('#app p').innerHTML = data.name
</script>

聲明式操作視圖

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

<div id="app">
  <p v-text="name"></p>
</div>
<script>
  let data = {
    name: '小蘭同學',
    age: 18,
    height: 180
  }
  // 遍歷每一個屬性
  Object.keys(data).forEach((key) => {
    // key 屬性名
    // data[key] 屬性值
    // data 原對象
    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進行更新
        compile()
      }
    })
  }
  // 
  function compile() {
    let app = document.getElementById('app')
    // 1.拿到app下所有的子元素
    const nodes = app.childNodes   //  [text, input, text]
    //2.遍歷所有的子元素
    nodes.forEach(node => {
      // nodeType為1為元素節(jié)點
      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é)

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

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

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

<div id="app">
  <input v-model="name" />
</div>
<script>
  let data = {
    name: '小蘭同學',
    age: 18,
    height: 170
  }
  // 遍歷每一個屬性
  Object.keys(data).forEach((key) => {
    // key 屬性名
    // data[key] 屬性值
    // data 原對象
    defineReactive(data, key, data[key])
  })
  function defineReactive(data, key, value) {
    Object.defineProperty(data, key, {
      get() {
        return value
      },
      set(newVal) {
        // 數(shù)據(jù)發(fā)生變化,操作dom進行更新
        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é)點
      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ù) 無非是事件監(jiān)聽反向修改
            node.addEventListener('input', (e) => {
              data[dataProp] = e.target.value
            })
          }
        })
      }
    })
  }
  // 首次渲染
  compile()
</script>

現(xiàn)存的問題

無法做到精準更新

<div id="app">
  <p v-text="name"></p>
  <p v-text="age"></p>
  <p v-text="name"></p>
</div>
<script>
  let data = {
    name: '小蘭同學',
    age: 18,
    height: 180
  }
  // 遍歷每一個屬性
  Object.keys(data).forEach((key) => {
    // key 屬性名
    // data[key] 屬性值
    // data 原對象
    defineReactive(data, key, data[key])
  })
  function defineReactive(data, key, value) {
    Object.defineProperty(data, key, {
      get() {
        return value
      },
      set(newVal) {
        // 數(shù)據(jù)發(fā)生變化,操作dom進行更新
        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é)點
      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ù)綁定原理的詳細內(nèi)容,更多關(guān)于Vue雙向數(shù)據(jù)綁定的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • el-table表頭根據(jù)內(nèi)容自適應(yīng)完美解決表頭錯位和固定列錯位

    el-table表頭根據(jù)內(nèi)容自適應(yīng)完美解決表頭錯位和固定列錯位

    這篇文章主要介紹了el-table表頭根據(jù)內(nèi)容自適應(yīng)完美解決表頭錯位和固定列錯位,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • Vue ECharts圖表通用配置詳解

    Vue ECharts圖表通用配置詳解

    這篇文章主要介紹了Vue ECharts圖表通用配置,Echarts,它是一個與框架無關(guān)的 JS 圖表庫,但是它基于Js,這樣很多框架都能使用它,例如Vue,估計IONIC也能用
    2022-12-12
  • Vue 2源碼解析HTMLParserOptions.start函數(shù)方法

    Vue 2源碼解析HTMLParserOptions.start函數(shù)方法

    這篇文章主要為大家介紹了Vue 2源碼解析HTMLParserOptions.start函數(shù)方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • vue項目中實現(xiàn)的微信分享功能示例

    vue項目中實現(xiàn)的微信分享功能示例

    這篇文章主要介紹了vue項目中實現(xiàn)的微信分享功能,結(jié)合實例形式分析了基于vue.js實現(xiàn)的微信分享功能具體定義與使用方法,需要的朋友可以參考下
    2019-01-01
  • VUE正則表達式用法全集整理(推薦!)

    VUE正則表達式用法全集整理(推薦!)

    正則表達式是由一些特定的字符組成,代表一個規(guī)則,可以用來檢驗數(shù)據(jù)格式是否合法,也可以在一段文本中查找滿足要求的內(nèi)容,這篇文章主要給大家介紹了關(guān)于VUE正則表達式用法的相關(guān)資料,需要的朋友可以參考下
    2024-02-02
  • Vue項目中new?Vue()和export?default{}的區(qū)別說明

    Vue項目中new?Vue()和export?default{}的區(qū)別說明

    這篇文章主要介紹了Vue項目中new?Vue()和export?default{}的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • vue中如何實時監(jiān)聽本地存儲

    vue中如何實時監(jiān)聽本地存儲

    這篇文章主要介紹了vue中如何實時監(jiān)聽本地存儲,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • webpack項目調(diào)試以及獨立打包配置文件的方法

    webpack項目調(diào)試以及獨立打包配置文件的方法

    下面小編就為大家分享一篇webpack項目調(diào)試以及獨立打包配置文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • Vue實現(xiàn)骨架屏的示例代碼

    Vue實現(xiàn)骨架屏的示例代碼

    骨架屏就是在頁面數(shù)據(jù)尚未加載前先給用戶展示出頁面的大致結(jié)構(gòu)。本文將利用Vue實現(xiàn)簡單的骨架屏,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-03-03
  • Vue大屏數(shù)據(jù)展示示例

    Vue大屏數(shù)據(jù)展示示例

    公司的大數(shù)據(jù)工作組就需要通過數(shù)據(jù)大屏展示一些處理過后有價值的信息,本文主要介紹了Vue大屏數(shù)據(jù)展示示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評論

出国| 阳城县| 紫阳县| 昭苏县| 隆尧县| 淮南市| 上饶县| 浦县| 邻水| 名山县| 于都县| 南城县| 射阳县| 台东市| 溆浦县| 卫辉市| 本溪市| 璧山县| 宜都市| 崇文区| 三江| 项城市| 南宫市| 田阳县| 昔阳县| 嘉禾县| 乌兰察布市| 双流县| 肇源县| 宜宾市| 法库县| 沈丘县| 西乡县| 崇礼县| 广丰县| 绥阳县| 满洲里市| 阆中市| 嘉义市| 卢龙县| 绥芬河市|