(六)響應(yīng)式數(shù)據(jù) - ref

本章將介紹的是另一個響應(yīng)式數(shù)據(jù)的創(chuàng)建方式ref

1、概述:函數(shù),創(chuàng)建并返回一個響應(yīng)式數(shù)據(jù)對象,并在此對象上只包含一個.value屬性指向該數(shù)據(jù)值;
2、用例:由vue提供,按需引入:import { ref } from 'vue';

<p>{{name}}</p>  // 視圖中直接使用即可,不需要.value

import { ref } from 'vue';

setup() {
    const name = ref('zhang_san');
    console.log(name.value) // 'zhang_san'
    // 同樣需要使用return返回
    return { name };
}

如果使用ref將一個對象創(chuàng)建為響應(yīng)式代理的話,則該對象會被進(jìn)行深度響應(yīng)式創(chuàng)建

<p>{{data.count}}</p> // 0
<p>{{data.content.age}}</p> // 10 

setup(props, context) {
    const defaultVal = {
      count: 0,
      content: {
        age: 10
      }
    };
    const data = ref(defaultVal);
    console.log(data.value.count) // 0
    console.log(data.value.content.age) // 10
    return {
      data
    };
}
data.value.count ++ // 1 視圖重新渲染
data.value.content.age++ // 11 視圖重新渲染
下面是ref數(shù)據(jù)能訪問到的部分常用方法及延伸方法。

unref()

1、概述:返回代理原始值,如果參數(shù)為ref則返回原始代理值,如果不是ref則返回參數(shù)本身
2、用例:由vue提供,按需引入:import { unref } from 'vue';

import { unref } from 'vue';
const a = ref(1);
const b = 'zhagn_san';
console.log(unref(a)) // 1
console.log(unref(b)) // zhagn_san

toRef()

1、概述:可以將reactive創(chuàng)建的代理的某個屬性傳遞出來用ref進(jìn)行代理
2、用例:由vue提供,按需引入:import { toRef } from 'vue';

import { reactive, toRef } from 'vue';
const data = reactive({ name: 'zhang_san', age: 20 });
const toRefValue = toRef(data, 'age');

toRefValue.value++  // toRefValue.value 21
console.log(data.age) // 21

data.age++ // data.age 22
console.log(toRefValue.value) // 22

3、注意:使用toRef將reactive的屬性代理后,屬性值的變化會同時影響toRef后的值和原本reactive的屬性值
4、實例:在將prop的引用傳遞給復(fù)合函數(shù)的時候,toRef將非常有用

setup(props) {
    userHandler(toRef(props, 'name'));
    // 這將使得userHandler拿到的name為響應(yīng)式代理
}

toRefs()

1、概述:可以將reactive創(chuàng)建的代理的所有屬性傳遞出來用ref進(jìn)行代理
2、用例:由vue提供,按需引入:import { toRefs } from 'vue';

import { reactive, toRefs } from 'vue';
const data = reactive({ name: 'zhang_san', age: 20 });
const toRefValue = toRefs(data);

toRefValue.age.value++  // toRefValue.age.value 21
console.log(data.age) // 21

data.age++ // data.age 22
console.log(toRefValue.age.value) // 22

3、注意:使用toRefs將reactive的屬性代理后,屬性值的變化會同時影響toRefs后的對應(yīng)屬性值和原本reactive的屬性值
4、實例:從組合函數(shù)返回響應(yīng)式對象時,這將很有用,而不是使用es6數(shù)據(jù)結(jié)構(gòu)的方式,這樣會使reactive的屬性失去響應(yīng)式代理

function userHandler() {
  const state = reactive({ name: 'zhang_san', age: 20});
  return toRefs(state)
}

export default {
  setup() {
    const { name, age} = userHandler();
    return { name, age };
  }
}

isRef()

1、概述:判斷響應(yīng)式代理是否為ref所創(chuàng)建
2、用例:由vue提供,按需引入:import { isRef } from 'vue';

import { ref, reactive, isRef } from 'vue';
const name = ref('zhang_san');
const user = reactive({sex: '男', age: 20});

console.log(isRef(name)) // true
console.log(isRef(user)) // false
// 應(yīng)用場景:在獲取一個未知的數(shù)據(jù)對象的值時,如:
const newV = isRef(name) ? name.value : name;

下一章:(七)計算屬性 - computed
上一章:(五)響應(yīng)式數(shù)據(jù)對象 - reactive

ps:在你想從一個人身上得到什么的時候,先想想你自己在這個人身上付出了什么。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容