vue裏dom節點和window對象

一、window對象

  • 首先window對象是瀏覽器下的默認對象,也就是全局對象,在沒有明確指向的時候this指向window。即使切換路由,window對象裏面的屬性和方法依舊會保留。因此可以在控制欄直接輸入this、window、self都可以直接打印window對象。window對象很很多默認的方法和屬性。
  • 一切全局變量和方法都是window的屬性和方法,也就是隻要沒有指定作用域就會賦值給window。
    • <script type="text/javascript">
          var name = "chunlynn";
          this.sex = "man"; // 這裏的this就是隱式的window對象,相當於 sex = "man";
          age = 27;
      </script>

      像這種name、this、age都掛載到了window對象上,成爲了window對象的屬性。

  • 即使用了框架,比如vue,jQuery,也只是在window下掛載一個對象,比如引入jQuery之後就會在全局掛載一個$的對象。還是可以直接通過window調用全局屬性和方法
  • 在vue中,因爲用webpack打包,每個vue都是單獨的模塊,所以需要window._this=1 這樣才能夠引入window對象。而且需要定義在相應的script中。這樣就可以在控制檯直接用_this得到這個變量。

二、dom元素

  • vue中最好不要直接操作dom元素的。因爲vue是用虛擬dom樹就行插入的。

    首先數據發生改變,就會經過 Data 處理,然後Dep會發出通知(notify),告訴 Watcher 有數據發生了變化,接着 Watcher 會傳達給渲染函數跟他說有數據變化了,可以渲染視圖了(數據驅動視圖),進而渲染函數執行render 方法去更新 VNODE,也就是我們說的虛擬DOM,最後虛擬DOM根據最優算法,去局部更新需要渲染的視圖。

  • vue中對dom節點的操作一般是用ref來完成的。ref 加在普通的元素上,用this.$refs.name 獲取到的是dom元素,和原生的document.get(ID)獲得的dom元素一樣,擁有這個dom元素的默認屬性,像innertext這種,而ref 加在組件上,用this.$refs.name 獲取到的是vue組件實例,可以使用組件的所有屬性和方法。此時的結果是一個字典序列,可以直接this.$refs.name[用到的屬性]來獲取並且更改。
  • 但是ref的對象是一個for循環的數組,裏面每一個元素就是vue對象,也是字典序列。這裏因爲ref的對象是一個li,所以每一個元素都是li對象。
  • ref 需要在dom渲染完成後纔會有,在使用的時候確保dom已經渲染完成。比如在生命週期 mounted(){} 鉤子中調用,或者在 this.$nextTick(()=>{}) 中調用
  • 如果是自定義的組件,甚至可以通過ref調用emit(A)來實現@ A="實現A"的方法。其實子組件包括第三方組件的api,也就是組件真正實現的地方定義的方法和屬性,都可以在用ref獲得這個組件的方法後,自己模擬實現。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章