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

詳解vue2與vue3獲取模版引用ref的區(qū)別

 更新時間:2023年10月08日 09:32:46   作者:前端?賈公子  
這篇文章主要為大家詳細介紹了vue2與vue3中獲取模版引用ref的方法與區(qū)別,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

雖然 Vue 的聲明性渲染模型為你抽象了大部分對 DOM 的直接操作,但在某些情況下,我們?nèi)匀恍枰苯釉L問底層 DOM 元素。要實現(xiàn)這一點,我們可以使用特殊的 ref attribute:

ref 是一個特殊的 attribute,和 v-for 章節(jié)中提到的 key 類似。它允許我們在一個特定的 DOM 元素或子組件實例被掛載后,獲得對它的直接引用。這可能很有用,比如說在組件掛載時將焦點設置到一個 input 元素上,或在一個元素上初始化一個第三方庫。

Vue 2 中獲取模板引用

在Vue 2中,我們可以使用ref屬性來獲取模板中的DOM元素或組件實例的引用。這使得在Vue組件中訪問和操作特定元素或組件變得非常方便。

獲取DOM元素引用

要獲取一個DOM元素的引用,我們可以在模板中使用ref屬性并為其指定一個名稱。然后,我們可以通過this.$refs來訪問這個引用。

<template>
  <div>
    <button ref="myButton">點擊我</button>
  </div>
</template>
<script>
export default {
  mounted() {
    // 在生命周期鉤子中使用$refs來獲取引用
    this.$refs.myButton.innerText = '已點擊';
  }
}
</script>

在上面的例子中,我們給按鈕添加了一個ref屬性,值為myButton。然后在mounted生命周期鉤子中,我們使用this.$refs.myButton來獲取到這個按鈕的引用,并修改了它的文本內(nèi)容。

獲取組件引用

如果我們想獲取一個子組件的引用,也可以使用相同的ref屬性來實現(xiàn)。

<template>
  <div>
    <ChildComponent ref="myChildComponent" />
  </div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
  components: {
    ChildComponent
  },
  mounted() {
    // 在生命周期鉤子中使用$refs來獲取子組件的引用
    this.$refs.myChildComponent.someMethod();
  }
}
</script>

在上面的例子中,我們在父組件中引入了一個名為ChildComponent的子組件,并在模板中使用了ref屬性來獲取它的引用。然后在mounted生命周期鉤子中,我們可以使用this.$refs.myChildComponent來訪問并調(diào)用子組件的方法。

v-for 中的模板引用

當在 v-for 中使用模板引用時,相應的引用中包含的值是一個數(shù)組

<script>
export default {
  data() {
    return {
      list: [
        /* ... */
      ]
    }
  },
  mounted() {
    console.log(this.$refs.items)
  }
}
</script>
<template>
  <ul>
    <li v-for="item in list" ref="items">
      {{ item }}
    </li>
  </ul>
</template>

應該注意的是,ref 數(shù)組并不保證與源數(shù)組相同的順序。

vue3 中獲取模板引用

訪問模板引用

為了通過組合式 API 獲得該模板引用,我們需要聲明一個同名的 ref:

<script setup>
import { ref, onMounted } from 'vue'
// 聲明一個 ref 來存放該元素的引用
// 必須和模板里的 ref 同名
const input = ref(null)
onMounted(() => {
  input.value.focus()
})
</script>
<template>
  <input ref="input" />
</template>

如果不使用 <script setup>,需確保從 setup() 返回 ref:

export default {
  setup() {
    const input = ref(null)
    // ...
    return {
      input
    }
  }
}

注意,你只可以在組件掛載后才能訪問模板引用。如果你想在模板中的表達式上訪問 input,在初次渲染時會是 null。這是因為在初次渲染前這個元素還不存在呢!

如果你需要偵聽一個模板引用 ref 的變化,確??紤]到其值為 null 的情況:

watchEffect(() => {
  if (input.value) {
    input.value.focus()
  } else {
    // 此時還未掛載,或此元素已經(jīng)被卸載(例如通過 v-if 控制)
  }
})

v-for 中的模板引用

當在 v-for 中使用模板引用時,對應的 ref 中包含的值是一個數(shù)組,它將在元素被掛載后包含對應整個列表的所有元素:

<script setup>
import { ref, onMounted } from 'vue'
const list = ref([
  /* ... */
])
const itemRefs = ref([])
onMounted(() => console.log(itemRefs.value))
</script>
<template>
  <ul>
    <li v-for="item in list" ref="itemRefs">
      {{ item }}
    </li>
  </ul>
</template>

函數(shù)模板引用

除了使用字符串值作名字,ref attribute 還可以綁定為一個函數(shù),會在每次組件更新時都被調(diào)用。該函數(shù)會收到元素引用作為其第一個參數(shù):

<input :ref="(el) => { /* 將 el 賦值給一個數(shù)據(jù)屬性或 ref 變量 */ }">

注意我們這里需要使用動態(tài)的 :ref 綁定才能夠傳入一個函數(shù)。當綁定的元素被卸載時,函數(shù)也會被調(diào)用一次,此時的 el 參數(shù)會是 null。你當然也可以綁定一個組件方法而不是內(nèi)聯(lián)函數(shù)。

<div v-for=(item, index) in arrList>
    <div :ref="el => myRefs[index]=el"></div>
</div>
setup(){
    const myRefs = ref([]) as Ref<string[]>
    return {
        myRefs,
    }
}

組件上的 ref

模板引用也可以被用在一個子組件上。這種情況下引用中獲得的值是組件實例:

<script setup>
import { ref, onMounted } from 'vue'
import Child from './Child.vue'
const child = ref(null)
onMounted(() => {
  // child.value 是 <Child /> 組件的實例
})
</script>
<template>
  <Child ref="child" />
</template>

如果一個子組件使用的是選項式 API 或沒有使用 <script setup>,被引用的組件實例和該子組件的 this 完全一致,這意味著父組件對子組件的每一個屬性和方法都有完全的訪問權(quán)。這使得在父組件和子組件之間創(chuàng)建緊密耦合的實現(xiàn)細節(jié)變得很容易,當然也因此,應該只在絕對需要時才使用組件引用。大多數(shù)情況下,你應該首先使用標準的 props 和 emit 接口來實現(xiàn)父子組件交互。

有一個例外的情況,使用了 <script setup> 的組件是默認私有的:一個父組件無法訪問到一個使用了 <script setup> 的子組件中的任何東西,除非子組件在其中通過 defineExpose 宏顯式暴露:

<script setup>
import { ref } from 'vue'
const a = 1
const b = ref(2)
// 像 defineExpose 這樣的編譯器宏不需要導入
defineExpose({
  a,
  b
})
</script>

當父組件通過模板引用獲取到了該組件的實例時,得到的實例類型為 { a: number, b: number } (ref 都會自動解包,和一般的實例一樣)。

到此這篇關(guān)于詳解vue2與vue3獲取模版引用ref的區(qū)別的文章就介紹到這了,更多相關(guān)vue獲取ref內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue-loader使用教程

    Vue-loader使用教程

    Vue-loader其實就是一個webpack的loader,用來把vue組件轉(zhuǎn)換成可部署的js, html, css模塊,這篇文章主要介紹了Vue-loader使用教程,需要的朋友可以參考下
    2022-08-08
  • Vue 根據(jù)條件判斷van-tab的顯示方式

    Vue 根據(jù)條件判斷van-tab的顯示方式

    這篇文章主要介紹了Vue 根據(jù)條件判斷van-tab的顯示方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Vue 處理表單input單行文本框的實例代碼

    Vue 處理表單input單行文本框的實例代碼

    這篇文章主要Vue 處理表單input單行文本框的實例代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • element-plus中如何實現(xiàn)按需導入與全局導入

    element-plus中如何實現(xiàn)按需導入與全局導入

    本文主要介紹了element-plus中如何實現(xiàn)按需導入與全局導入,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 基于Vue實現(xiàn)電商SKU組合算法問題

    基于Vue實現(xiàn)電商SKU組合算法問題

    這篇文章主要介紹了基于Vue實現(xiàn)電商SKU組合算法問題 ,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • vue項目中使用rem,在入口文件添加內(nèi)容操作

    vue項目中使用rem,在入口文件添加內(nèi)容操作

    這篇文章主要介紹了vue項目中使用rem,在入口文件添加內(nèi)容操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • 詳解Vue.js Class與Style綁定

    詳解Vue.js Class與Style綁定

    這篇文章主要為大家介紹了Vue.js Class與Style綁定的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Vue 組件的掛載與父子組件的傳值實例

    Vue 組件的掛載與父子組件的傳值實例

    這篇文章主要介紹了Vue 組件的掛載與父子組件的傳值實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Vue自定義組件中v-model的使用方法示例

    Vue自定義組件中v-model的使用方法示例

    日常開發(fā)中除了直接在input標簽上使用v-model指令外,封裝的組件也需要v-model,下面這篇文章主要給大家介紹了關(guān)于Vue自定義組件中v-model使用的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • Vue實現(xiàn)模糊查詢的簡單示例

    Vue實現(xiàn)模糊查詢的簡單示例

    在Vue中實現(xiàn)模糊查詢,你可以使用JavaScript的filter和includes方法,結(jié)合Vue的v-for指令,本文給大家舉了一個簡單的示例,并通過代碼示例給大家介紹的非常詳細,需要的朋友可以參考下
    2024-01-01

最新評論

永德县| 厦门市| 榆中县| 石棉县| 三台县| 民丰县| 和田市| 康乐县| 河西区| 平乡县| 三都| 靖远县| 乳山市| 邹平县| 新泰市| 营口市| 山阳县| SHOW| 曲松县| 泸溪县| 凤翔县| 舒兰市| 河池市| 尤溪县| 彭州市| 九江县| 桃江县| 松桃| 澄江县| 准格尔旗| 惠东县| 潮州市| 芮城县| 扎兰屯市| 嘉善县| 丰原市| 客服| 深泽县| 桦南县| 永吉县| 平遥县|