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

Vue3初探之ref、reactive以及改變數(shù)組的值

 更新時(shí)間:2022年09月21日 12:01:16   作者:風(fēng)隨心飛飛  
在setup函數(shù)中,可以使用ref函數(shù)和reactive函數(shù)來(lái)創(chuàng)建響應(yīng)式數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Vue3初探之ref、reactive以及改變數(shù)組值的相關(guān)資料,需要的朋友可以參考下

概況

Vue3 里要實(shí)現(xiàn)數(shù)據(jù)的響應(yīng)式監(jiān)聽一共有兩種方式既:ref 和 reactive

他們既有區(qū)別又有聯(lián)系。

ref()

ref數(shù)據(jù)響應(yīng)式監(jiān)聽。ref 函數(shù)傳入一個(gè)值作為參數(shù),一般傳入基本數(shù)據(jù)類型,返回一個(gè)基于該值的響應(yīng)式Ref對(duì)象,該對(duì)象中的值一旦被改變和訪問,都會(huì)被跟蹤到,就像我們改寫后的示例代碼一樣,通過修改 count.value 的值,可以觸發(fā)模板的重新渲染,顯示最新的值

reactive()

reactive

reactive 是 Vue3 中提供的實(shí)現(xiàn)響應(yīng)式數(shù)據(jù)的?法。

在 Vue2 中響應(yīng)式數(shù)據(jù)是通過 defineProperty 來(lái)實(shí)現(xiàn)的,在 Vue3 中響應(yīng)式數(shù)據(jù)是通過 ES6 的 Proxy 來(lái)實(shí)現(xiàn)的。具體參照,。

reactive 參數(shù)必須是對(duì)象 (json / arr)

本質(zhì): 就是將傳?的數(shù)據(jù)包裝成?個(gè)Proxy對(duì)象

如果給 reactive 傳遞了其它對(duì)象(如Date對(duì)象)

默認(rèn)情況下,修改對(duì)象?法實(shí)現(xiàn)界?的數(shù)據(jù)綁定更新。

如果需要更新,需要進(jìn)?重新賦值。(即不允許直接操作數(shù)據(jù),需要放個(gè)新的數(shù)據(jù)來(lái)替代原數(shù)據(jù))

在 reactive 使?基本類型參數(shù)

基本類型(數(shù)字、字符串、布爾值)在 reactive 中?法被創(chuàng)建成 proxy 對(duì)象,也就?法實(shí)現(xiàn)監(jiān)聽。?法實(shí)現(xiàn)響應(yīng)式

<template>
<div>
<p>{{msg}}</p>
<button @click="c">button</button>
</div>
</template>
<script>
import { reactive } from 'vue'
export default {
name: 'App',
setup() {
let msg = reactive(0)
function c() {
console.log(msg);
msg ++;
}
return {
msg,
c
};
}
}
</script>

點(diǎn)擊 button ,我們期望的結(jié)果是數(shù)字從 0 變成 1,然?實(shí)際上界?上的數(shù)字并沒有發(fā)?任何改變。

查看控制臺(tái),它的輸出是這樣的(我點(diǎn)了 3 次)

出現(xiàn)提?

value cannot be made reactive: 0

?輸出的值確實(shí)發(fā)?了變化,只不過這種變化并沒有反饋到界?上,也就是說(shuō)并沒有實(shí)現(xiàn)雙向數(shù)據(jù)綁定。當(dāng)然,如果是 ref 的話,就不存在
這樣的問題。?如果要使? reactive ,我們需要將參數(shù)從 基本類型 轉(zhuǎn)化為 對(duì)象。

<template>
<div>
<p>{{msg.num}}</p>
<button @click="c">button</button>
</div>
</template>
<script>
import { reactive } from 'vue'
export default {
name: 'App',
setup() {
let msg = reactive({
num: 0
})
function c() {
console.log(msg);
msg.num ++;
}
return {
msg,
c
};
}
}
</script>

將參數(shù)替換成了對(duì)象 {num: 0},此時(shí),點(diǎn)擊按鈕界?就會(huì)產(chǎn)?改變(我點(diǎn)了 3 次)。

在控制臺(tái)打印消息

可以看到,msg 成功被創(chuàng)建成了 proxy 對(duì)象,他通過劫持對(duì)象的 get 和 set ?法實(shí)現(xiàn)了對(duì)象的雙向數(shù)據(jù)綁定。

深層的、對(duì)象內(nèi)部的變化也能被察覺到(注意下?代碼中的 inner )

<template>
<div>
<p>{{msg.num.inner}}</p>
<button @click="c">button</button>
</div>
</template>
<script>
import { reactive } from 'vue'
export default {
name: 'App',
setup() {
let msg = reactive({
num: {
inner: 0
}
})
function c() {
console.log(msg);
msg.num.inner ++;
}
return {
msg,
c
};
}
}
</script>

數(shù)組變化也不在話下。

<template>
<div>
<p>{{msg}}</p>
<button @click="c">button</button>
</div>
</template>
<script>
import { reactive } from 'vue'
export default {
name: 'App',
setup() {
let msg = reactive([1, 2, 3])
function c() {
console.log(msg);
msg[0] += 1;
msg[1] = 5;
}
return {
msg,
c
};
}
}
</script>

在 reactive 使? Date 參數(shù)

如果參數(shù)不是數(shù)組、對(duì)象,?是稍微奇怪?點(diǎn)的數(shù)據(jù)類型,例如說(shuō) Date ,那么?煩?來(lái)了。

<template>
<div>
<p>{{msg}}</p>
<button @click="c">button</button>
</div>
</template>
<script>
import { reactive } from 'vue'
export default {
name: 'App',
setup() {
let msg = reactive(new Date())
function c() {
console.log(msg);
msg.setDate(msg.getDate() + 1);
console.log(msg);
}
return {
msg,
c
};
}
}
</script>

