vue3 中響應(yīng)式數(shù)據(jù)

一平绩、非響應(yīng)式數(shù)據(jù)

  1. 只有在 setup 函數(shù)中被 return 暴露的變量才可在模板中使用
  2. 只能用于初始化渲染視圖薛耻,不可再次改變視圖
<template>
  <div>{{ count }}</div>

  <!-- 不報(bào)錯(cuò)也不生效 -->
  <button @click="count++">count add</button>
</template>

<script>
export default {
  setup() {
    const count = 1;
    return { count };
  },
};
</script>

二醋闭、基礎(chǔ)類型響應(yīng)式數(shù)據(jù)(基礎(chǔ)類型)

  1. 通過 ref()函數(shù)將基礎(chǔ)類型數(shù)據(jù)包裝成響應(yīng)式數(shù)據(jù)
  2. 在 setup 函數(shù)中使用 ref() 包裝的數(shù)據(jù)的值蘸朋,需要通過.value 的方式
  3. 在模板中使用 ref() 包裝的數(shù)據(jù)谢翎,直接使用算墨,不使用.value 的方式
<template>
  <div>{{ count }}</div>
  <button @click="count++">count add 模板</button>
  <button @click="handleCountAdd()">count add setup</button>
</template>

<script>
import { ref } from "vue";

export default {
  setup() {
    const count = ref(1);
    console.log(count);

    const handleCountAdd = () => {
      count.value++;
    };
    return { count, handleCountAdd };
  },
};
</script>

三蹲嚣、對(duì)象類型響應(yīng)式數(shù)據(jù)(對(duì)象和數(shù)組)

1. 通過 ref() 定義對(duì)象類型響應(yīng)式數(shù)據(jù)

  1. 通過 ref()函數(shù)將對(duì)象類型數(shù)據(jù)包裝成響應(yīng)式數(shù)據(jù)
  2. 在 setup 函數(shù)中使用 ref() 包裝的數(shù)據(jù)的值赚瘦,需要通過.value 的方式
  3. 在模板中使用 ref() 包裝的數(shù)據(jù),直接使用寺谤,不使用.value
  4. ref()函數(shù)包裝的對(duì)象數(shù)據(jù)是深層次的響應(yīng)式數(shù)據(jù)(原理是當(dāng)給 ref()傳入對(duì)象時(shí)仑鸥,實(shí)際上調(diào)用了 reactive()函數(shù))
<template>
  <div>教師姓名:{{ teacher.name }}</div>
  <div>教師年齡:{{ teacher.age }}</div>
  <button @click="handleTeacherChange()">change teacher</button>
</template>

<script>
import { ref } from "vue";

export default {
  setup() {
    let teacher = ref({});
    setTimeout(() => {
      teacher.value = {
        name: "venus",
        age: 30,
      };
    }, 1000);

    const handleTeacherChange = () => {
      teacher.value = {
        name: "alias",
        age: 40,
      };

      teacher.value.name = "tom";
    };

    return { teacher, handleTeacherChange };
  },
};
</script>

2. 通過 reactive() 定義對(duì)象類型響應(yīng)式數(shù)據(jù)

  1. reactive() 只能用于定義對(duì)象類型響應(yīng)式數(shù)據(jù),不能定義基礎(chǔ)類型響應(yīng)式數(shù)據(jù)
<template>
  <div>教師姓名:{{ state.teacher.name }}</div>
  <div>教師年齡:{{ state.teacher.age }}</div>
  <button @click="handleTeacherChange()">change teacher</button>
</template>

<script>
import { reactive } from "vue";

export default {
  setup() {
    const state = reactive({ teacher: {} });
    console.log(state);

    setTimeout(() => {
      state.teacher = {
        name: "venus",
        age: 30,
      };
    }, 1000);

    const handleTeacherChange = () => {
      state.teacher = {
        name: "alias",
        age: 40,
      };
      state.teacher.name = "tom";
    };

    return { state, handleTeacherChange };
  },
};
</script>
  1. toRefs() 將一個(gè)響應(yīng)式對(duì)象轉(zhuǎn)換為一個(gè)普通對(duì)象变屁,這個(gè)普通對(duì)象的每個(gè)屬性都是指向源對(duì)象相應(yīng)屬性的 ref
    常用于批量解構(gòu) reactive()包裝的響應(yīng)式對(duì)象眼俊,將響應(yīng)式對(duì)象的某些屬性暴露給模板使用
<template>
  <div>教師姓名:{{ teacher.name }}</div>
  <div>教師年齡:{{ teacher.age }}</div>
  <button @click="handleTeacherChange()">change teacher</button>
</template>

<script>
import { reactive, toRefs } from "vue";

export default {
  setup() {
    const state = reactive({ teacher: {} });
    console.log(state);

    setTimeout(() => {
      state.teacher = {
        name: "venus",
        age: 30,
      };
    }, 1000);

    const handleTeacherChange = () => {
      state.teacher = {
        name: "alias",
        age: 40,
      };
      state.teacher.name = "tom";
    };

    return { ...toRefs(state), handleTeacherChange };
  },
};
</script>
  1. toRef() 是基于響應(yīng)式對(duì)象(reactive 或者 ref 包裝的對(duì)象)上的一個(gè)屬性,創(chuàng)建一個(gè)對(duì)應(yīng)的 ref粟关。這樣創(chuàng)建的 ref 與其源屬性保持同步
    常用于單獨(dú)解構(gòu) reactive()包裝的響應(yīng)式對(duì)象疮胖,將響應(yīng)式對(duì)象的某個(gè)屬性暴露給模板使用,
    最常用的是 props 參數(shù)解構(gòu)(由于 props 解構(gòu)后會(huì)失去響應(yīng)式功能,所以需要通過 toRef()解構(gòu)需要的屬性)
