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

Vue中數(shù)組與對(duì)象修改觸發(fā)頁(yè)面更新的機(jī)制與原理解析

 更新時(shí)間:2022年12月10日 09:26:52   作者:Hello_Yeck  
這篇文章主要介紹了Vue中關(guān)于數(shù)組與對(duì)象修改觸發(fā)頁(yè)面更新的機(jī)制與原理簡(jiǎn)析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

Vue中關(guān)于數(shù)組與對(duì)象修改觸發(fā)頁(yè)面更新的機(jī)制與原理簡(jiǎn)析

相關(guān)問(wèn)題

數(shù)組

使用索引直接賦值與直接修改數(shù)組length時(shí),不會(huì)觸發(fā)頁(yè)面更新。

例如:

<script>
export default {
    name: "HomeView",
    data: () => ({
        list1: ["A", "B"],
    }),
    methods: {
        btnClicked() {
            this.list1[0] = "C"
            this.list1[2] = "C"
        },
    },
}
</script>

或是

<script>
export default {
    name: "HomeView",
    data: () => ({
        list1: [{ text: "123" }, { text: "456" }],
    }),
    methods: {
        btnClicked() {
            this.list1[0] = { text: "789" }
        },
    },
}
</script>

頁(yè)面并不會(huì)觸發(fā)更新。

對(duì)象

頁(yè)面初始化完成后,在方法中直接對(duì)data內(nèi)聲明對(duì)象當(dāng)前不存在的屬性進(jìn)行賦值來(lái)為對(duì)象新增屬性時(shí),頁(yè)面也不會(huì)響應(yīng)渲染。

例如:

<script>
export default {
    name: "HomeView",
    data: () => ({
        obj1: { a: "a", b: "b" },
    }),
    methods: {
        btnClicked() {
            this.obj1.c = "c"
        },
    },
}
</script>

頁(yè)面并不會(huì)觸發(fā)更新。

原因

Vue在初始化時(shí)會(huì)將data內(nèi)所有的屬性嵌套遍歷并重寫(xiě)其Getter和Setter方法,借此實(shí)現(xiàn)響應(yīng)式屬性。

然而對(duì)于在頁(yè)面渲染完成后加入data的屬性,Vue并不會(huì)將其變?yōu)轫憫?yīng)式。

一些深入的探究

數(shù)組

Vue對(duì)于數(shù)組是僅將其對(duì)應(yīng)下標(biāo)的對(duì)象的屬性變?yōu)轫憫?yīng)式,而這個(gè)下標(biāo)本身是無(wú)法成為響應(yīng)式的。

data: () => ({
        list1: [{ text: "123" }, { text: "456" }],
})

使用如上的data聲明。

方法A:

this.list1[0] = { text: "789" }

方法B:

this.list1[0].text = "789"

方法B可以被正確響應(yīng)而方法A不可以。

方法A將數(shù)組下標(biāo)為0的位置替換為了一個(gè)新的對(duì)象,而因?yàn)閿?shù)組下標(biāo)不是響應(yīng)式的,因此沒(méi)有觸發(fā)頁(yè)面刷新。

同時(shí),由于數(shù)組下標(biāo)為0的位置替換為了一個(gè)新的對(duì)象,而這個(gè)新的對(duì)象并沒(méi)有被配置為響應(yīng)式,那對(duì)于這個(gè)對(duì)象屬性的修改也不會(huì)觸發(fā)頁(yè)面更新。如下:

this.list1[0] = { text: "789" }
this.list1[0].text = "456"

由于新的對(duì)象的屬性并沒(méi)有被配置為響應(yīng)式,那么即使對(duì)這個(gè)對(duì)象的屬性進(jìn)行修改,頁(yè)面也不會(huì)被更新。

既然下標(biāo)本身無(wú)法成為響應(yīng)式,不妨嘗試:

<script>
export default {
    name: "HomeView",
    data: () => ({
        list1: ["A", "B"],
    }),
    methods: {
        btnClicked() {
            this.list1[0] = "C"
        },
    },
}
</script>

