簡單聊聊Vue中的ref,toRef與toRefs
一、ref
ref 函數,可以把簡單數據類型包裹為響應式數據(復雜類型也可以),注意 JS 中操作值的時候,需要加 .value 屬性,模板中正常使用即可。
舉個例子:
ref包裝基本類型數據
App.vue
<template> <div class="container"> <div>{{ name }}</div> <button @click="updateName">修改數據</button> </div> </template> <script> import { ref } from 'vue' export default { name: 'App', setup() { const name = ref('初映') const updateName = () => { name.value = '初映CY的前說' } return { name, updateName } }, } </script>
可看見寫法與reactive()一樣,不過是在js中書寫的時候需要額外加一個.value即可
ref包裝復雜類類型數據
注意:ref 其實也可以包裹復雜數據類型為響應式數據,一般對于數據類型未確定的情況下推薦使用 ref,例如后端返回的數據。
<template> <div class="container"> <div>{{ data?.name }}</div> <button @click="updateName">修改數據</button> </div> </template> <script> import { ref } from 'vue' export default { name: 'App', setup() { // 初始值是 null const data = ref(null) setTimeout(() => { // 右邊的對象可能是后端返回的 data.value = { name: '初映', } }, 1000) const updateName = () => { data.value.name = 'CY' } return { data, updateName } }, } </script>
如何選擇?
ref()和reactive()都是Vue.js3.0中提供的兩個響應式API。
ref()主要用于創(chuàng)建一個響應式數據,它會將一個普通的JavaScript對象轉換為一個響應式的對象,從而使數據的變化可以被Vue實例所追蹤,當數據發(fā)生變化時,Vue會自動更新相關視圖。ref()創(chuàng)建的響應式數據可以通過.value屬性來訪問和修改。
reactive()則主要用于創(chuàng)建一個響應式對象,可以用作包含多個值的狀態(tài)對象,通常用于管理復雜的狀態(tài)。它可以將一個普通的JavaScript對象轉換為一個響應式對象,并且支持嵌套屬性,即使嵌套屬性發(fā)生變化也會被Vue實例所追蹤。當響應式對象中有任何一個屬性發(fā)生變化時,Vue也會自動更新相關的視圖。
當你明確知道需要包裹的是一個對象,那么推薦使用 reactive,其他情況使用 ref 即可。
Vue3.2 之后,更推薦使用 ref,性能得到了很大的提升。
二、toRef
toRef 函數的作用:轉換響應式對象中某個屬性為單獨響應式數據,并且轉換后的值和之前是關聯(lián)的(ref 函數也可以轉換,但值非關聯(lián))。
先看下面這個例子:
<template> <div class="container"> <h2>name: {{ obj.name }} age: {{obj.age}}</h2> <button @click="updateName">修改數據</button> </div> </template> <script> import { reactive } from 'vue' export default { name: 'App', setup() { const obj = reactive({ name: '初映', age: 18, address: '江西', sex: '男', }) const updateName = () => { obj.name = '初映CY的前說' } return { obj, updateName } }, } </script>
這樣寫也可以將數據進行更改成為響應式的數據,但是帶來了兩個問題:
問題 1:模板中都要使用 obj. 進行獲取數據,麻煩。
問題 2:明明模板中只用到了 name 和 age,卻把整個 obj 進行了導出,沒必要,性能浪費。
<template> <div class="container"> <h2>name: {{ name }} </h2> <button @click="updateName">修改數據</button> </div> </template> <script> import { reactive,toRef } from 'vue' export default { name: 'App', setup() { const obj = reactive({ name: '初映', age: 18, address: '江西', sex: '男', }) const name = toRef(obj, 'name') const updateName = () => { obj.name = '初映CY的前說' } return { name, updateName } }, } </script>
這樣把我們需要的數據放進return即可,節(jié)約了性能與在模板中的寫法,有點點了‘按需導入’的意思
三、torefs
toRefs 函數的作用:轉換響應式對象中所有屬性為單獨響應式數據,并且轉換后的值和之前是關聯(lián)的。
<template> <div class="container"> <h2>{{ name }} {{ age }}</h2> <button @click="updateName">修改數據</button> </div> </template> <script> import { reactive, toRefs } from 'vue' export default { name: 'App', setup() { const obj = reactive({ name: '初映', age: 10, }) const updateName = () => { obj.name = '初映CY的前說' obj.age = 18 } return { ...toRefs(obj), updateName } }, } </script>
toRefs將我們所有的響應式數據都進行return出去了,屆時直接用上數據名稱即可,記得加上…喔
到此這篇關于簡單聊聊Vue中的ref,toRef與toRefs的文章就介紹到這了,更多相關Vue ref toRef toRefs內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
antv完成區(qū)間柱形圖一列多柱配置實現(xiàn)詳解
這篇文章主要為大家介紹了antv完成區(qū)間柱形圖一列多柱配置實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10Vue?Router動態(tài)路由實現(xiàn)實現(xiàn)更靈活的頁面交互
Vue?Router是Vue.js官方的路由管理器,用于構建SPA(單頁應用程序),本文將深入探討Vue?Router的動態(tài)路由功能,希望可以幫助大家更好地理解和應用Vue.js框架2024-02-02ant design vue 清空upload組件圖片緩存的問題
這篇文章主要介紹了ant design vue 清空upload組件圖片緩存的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10