這?我先打印了 msg 兩次,可以看到,點(diǎn)擊?次 button ,msg 的數(shù)據(jù)是存在變化的,但界?并未發(fā)?變化,同時(shí)我們發(fā)現(xiàn)在控制臺(tái)
?,msg 并未被識(shí)別成 proxy。

就算我們把 Date 放在對(duì)象?,就像這樣

<template>
<div>
<p>{{msg.date}}</p>
<button @click="c">button</button>
</div>
</template>
<script>
import { reactive } from 'vue'
export default {
name: 'App',
setup() {
let msg = reactive({
date: new Date()
});
function c() {
console.log(msg);
msg.date.setDate(msg.date.getDate() + 1);
console.log(msg);
}
return {
msg,
c
};
}
}
</script>

也仍然不起效果。

顯然,對(duì)于這種數(shù)據(jù)類型,我們需要做特殊處理。

這個(gè)特殊處理就是重新賦值(,?不是直接修改原來(lái)的值)。

<template>
<div>
<p>{{msg.date}}</p>
<button @click="c">button</button>
</div>
</template>
<script>
import { reactive } from 'vue'
export default {
name: 'App',
setup() {
let msg = reactive({
date: new Date()
});
function c() {
console.log(msg);
msg.date.setDate((msg.date.getDate() + 1));
msg.date = new Date(msg.date);
console.log(msg);
}
return {
msg,
c
};
}
}
</script>

這?我采?了拷貝的?案重新賦值了 msg.date,界?成功發(fā)?了變化(?期 + 1)。

vue3中改變數(shù)組的值

let arr = reactive([{id:1},{id:2}])

不可行:arr=[], arr = reactive([])

可行:arr.splice(0,arr.length)
arr.length = 0

原因:前者創(chuàng)建了新對(duì)象,頁(yè)面渲染的原對(duì)象還是沒有改變;后者改變的是原頁(yè)面對(duì)象

總結(jié)

到此這篇關(guān)于Vue3初探之ref、reactive以及改變數(shù)組值的文章就介紹到這了,更多相關(guān)Vue3 ref reactive及改變數(shù)組值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • el-table表格動(dòng)態(tài)合并相同數(shù)據(jù)單元格(可指定列+自定義合并)

    el-table表格動(dòng)態(tài)合并相同數(shù)據(jù)單元格(可指定列+自定義合并)

    工作時(shí)遇到的el-table合并單元格的需求,本文主要介紹了el-table表格動(dòng)態(tài)合并相同數(shù)據(jù)單元格(可指定列+自定義合并),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Vue路由實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的示例代碼

    Vue路由實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的示例代碼

    根據(jù)登錄的角色不一樣,實(shí)現(xiàn)不同的路由展示,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-04-04
  • vue中按鈕操作完刷新頁(yè)面的實(shí)現(xiàn)

    vue中按鈕操作完刷新頁(yè)面的實(shí)現(xiàn)

    這篇文章主要介紹了vue中按鈕操作完刷新頁(yè)面的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • vue中關(guān)于confirm確認(rèn)框的用法

    vue中關(guān)于confirm確認(rèn)框的用法

    這篇文章主要介紹了vue中關(guān)于confirm確認(rèn)框的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • vue-cli如何添加less 以及sass

    vue-cli如何添加less 以及sass

    本篇文章主要介紹了vue-cli如何添加less 以及sass,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-07-07
  • vue項(xiàng)目使用node連接數(shù)據(jù)庫(kù)的方法(前后端分離)

    vue項(xiàng)目使用node連接數(shù)據(jù)庫(kù)的方法(前后端分離)

    這篇文章主要介紹了vue項(xiàng)目使用node連接數(shù)據(jù)庫(kù)(前后端分離),本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • Vue3.js自定義組件 v-model詳解

    Vue3.js自定義組件 v-model詳解

    在Vue3 中,v-model是用于創(chuàng)建雙向數(shù)據(jù)綁定的指令,通常,我們使用該指令將任何 HTML 表單元素與一個(gè)變量綁定以收集輸入值,本文給大家介紹Vue3.js自定義組件 v-model,感興趣的朋友一起看看吧
    2023-10-10
  • Vite配置優(yōu)雅的code?spliiting代碼分割詳解

    Vite配置優(yōu)雅的code?spliiting代碼分割詳解

    這篇文章主要為大家介紹了Vite配置優(yōu)雅的code?spliiting代碼分割詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • vue中標(biāo)簽自定義屬性的使用及說(shuō)明

    vue中標(biāo)簽自定義屬性的使用及說(shuō)明

    這篇文章主要介紹了vue中標(biāo)簽自定義屬性的使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Vue.js 中的 v-model 指令及綁定表單元素的方法

    Vue.js 中的 v-model 指令及綁定表單元素的方法

    這篇文章主要介紹了Vue.js 中的 v-model 指令及綁定表單元素的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-12-12

最新評(píng)論

萝北县| 怀安县| 长泰县| 玛沁县| 三江| 大安市| 阳曲县| 纳雍县| 迁安市| 陵水| 义马市| 尚义县| 新郑市| 柯坪县| 平江县| 来宾市| 旌德县| 唐海县| SHOW| 来安县| 东台市| 托克逊县| 博客| 曲水县| 天门市| 札达县| 区。| 乐昌市| 嘉禾县| 石阡县| 苏尼特右旗| 金昌市| 年辖:市辖区| 浑源县| 西贡区| 繁昌县| 隆德县| 柘城县| 陕西省| 陵水| 石家庄市|