溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Vue3中toRef和toRefs函數(shù)如何使用

發(fā)布時間:2023-05-16 16:40:24 來源:億速云 閱讀:96 作者:iii 欄目:編程語言

這篇文章主要介紹了Vue3中toRef和toRefs函數(shù)如何使用的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Vue3中toRef和toRefs函數(shù)如何使用文章都會有所收獲,下面我們一起來看看吧。

toRef 函數(shù)使用

首先呢, toRef 函數(shù)有兩個參數(shù)。

toRef(操作對象, 對象屬性)

好,接下來我們使用 toRef 函數(shù)寫一個案例,還是和以前一樣,頁面展示一個用戶的名稱和年紀(jì)。

<template>
  <div>
    <h3>toRef toRefs 函數(shù)</h3>
    <p>姓名:{{boy_toRef}}</p>
    <p>年齡:{{boy.age}}</p>
  </div>
</template>
<script>
  import { toRef } from 'vue'
  export default {
    setup() {
      const boy = {   // 創(chuàng)建一個用戶對象
        name: '我是????????.',   // 用戶名稱
        age: 10    // 用戶年齡
      }
      // 使用 toRef 函數(shù)包裹,操作 boy 對象的 name 屬性
      const boy_toRef = toRef(boy, 'name')  
      console.log(boy_toRef)  // 我們直接打印看一下包裹后的數(shù)據(jù)格式
      return { boy, boy_toRef }
    }
  }
</script>

保存代碼,刷新頁面。

Vue3中toRef和toRefs函數(shù)如何使用

我們可以看到數(shù)據(jù)的結(jié)構(gòu),在 value 里面直接就是 boy 下面 name 的屬性值,所以說,接下來我們編寫一個按鈕,點擊按鈕,修改這個 name 值。

<template>
  <div>
    <h3>toRef toRefs 函數(shù)</h3>
    <p>姓名:{{boy_toRef}}</p>
    <p>年齡:{{boy.age}}</p>
    <el-button type="primary" @click="btn">修改 name</el-button>
  </div>
</template>
<script>
  import { toRef } from 'vue'
  export default {
    setup() {
      const boy = {
        name: '我是????????.',
        age: 10
      }
      // 這個 boy_toRef 就是被 toRef 函數(shù)操作過的 boy 的 name 值
      const boy_toRef = toRef(boy, 'name')  
      const btn = () => {
        boy_toRef.value = '????????.'  // 把 name 修改成 ????????.
        console.log(boy_toRef)   // 修改完成打印一下結(jié)果
      }
      return { boy, btn, boy_toRef }
    }
  }
</script>

保存代碼刷新頁面,然后點擊按鈕看一下頁面效果。

Vue3中toRef和toRefs函數(shù)如何使用

通過截圖展示的效果我們可以發(fā)現(xiàn),boy_toRef 的值確實被修改了,但是呢,頁面并沒有改變,而且頁面也沒有出現(xiàn)錯誤。

這是什么原因呢? 其實這不是 Bug 哈,在本篇博文開始就說過,toRef 函數(shù)會與源數(shù)據(jù)交互,修改響應(yīng)式數(shù)據(jù)會造成源數(shù)據(jù)的修改,但是他的修改不會造成視圖層數(shù)據(jù)的更新,所以說,這就是 toRef 函數(shù)的功能。確實,視圖沒有數(shù)據(jù)更新我們通過上面的截圖看到了,但是源數(shù)據(jù)修改這個怎么看呢?沒關(guān)系,在回答這個問題之前,我們首先得知道,什么是源數(shù)據(jù)。

就像上面的代碼:

const boy = {
  name: '我是????????.',
  age: 10
}
const boy_toRef = toRef(boy, 'name')

toRef 函數(shù)將 boy 對象給包裹了起來,所以說,boy 對象就是源數(shù)據(jù)。

因此,若想確認(rèn)原始數(shù)據(jù)是否已更改,需在按鈕點擊后打印boy對象并觀察是否已更改。

<template>
  <div>
    <h3>toRef toRefs 函數(shù)</h3>
    <p>姓名:{{boy_toRef}}</p>
    <p>年齡:{{boy.age}}</p>
    <el-button type="primary" @click="btn">修改 name</el-button>
  </div>
