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

Vue3超詳細(xì)的ref()用法教程(看這一篇就夠了!)

 更新時(shí)間:2023年07月27日 10:42:04   作者:EchoLiner  
這篇文章主要給大家介紹了關(guān)于Vue3超詳細(xì)的ref()用法的相關(guān)資料,在Vue3中ref函數(shù)不僅可以用于在組件中獲取DOM元素或子組件的引用,還可以直接訪問(wèn)組件元素本身,需要的朋友可以參考下

ref( ) 接受一個(gè)內(nèi)部值,返回一個(gè)ref 對(duì)象,這個(gè)對(duì)象是響應(yīng)式的、可更改的,且只有一個(gè)指向其內(nèi)部值的屬性 .value。

ref() 將傳入?yún)?shù)的值包裝為一個(gè)帶 .value 屬性的 ref 對(duì)象。

1、ref 對(duì)象是可更改的,即可以為 .value 賦予新的值

舉例:

const a = ref(1);
// 為 a.value 賦予新的值
a.value = 2;
console.log("a--->", a);
console.log("a.value--->", a.value);

查看打印結(jié)果:

2、ref 對(duì)象是響應(yīng)式的,即所有對(duì) .value 的操作都將被追蹤,并且寫(xiě)操作會(huì)觸發(fā)與之相關(guān)的副作用。

ref()方法允許創(chuàng)建可以使用任何值類(lèi)型的響應(yīng)式 ref

ref 的 .value 屬性也是響應(yīng)式的。

當(dāng)ref的值為對(duì)象類(lèi)型時(shí),會(huì)用 reactive() 自動(dòng)轉(zhuǎn)換它的 .value。

舉例:一個(gè)包含對(duì)象類(lèi)型值的 ref 可以響應(yīng)式地替換整個(gè)對(duì)象

const b = ref({ name: 'vue3' });
// 響應(yīng)式替換
b.value = { name: 'vite' };
console.log("b--->", b);
console.log("b.value--->", b.value);

查看打印結(jié)果:

ref 被傳遞給函數(shù)或是從一般對(duì)象上被解構(gòu)時(shí),不會(huì)丟失響應(yīng)性:

const obj = {
  foo: ref(0),
  bar: ref(1)
}
 
// 該函數(shù)接收一個(gè) ref
// 需要通過(guò) .value 取值
// 但它會(huì)保持響應(yīng)性
callSomeFunction(obj.foo);
 
// 仍然是響應(yīng)式的
const { foo, bar } = obj;

總結(jié):ref() 讓我們能創(chuàng)造一種對(duì)任意值的 “引用”,并能夠在不丟失響應(yīng)性的前提下傳遞這些引用。這個(gè)功能很重要,因?yàn)樗?jīng)常用于將邏輯提取到組合函數(shù)中。

3、ref 在模板中的解包

當(dāng) ref 在模板中作為頂層屬性被訪問(wèn)時(shí),它們會(huì)被自動(dòng)“解包”,所以不需要使用 .value。

<script setup>
import { ref } from 'vue';
const a = ref(1);
</script>
<template>
  <!-- 無(wú)需 .value -->
  <div>a:{{ a }}</div>
</template>

??請(qǐng)注意,僅當(dāng) ref 是模板渲染上下文的頂層屬性時(shí)才適用自動(dòng)“解包”。

<script setup>
import { ref } from 'vue';
const obj = {
  count: ref(1)
}
</script>
 
<template>
  <div>{{ obj.count + 1 }}</div> 
</template>

渲染的結(jié)果是 [object Object]1,因?yàn)?object.count 是一個(gè) ref 對(duì)象

可以通過(guò)將 count 改成頂層屬性來(lái)解決這個(gè)問(wèn)題:

<script setup>
import { ref } from 'vue';
const obj = {
  count: ref(1)
}
// 將 count 改成頂層屬性
const { count } = obj;
</script>
 
<template>
  <div>{{ count + 1 }}</div>
</template>

渲染結(jié)果是 2

??如果一個(gè) ref 是文本插值計(jì)算的最終值,它也將被解包

<script setup>
import { ref } from 'vue';
const obj = {
  count: ref(1)
}
const { count } = obj;
</script>
 
<template>
  <div>{{ count + 1 }}</div>
  <div class="count">{{ obj.count }}</div>
</template>

<div class="count">{{ obj.count }}</div>的渲染結(jié)果為 1

這只是文本插值的一個(gè)方便功能,相當(dāng)于 {{ object.foo.value }}

4、ref 在響應(yīng)式對(duì)象中的解包

當(dāng)一個(gè) ref 被嵌套在一個(gè)響應(yīng)式對(duì)象中,作為屬性被訪問(wèn)或更改時(shí),它會(huì)自動(dòng)解包,因此會(huì)表現(xiàn)得和一般的屬性一樣:

import { ref, reactive } from 'vue';
const a = ref(0);
const obj = reactive({
  a
})
console.log("obj.a--->", obj.a);
obj.a = 2;
console.log("a.value--->", a.value);

查看打印結(jié)果:

如果將一個(gè)新的 ref 賦值給一個(gè)關(guān)聯(lián)了已有 ref 的屬性,那么它會(huì)替換掉舊的 ref:

