vue里的$refs屬性要注意的點

vue里的$refs屬性

Vue的極大程度的幫助減少了對dom的操作播揪,其中獲取元素的方式主要通過添加ref屬性,但是當獲取this.$refs屬性時顾瞪,稍有不注意就會輸出undefined導致我們對dom節(jié)點的操作報錯舔庶。this.$refs.xxx為undefined的幾種情況記錄:

  1. 在created里鉤子函數中調用

    原因:created()在實例創(chuàng)建完成后被立即調用。在這一步陈醒,實例已完成以下的配置:數據觀測 (data observer)惕橙,屬性和方法的運算,watch/event 事件回調钉跷。然而弥鹦,掛載階段還沒開始,$el 屬性目前不可見爷辙。所以this.$refs壓根就調不到那個dom,因為頁面還沒有掛載上去彬坏。

    解決:在mounted () 鉤子函數中調用

    注意:在此種情況中朦促,元素節(jié)點一定是直接寫在html中的,而不是通過數據或者條件渲染的

  2. 數據或條件渲染(v-if,v-show)之后的調用.

    $ref本身作為渲染結果被創(chuàng)建栓始,在初始渲染的時候不能訪問他們务冕,是不存在的

    $refs不是響應式的,只在組件渲染完成后才填充

    用于元素或子組件注冊引用信息混滔,注冊完成洒疚,將會注冊在父組件$refs對象上

    調用對象是否和v-if結合使用

    ref不是響應式的,所有的動態(tài)加載的模板更新它都無法相應的變化坯屿。

    解決:可以通過setTimeOut(()=>{...}, 0)來實現

<template>
  <div>
    <p ref="testText">this is a test data</p>
    <p v-if="msg" ref="msgText">{{msg}}</p>
    <button @click="handleClick">點一下</button>
  </div>
</template>

<script>
import { setTimeout } from 'timers';
export default {
  data () {
    return {
      text: 'message show',
      msg: ''
    }
  },
  created () {
    console.log(this.$refs.testText)    // undefined
    // this.$refs.testText.style.color = '#f00'
  },
  mounted () {
    console.log(this.$refs.testText)  //  <p data-v-5752faac="" style="color: rgb(255, 0, 0);">this is a test data</p>
    console.log(this.$refs.msgText)     // undefined
    this.$refs.testText.style.color = '#f00'
  },
  methods: {
    handleClick () {
      this.msg = 'msg show'
      console.log(this.$refs.msgText)   // undefined
      setTimeout(() => {
        this.$refs.msgText.style.color = '#eee'
        console.log(this.$refs.msgText) // <p data-v-5752faac="" style="color: rgb(238, 238, 238);">msg show</p>
      }, 0)
    }
  }
}

補充:

  • ref的作用是只在當前的vue組件中有效油湖,所以使用ref來獲取dom元素,節(jié)省了dom的操作又可以實現多個重復組件中的區(qū)分领跛,所以獲取元素的時候用ref不要直接使用document.getElementById來操作乏德;二者獲取到的值是一樣的,用ref獲取到DOM元素以后還是可以使用document的方法吠昭。

  • ref被用來給元素或子組件注冊引用信息喊括。引用信息將會注冊在父組件的$refs對象上;如果在子組件上矢棚,引用就指向組件實例

  • $refs 是所有注冊過的ref的一個集合

  • 而$refs相對document.getElementById的方法郑什,會減少獲取dom節(jié)點的消耗

  • 如果通過v-for 遍歷想加不同的ref時記得加 :號,即 :ref =某變量 ;
    這點和其他屬性一樣蒲肋,如果是固定值就不需要加 :號蘑拯,如果是變量記得加 :

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市兜粘,隨后出現的幾起案子申窘,更是在濱河造成了極大的恐慌,老刑警劉巖孔轴,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剃法,死亡現場離奇詭異,居然都是意外死亡路鹰,警方通過查閱死者的電腦和手機贷洲,發(fā)現死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晋柱,“玉大人恩脂,你說我怎么就攤上這事∪そ铮” “怎么了俩块?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我玉凯,道長势腮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任漫仆,我火速辦了婚禮捎拯,結果婚禮上,老公的妹妹穿的比我還像新娘盲厌。我一直安慰自己署照,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布吗浩。 她就那樣靜靜地躺著建芙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪懂扼。 梳的紋絲不亂的頭發(fā)上禁荸,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音阀湿,去河邊找鬼赶熟。 笑死,一個胖子當著我的面吹牛陷嘴,可吹牛的內容都是我干的映砖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼灾挨,長吁一口氣:“原來是場噩夢啊……” “哼邑退!你這毒婦竟也來了?” 一聲冷哼從身側響起涨醋,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瓜饥,失蹤者是張志新(化名)和其女友劉穎逝撬,沒想到半個月后浴骂,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡宪潮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年溯警,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狡相。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡梯轻,死狀恐怖,靈堂內的尸體忽然破棺而出尽棕,到底是詐尸還是另有隱情喳挑,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站伊诵,受9級特大地震影響单绑,放射性物質發(fā)生泄漏。R本人自食惡果不足惜曹宴,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一搂橙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧笛坦,春花似錦区转、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至资厉,卻和暖如春厅缺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宴偿。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工湘捎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窄刘。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓窥妇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親娩践。 傳聞我的和親對象是個殘疾皇子活翩,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359