通過(guò)下標(biāo)修改數(shù)組的對(duì)應(yīng)值也無(wú)法觸發(fā)視圖更新。

對(duì)象

data: () => ({
        obj1: { a: { text: "a" }, b: { text: "b" } },
}),

使用如上的data聲明。

this.obj1.a = { text: "c" }

成功觸發(fā)視圖更新。

與數(shù)組下標(biāo)不同,對(duì)象的屬性在初始化是被定義為響應(yīng)式的,因此直接對(duì)屬性賦值對(duì)象是能夠觸發(fā)視圖更新的。不像對(duì)數(shù)組的對(duì)應(yīng)下標(biāo)賦值而不會(huì)觸發(fā)視圖更新。

解決方案

數(shù)組

1. 內(nèi)置API

如果需要向數(shù)組加入新的成員,則可以直接使用數(shù)組的push方法。

此外,下列數(shù)組方法也可以自動(dòng)的觸發(fā)視圖刷新:

  • push()
  • pop()
  • shift()
  • unshift()
  • splice()
  • sort()
  • reverse()

2. 將數(shù)組重新賦值,修改引用地址

為數(shù)組新增一個(gè)字符串成員"C"

this.list1 = this.list1.concat(["C"])

由于list1是data的屬性,list1的引用發(fā)生改變,就會(huì)觸發(fā)視圖更新。

修改數(shù)組的第一個(gè)值

let tempList = this.list1.concat([]) // 深拷貝,等價(jià)于一個(gè)新數(shù)組,使用slice,JSON都可以。
tempList[0] = "666"
this.list1 = tempList

通過(guò)原數(shù)組新建一個(gè)新數(shù)組,修改新數(shù)組后再將新數(shù)組賦值給原數(shù)組,由于原數(shù)組作為data的屬性,其引用被修改,觸發(fā)視圖更新。

3. Vue.$set() 方法

使用Vue.$set可以為data對(duì)象添加一個(gè)新的響應(yīng)式屬性,且觸發(fā)視圖更新。

定義:

Vue.$set(對(duì)象或數(shù)組, 對(duì)象屬性名或數(shù)組下標(biāo), 值)

向list1對(duì)象的0索引位置賦值一個(gè)新的響應(yīng)式對(duì)象,同時(shí)觸發(fā)視圖更新:

Vue.$set(this.list1, 0, { text: "789" })

如果在組件中應(yīng)使用this.$set來(lái)代替:

this.$set(this.list1, 0, { text: "789" })

對(duì)象

1. 將對(duì)象重新賦值,修改引用地址

思路與數(shù)組的類(lèi)同。

使用JSON、手寫(xiě)遞歸、lodash深拷貝均可,但如果對(duì)象內(nèi)含方法,則不能使用JSON來(lái)完成深拷貝。

深拷貝完成后修改對(duì)應(yīng)屬性后賦值給原對(duì)象即可。

2. Vue.$set() 方法

對(duì)象同樣可以使用$set() 方法修改。

定義:

Vue.$set(對(duì)象或數(shù)組, 對(duì)象屬性名或數(shù)組下標(biāo), 值)

將obj1對(duì)象的a屬性賦值為字符串"b"并觸發(fā)視圖更新:

Vue.$set(this.obj1, a, "b")

如果在組件內(nèi),則應(yīng)使用:

this.$set(this.obj1, a, "b")

到此這篇關(guān)于Vue中關(guān)于數(shù)組與對(duì)象修改觸發(fā)頁(yè)面更新的機(jī)制與原理簡(jiǎn)析的文章就介紹到這了,更多相關(guān)Vue數(shù)組與對(duì)象修改觸發(fā)頁(yè)面更新內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 實(shí)現(xiàn)shallowReadonly和isProxy功能示例詳解

    實(shí)現(xiàn)shallowReadonly和isProxy功能示例詳解

    這篇文章主要為大家介紹了實(shí)現(xiàn)shallowReadonly和isProxy功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • vue如何跳轉(zhuǎn)到其他頁(yè)面

    vue如何跳轉(zhuǎn)到其他頁(yè)面

    跳轉(zhuǎn)到指定URL,向history棧添加一個(gè)新的紀(jì)錄,點(diǎn)擊后退會(huì)返回至上一個(gè)頁(yè)面,這篇文章給大家介紹vue如何跳轉(zhuǎn)到其他頁(yè)面,包括無(wú)參跳轉(zhuǎn)和帶參跳轉(zhuǎn),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-10-10
  • Vue.js基礎(chǔ)之監(jiān)聽(tīng)子組件事件v-on及綁定數(shù)據(jù)v-model學(xué)習(xí)

    Vue.js基礎(chǔ)之監(jiān)聽(tīng)子組件事件v-on及綁定數(shù)據(jù)v-model學(xué)習(xí)

    這篇文章主要為大家介紹了Vue.js基礎(chǔ)之監(jiān)聽(tīng)子組件事件v-on及綁定數(shù)據(jù)v-model學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • 一篇超詳細(xì)的Vue-Router手把手教程

    一篇超詳細(xì)的Vue-Router手把手教程

    這篇文章主要給大家介紹了關(guān)于Vue-Router的相關(guān)資料,vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,適合用于構(gòu)建單頁(yè)面應(yīng)用,本文通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-08-08
  • vue axios整合使用全攻略

    vue axios整合使用全攻略

    這篇文章主要介紹了vue axios整合使用全攻略,需要的朋友可以參考下
    2018-05-05
  • vue.js中關(guān)于點(diǎn)擊事件方法的使用(click)

    vue.js中關(guān)于點(diǎn)擊事件方法的使用(click)

    這篇文章主要介紹了vue.js中關(guān)于點(diǎn)擊事件方法的使用(click),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • vue執(zhí)行配置選項(xiàng)npm?run?serve的本質(zhì)圖文詳解

    vue執(zhí)行配置選項(xiàng)npm?run?serve的本質(zhì)圖文詳解

    本地開(kāi)發(fā)一般通過(guò)執(zhí)行npm run serve命令來(lái)啟動(dòng)項(xiàng)目,那這行命令到底存在什么魔法?下面這篇文章主要給大家介紹了關(guān)于vue執(zhí)行配置選項(xiàng)npm?run?serve的本質(zhì)的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • Vue3之狀態(tài)管理器(Pinia)詳解及使用方式

    Vue3之狀態(tài)管理器(Pinia)詳解及使用方式

    這篇文章主要介紹了Vue3之狀態(tài)管理器(Pinia)詳解及使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 詳解vue-cli中模擬數(shù)據(jù)的兩種方法

    詳解vue-cli中模擬數(shù)據(jù)的兩種方法

    這篇文章主要介紹了vue-cli中模擬數(shù)據(jù)的兩種方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-07-07
  • vue+vuex+json-seiver實(shí)現(xiàn)數(shù)據(jù)展示+分頁(yè)功能

    vue+vuex+json-seiver實(shí)現(xiàn)數(shù)據(jù)展示+分頁(yè)功能

    這篇文章主要介紹了vue+vuex+json-seiver實(shí)現(xiàn)數(shù)據(jù)展示+分頁(yè)功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04

最新評(píng)論

八宿县| 名山县| 光泽县| 五峰| 津市市| 宁南县| 扶绥县| 贵南县| 宁陕县| 浪卡子县| 武鸣县| 天等县| 鄯善县| 龙泉市| 新密市| 抚松县| 尤溪县| 曲靖市| 远安县| 临夏县| 丰顺县| 金阳县| 新田县| 浦江县| 全南县| 南陵县| 石河子市| 苍溪县| 县级市| 丰城市| 获嘉县| 芮城县| 鄂托克旗| 白银市| 巫山县| 大石桥市| 铁岭市| 深州市| 平顺县| 焉耆| 安岳县|