import { ref, reactive } from 'vue';
const a = ref(0);
const other = ref(1);
const obj = reactive({
  a
})
// 將一個(gè)新的 ref 賦值給一個(gè)關(guān)聯(lián)了已有 ref 的屬性
obj.a = other;
console.log("obj.a--->", obj.a);
// 原始 ref 現(xiàn)在已經(jīng)和 obj.a 失去聯(lián)系
console.log("a.value--->", a.value);

查看打印結(jié)果:

只有當(dāng)嵌套在一個(gè)深層響應(yīng)式對(duì)象內(nèi)時(shí),才會(huì)發(fā)生 ref 解包。當(dāng)其作為淺層響應(yīng)式對(duì)象的屬性被訪問(wèn)時(shí)不會(huì)解包。

5、ref在數(shù)組和集合類(lèi)型的解包

跟響應(yīng)式對(duì)象不同,當(dāng) ref 作為響應(yīng)式數(shù)組或像 Map 這種原生集合類(lèi)型的元素被訪問(wèn)時(shí),不會(huì)進(jìn)行解包。

import { ref, reactive } from 'vue';
const books = reactive([ref('Vue 3 Guide')]);
// 這里需要 .value
console.log(books[0].value);
const map = reactive(new Map([['count', ref(0)]]));
// 這里需要 .value
console.log(map.get('count').value);

6、ts為 ref() 標(biāo)注類(lèi)型

ref 會(huì)根據(jù)初始化時(shí)的值推導(dǎo)其類(lèi)型:

import { ref } from 'vue'
 
// 推導(dǎo)出的類(lèi)型:Ref<number>
const year = ref(2020)
 
// => TS Error: Type 'string' is not assignable to type 'number'.
year.value = '2020'

有時(shí)我們可能想為 ref 內(nèi)的值指定一個(gè)更復(fù)雜的類(lèi)型,可以通過(guò)使用 Ref 這個(gè)類(lèi)型

import { ref } from 'vue'
import type { Ref } from 'vue'
 
const year: Ref<string | number> = ref('2020')
 
year.value = 2020 // 成功!

或者,在調(diào)用 ref() 時(shí)傳入一個(gè)泛型參數(shù),來(lái)覆蓋默認(rèn)的推導(dǎo)行為:

// 得到的類(lèi)型:Ref<string | number>
const year = ref<string | number>('2020')
year.value = 2020 // 成功!

如果你指定了一個(gè)泛型參數(shù)但沒(méi)有給出初始值,那么最后得到的就將是一個(gè)包含 undefined 的聯(lián)合類(lèi)型:

// 推導(dǎo)得到的類(lèi)型:Ref<number | undefined>
const n = ref<number>()

總結(jié) 

到此這篇關(guān)于Vue3超詳細(xì)ref()用法的文章就介紹到這了,更多相關(guān)Vue3的ref()用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 完美解決element-ui的el-input設(shè)置number類(lèi)型后的相關(guān)問(wèn)題

    完美解決element-ui的el-input設(shè)置number類(lèi)型后的相關(guān)問(wèn)題

    這篇文章主要介紹了完美解決element-ui的el-input設(shè)置number類(lèi)型后的相關(guān)問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10
  • Vue ElementUI中Upload組件批量上傳的實(shí)現(xiàn)代碼

    Vue ElementUI中Upload組件批量上傳的實(shí)現(xiàn)代碼

    ElementUI中Upload組件批量上傳通過(guò)獲取upload組件的DOM、文件、上傳地址和數(shù)據(jù),封裝uploadFiles方法,使用ajax方式上傳多個(gè)文件,后臺(tái)接口接收多文件并返回上傳結(jié)果,本文介紹Vue ElementUI中Upload組件如何批量上傳,感興趣的朋友一起看看吧
    2025-02-02
  • Vue3中customRef自定義ref過(guò)程

    Vue3中customRef自定義ref過(guò)程

    Vue3的customRef允許自定義響應(yīng)式邏輯,通過(guò)get/set控制依賴(lài)追蹤與更新觸發(fā),適用于防抖、驗(yàn)證、異步等場(chǎng)景,最佳實(shí)踐包括封裝函數(shù)、正確調(diào)用track/trigger、清理資源及優(yōu)化性能
    2025-09-09
  • Vue實(shí)現(xiàn)搖一搖功能(兼容ios13.3以上)

    Vue實(shí)現(xiàn)搖一搖功能(兼容ios13.3以上)

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)搖一搖功能,兼容ios13.3以上,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • 最新評(píng)論

    叙永县| 邛崃市| 南华县| 绩溪县| 西和县| 萍乡市| 凉山| 成安县| 北辰区| 恭城| 张北县| 乌海市| 满城县| 韩城市| 沅陵县| 会昌县| 岐山县| 龙山县| 沈阳市| 武安市| 息烽县| 桃园市| 铜鼓县| 开平市| 龙岩市| 龙门县| 中西区| 华宁县| 普宁市| 无极县| 长宁区| 松滋市| 凯里市| 奉节县| 昭苏县| 治县。| 故城县| 凤阳县| 易门县| 高雄市| 平南县|