</template>
<script>
  import { toRef } from 'vue'
  export default {
    setup() {
      const boy = {
        name: '我是????????.',
        age: 10
      }
      const boy_toRef = toRef(boy, 'name')  // 這個 boy_toRef 就是被 toRef 函數(shù)操作過的 boy 的 name 值
      const btn = () => {
        boy_toRef.value = '????????.'  // 把 name 修改成 ????????.
        console.log(boy_toRef)   // 修改完成打印一下結(jié)果
        console.log(boy)   // 修改完成打印一下boy結(jié)果
      }
      return { boy, btn, boy_toRef }
    }
  }
</script>

保存代碼,刷新頁面,在點擊按鈕修改 name 值,然后查看一下控制臺打印的 boy 對象。

Vue3中toRef和toRefs函數(shù)如何使用

發(fā)現(xiàn) boy 對象的 name 值已經(jīng)從 我是????????. 改為 ????????.了,但是頁面依舊沒有更新。

記住了!

toRef 函數(shù)會與源數(shù)據(jù)交互,修改響應(yīng)式數(shù)據(jù)會造成源數(shù)據(jù)的修改,但是他的修改不會造成視圖層數(shù)據(jù)的更新。

ref 函數(shù)驗證

那 ref 函數(shù)可以將對象里面的屬性值變成響應(yīng)式的數(shù)據(jù),修改響應(yīng)式數(shù)據(jù),是不會影響到源數(shù)據(jù),但是視圖層上的數(shù)據(jù)會被更新 這句話是正確的嘛?

我們還是寫一個案例,頁面展示一個名稱,點擊按鈕,修改頁面名稱。

<template>
  <div>
    <h3>ref reactive 函數(shù)</h3>
    <p>姓名:{{name_ref}}</p>
    <el-button type="primary" @click="btn">修改信息</el-button>
  </div>
</template>
<script>
  import { ref } from 'vue'
  export default {
    setup() {
      const name = '我是????????.'
      const name_ref = ref(name)
      const btn = () => {
        name_ref.value = '????????.'
        console.log(name_ref)  // 打印一下被ref包裹的數(shù)據(jù)
        console.log(name)   // 打印一下源數(shù)據(jù)
      }
      return { name_ref, btn }
    }
  }
</script>

保存代碼,刷新頁面,點擊按鈕查看頁面控制臺打印的結(jié)果,主要是看一下被 ref 函數(shù)包裹后的數(shù)據(jù)有沒有修改成功,源數(shù)據(jù)有沒有修改成功,最后頁面有沒有修改,下面看截圖。

Vue3中toRef和toRefs函數(shù)如何使用

OK,通過上面截圖,顧忌大家都理解了吧!

所以再記?。?/p>

ref 函數(shù)可以將對象里面的屬性值變成響應(yīng)式的數(shù)據(jù),修改響應(yīng)式數(shù)據(jù),是不會影響到源數(shù)據(jù),但是視圖層上的數(shù)據(jù)會被更新

toRefs 函數(shù)

toRefs 函數(shù)的使用呢,其實和 toRef 函數(shù)類似的哈。

  • toRefs 函數(shù)用于批量設(shè)置多個數(shù)據(jù)為相應(yīng)是數(shù)據(jù)。

  • toRefs 函數(shù)與原始數(shù)據(jù)相交互,修改響應(yīng)式數(shù)據(jù)會影響到源數(shù)據(jù),但是不會更新視圖層。

  • toRefs 函數(shù)還可以與其他響應(yīng)式數(shù)據(jù)相交互,更加方便處理視圖層數(shù)據(jù)。

toRefs 函數(shù)使用

老樣子,創(chuàng)建一個對象,然后使用 toRefs 函數(shù)包裹,在頁面展示一下。

<template>
  <div>
    <h3>toRef toRefs 函數(shù)</h3>
    <p>姓名:{{boy_toRefs.name}}</p>
    <p>年齡:{{boy_toRefs.age}}</p>
  </div>
</template>
<script>
  import { toRefs } from 'vue'
  export default {
    setup() {
      const boy = {
        name: '我是????????.',
        age: 10
      }
      const boy_toRefs = toRefs(boy)   // 將 boy 用 toRefs 包裹
      console.log(boy_toRefs)   // 打印一下結(jié)果
      return { boy_toRefs }
    }
  }
</script>

保存代碼,刷新頁面查看。

Vue3中toRef和toRefs函數(shù)如何使用