<template>
  <div>
    <div>{{ state.foo }}</div>
    <div>{{ fooRef }}</div>
  </div>
</template>

<script setup>
import { reactive, toRef } from "vue";
const state = reactive({
  foo: 1,
  bar: 2,
});

const fooRef = toRef(state, "foo");

// 更改該 ref 會(huì)更新源屬性
fooRef.value++;
console.log(state.foo); // 2

// 更改源屬性也會(huì)更新該 ref
state.foo++;
console.log(fooRef.value); // 3
</script>
  1. vue3 中 ref()澎灸、reactive() 包裝的響應(yīng)式數(shù)據(jù)是深層次的院塞,解決了 vue2 中對(duì)象數(shù)據(jù)刪除、增加屬性和通過索引改變數(shù)組值視圖不更新問題
<template>
  <div>
    <ul>
      <li v-for="item in names" :key="item">{{ item }}</li>
    </ul>
    <button @click="replaceNames">replaceNames</button>
  </div>
  <hr />
  <div>
    <div>
      <ul>
        <li>{{ userinfo.username }}</li>
        <li>{{ userinfo.password }}</li>
      </ul>
      <div><button @click="deleteInfo">deleteInfo</button></div>
      <div><button @click="addInfo">addInfo</button></div>
    </div>
  </div>
</template>

<script setup>
import { ref } from "vue";

const names = ref(["卡羅", "老蔫兒", "賊大膽"]);
function replaceNames() {
  names.value[0] = "卡梅利多";
}

const userinfo = ref({ username: "卡梅利多", password: "123456" });
function deleteInfo() {
  delete userinfo.value.username;
}
function addInfo() {
  userinfo.value.username = "卡梅利多";
}
</script>

四性昭、定義數(shù)據(jù)的其他方式 --- shallowReactive()拦止、shallowRef()、readonly()巩梢、shallowReadonly()创泄、toRaw()、markRaw()

  1. shallowReactive() 是 reactive() 的淺層作用形式
    只有第一層是響應(yīng)式數(shù)據(jù)
  2. shallowRef() 是 ref() 的淺層作用形式
    只有對(duì)第一次 .value 的訪問是響應(yīng)式的括蝠,常常用于對(duì)大型數(shù)據(jù)結(jié)構(gòu)的性能優(yōu)化或是與外部的狀態(tài)管理系統(tǒng)集成
  3. readonly() 創(chuàng)建深層只讀數(shù)據(jù)
    每一層都不可修改,常用于后代組件傳參時(shí)饭聚,禁止子組件修改響應(yīng)式數(shù)據(jù)(單向數(shù)據(jù)流)
  4. shallowReadonly() 是 readonly() 的淺層作用形式
    只有第一層不可修改忌警,其他層可修改,且是響應(yīng)式數(shù)據(jù)
  5. toRaw() 傳入代理對(duì)象返回原始對(duì)象
    將響應(yīng)式數(shù)據(jù)變成原始數(shù)據(jù)(暫時(shí))
  6. markRaw() 傳入代理對(duì)象返回原始對(duì)象秒梳,不可再次轉(zhuǎn)變?yōu)轫憫?yīng)式對(duì)象
    將響應(yīng)式數(shù)據(jù)變成原始數(shù)據(jù)(永久)

五法绵、響應(yīng)式數(shù)據(jù)類型的判斷 isReactive(), isReadonly(), isRef()

<template>
  <h1>App</h1>
  <div>{{ refCount }}</div>
  <div>{{ ReactiveCount.count }}</div>
  <div>{{ readonlyCount }}</div>
</template>

<script setup>
import { isReactive, isReadonly, isRef, reactive, readonly, ref } from 'vue'

const refCount = ref(1)
const ReactiveCount = reactive({
  count: 1
})
const readonlyCount = readonly({
  count: 1
})

console.log(isRef(refCount)) // true
console.log(isReactive(ReactiveCount)) // true
console.log(isReadonly(readonlyCount)) // true
</script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市酪碘,隨后出現(xiàn)的幾起案子朋譬,更是在濱河造成了極大的恐慌,老刑警劉巖兴垦,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件徙赢,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡探越,警方通過查閱死者的電腦和手機(jī)狡赐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钦幔,“玉大人枕屉,你說我怎么就攤上這事±鹎猓” “怎么了搀擂?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長卷玉。 經(jīng)常有香客問我哨颂,道長,這世上最難降的妖魔是什么揍庄? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任咆蒿,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沃测。我一直安慰自己缭黔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布蒂破。 她就那樣靜靜地躺著馏谨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪附迷。 梳的紋絲不亂的頭發(fā)上惧互,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音喇伯,去河邊找鬼喊儡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛稻据,可吹牛的內(nèi)容都是我干的艾猜。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼捻悯,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼匆赃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起今缚,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤算柳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后姓言,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞬项,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年事期,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了滥壕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡兽泣,死狀恐怖绎橘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情唠倦,我是刑警寧澤称鳞,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站稠鼻,受9級(jí)特大地震影響冈止,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜候齿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一熙暴、第九天 我趴在偏房一處隱蔽的房頂上張望闺属。 院中可真熱鬧,春花似錦周霉、人聲如沸掂器。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽国瓮。三九已至,卻和暖如春狞谱,著一層夾襖步出監(jiān)牢的瞬間乃摹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工跟衅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留孵睬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓伶跷,卻偏偏與公主長得像肪康,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撩穿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容