所以說,我們修改修改一下代碼,在渲染的時候除了 .屬性 之外,還需要 .value。

    <p>姓名:{{boy_toRefs.name.value}}</p>
    <p>年齡:{{boy_toRefs.age.value}}</p>

把視圖層代碼修改一下,然后查看效果。

Vue3中toRef和toRefs函數(shù)如何使用

誒,現(xiàn)在就是正常的啦!

有人可能會疑問,那這玩意兒整的不是越來越復(fù)雜了嗎?本來直接點屬性就可以,現(xiàn)在還得點屬性點value,不是多此一舉,脫褲子放P嗎? 嘿嘿嘿!我覺得也是。

為什么呢說是多此一舉也很正常,因為前面的博文講過,這種復(fù)雜結(jié)構(gòu)數(shù)據(jù)我們完全可以使用 reactive 函數(shù)來處理呀,渲染最多點一次就可以,但是 toRefs 函數(shù)卻需要點兩次。

<template>
  <div>
    <h3>toRef toRefs 函數(shù)</h3>
    <p>姓名:{{boy_toRefs.name}}</p>
    <p>年齡:{{boy_toRefs.age}}</p>
  </div>
</template>
<script>
  import { toRefs, reactive } from 'vue'
  export default {
    setup() {
      const boy = {
        name: '我是????????.',
        age: 10
      }
      const boy_toRefs = reactive(boy)
      return { boy_toRefs }
    }
  }
</script>

我們不使用 toRefs 函數(shù),而是用之前說的 reactive 函數(shù)處理數(shù)據(jù)。

Vue3中toRef和toRefs函數(shù)如何使用

我們可以看到,頁面是可以正常解析的,那為什么我們還有舍近求遠(yuǎn)的使用 toRefs 函數(shù)呢?

其實是有原因的呀!

其實 toRefs 函數(shù)最大的用處在這里!

我們這個 boy 對象里面只有兩個參數(shù)比較少,如果我們這個對象里面有十個參數(shù)或者是更多的話,每次展示的時候都得寫那么多遍的 boy 點,是不是很麻煩呢?所以說使用 toRefs 函數(shù)就可以解決這個問題,看下面的代碼。

<template>
  <div>
    <h3>toRef toRefs 函數(shù)</h3>
    <p>姓名:{{name}}</p>
    <p>年齡:{{age}}</p>
  </div>
</template>
<script>
  import { toRefs } from 'vue'
  export default {
    setup() {
      const boy = {
        name: '我是????????.',
        age: 10
      }
      return { boy_toRefs , ...toRefs(boy)}
    }
  }
</script>

在 return 拋出 reactive 的時候,使用擴展運算符和 toRefs 函數(shù),就可以實現(xiàn)直接寫屬性的方式展示數(shù)據(jù)了。

Vue3中toRef和toRefs函數(shù)如何使用

但是呢,深層次的對象依舊需要通過點來實現(xiàn)。

也許你還有疑問,直接擴展運算 reactive 函數(shù)也行啊,為啥要套上 toRefs 函數(shù),記住一點呀!

toRefs 函數(shù)修改,原始數(shù)據(jù)被改變,頁面不會被觸發(fā)。

看下面代碼:

<template>
  <div>
    <h3>toRef toRefs 函數(shù)</h3>
    <p>姓名:{{name}}</p>
    <p>年齡:{{age}}</p>
    <el-button type="primary" @click="btn">修改 name</el-button>
  </div>
</template>
<script>
  import { toRefs, reactive } from 'vue'
  export default {
    setup() {
      const boy = {
        name: '我是????????.',
        age: 10
      }
      const new_toRefs = toRefs(boy)

      const btn = () => {
        new_toRefs.name.value = '????????.'
        console.log(boy)
      }

      return { btn, ...toRefs(boy) }
    }
  }
</script>

打印一下結(jié)果:

Vue3中toRef和toRefs函數(shù)如何使用

從打印結(jié)果中可以看出,原始數(shù)據(jù)被改變,頁面沒有被觸發(fā)。根據(jù)我的寫法,可以發(fā)現(xiàn),從解構(gòu)或構(gòu)建 toRefs 返回的對象,都不會對值的響應(yīng)性產(chǎn)生影響。

關(guān)于“Vue3中toRef和toRefs函數(shù)如何使用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Vue3中toRef和toRefs函數(shù)如何使用”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI