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

vue3.0 Reactive數(shù)據(jù)更新頁(yè)面沒(méi)有刷新的問(wèn)題

 更新時(shí)間:2023年04月19日 16:45:32   作者:aibujin  
這篇文章主要介紹了vue3.0 Reactive數(shù)據(jù)更新頁(yè)面沒(méi)有刷新的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

vue3.0 Reactive數(shù)據(jù)更新頁(yè)面沒(méi)有刷新

vue 3.0 ref 和 Reactive 數(shù)據(jù)響應(yīng)式,以及使用 Reactive 數(shù)據(jù)已更新但頁(yè)面沒(méi)有同步刷新異常

Vue 3.0 中我們使用 reactive() 定義的響應(yīng)式數(shù)據(jù)的時(shí)候,當(dāng)我們對(duì)象再次賦值,我們發(fā)現(xiàn)數(shù)據(jù)已經(jīng)修改成功,但是頁(yè)?并沒(méi)有自動(dòng)渲染成最新的數(shù)據(jù);

這時(shí)我們可以改成 ref () 或者對(duì) reactive() 綁定的數(shù)據(jù)類型下點(diǎn)功夫;

  • ref()

ref() 接受一個(gè)內(nèi)部值并返回一個(gè)響應(yīng)式且可變的 ref 對(duì)象。ref 對(duì)象僅有一個(gè) .value property,指向該內(nèi)部值

<template>
? <div>
? ? <button @click="changeMsg">更改數(shù)據(jù)</button>
? ? <div>{{ message }}</div>
? </div>
</template>

<script setup lang="ts">
import {ref} from 'vue'

/**
?* ? ref() 基礎(chǔ)用法
?*/
?
let message = ref<string | number>("測(cè)試數(shù)據(jù)")

/**
?* ? 更改 ref 數(shù)據(jù)
?*/
??
const changeMsg = () => {
? ?message.value = "更改測(cè)試數(shù)據(jù)"
}
</script>
  • reactive()

reactive() 主要時(shí)用來(lái)綁定一些復(fù)雜的數(shù)據(jù)類型,比如(對(duì)象、數(shù)組) ;它不可以綁定普通的數(shù)據(jù)類型,否則會(huì)報(bào)錯(cuò);如果我們需要綁定普通的數(shù)據(jù)類型,建議使用上面的 ref()

<template>
? <div>
? ? <button @click="changeObj">更改數(shù)據(jù)</button>
? ? <div> {{obj.data}} </div>
? ? <div> {{obj.dataBoolean}} </div>
? ? <div> {{obj.dataArr}} </div>
? </div>
</template>

<script setup lang="ts">
import {reactive} from 'vue'

/**
?* ? reactive() 基礎(chǔ)用法
?*/
?
const obj = reactive({
? ? data: '',
? ? dataBoolean: false,
? ? dataArr: <number[]>[],
})

/**
?* ? 更改 reactive() 數(shù)據(jù)
?*/
?const changeObj = () => {
? ? ?obj .data = '測(cè)試數(shù)據(jù)'
? ? ?obj .dataBoolean = true
? ? ?obj .dataArr = [1, 2, 3, 4, 5, 6]
?}

</script>

vue3.0中的reactive用法

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

在 Vue2 中響應(yīng)式數(shù)據(jù)是通過(guò) defineProperty 來(lái)實(shí)現(xiàn)的,

在 Vue3 中響應(yīng)式數(shù)據(jù)是通過(guò) ES6 的 Proxy來(lái)實(shí)現(xiàn)的。

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

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

  • 默認(rèn)情況下,修改對(duì)象無(wú)法實(shí)現(xiàn)界面的數(shù)據(jù)綁定更新。
  • 如果需要更新,需要進(jìn)行重新賦值。(即不允許直接操作數(shù)據(jù),需要放個(gè)新的數(shù)據(jù)來(lái)替代原數(shù)據(jù))

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

基本類型(數(shù)字、字符串、布爾值)在 reactive 中無(wú)法被創(chuàng)建成 proxy 對(duì)象,也就無(wú)法實(shí)現(xiàn)監(jiān)聽(tī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>

08utpj.png

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

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

08uN1s.png

出現(xiàn)提示

value cannot be made reactive: 0

而輸出的值確實(shí)發(fā)生了變化,只不過(guò)這種變化并沒(méi)有反饋到界面上,也就是說(shuō)并沒(méi)有實(shí)現(xiàn)雙向數(shù)據(jù)綁定。當(dāng)然,如果是 ref 的話,就不存在這樣的問(wèn)題。而如果要使用 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 次)。

08u8AS.png

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

08uGtg.png

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

深層的、對(duì)象內(nèi)部的變化也能被察覺(jué)到(注意下面代碼中的 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>

08uJhQ.png

數(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>

08uUcn.png

在-reactive-使用-date-參數(shù)在 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>!

08uwn0.png

這里我先打印了 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>

也仍然不起效果。

08u0BV.png

08uB7T.png

顯然,對(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)。

08urAU.png

響應(yīng)式代理 vs. 原始對(duì)象

值得注意的是,reactive() 返回的是一個(gè)源對(duì)象的 Proxy,它和源對(duì)象是不相等的:

const raw = {}
const proxy = reactive(raw)
 
// 代理和原始對(duì)象不是全等的
console.log(proxy === raw) // false

只有代理是響應(yīng)式的,更改原始的對(duì)象不會(huì)觸發(fā)更新。因此,使用 Vue 的響應(yīng)式系統(tǒng)的最佳實(shí)踐是 僅使用代理作為狀態(tài)。

為保證訪問(wèn)代理的一致性,對(duì)同一個(gè)對(duì)象調(diào)用 reactive() 會(huì)總是返回同樣的代理,而對(duì)代理調(diào)用 reactive() 則會(huì)返回它自己:

// 在同一個(gè)對(duì)象上調(diào)用 reactive() 會(huì)返回相同的代理
console.log(reactive(raw) === proxy) // true
 
// 在一個(gè)代理上調(diào)用 reactive() 會(huì)返回它自己
console.log(reactive(proxy) === proxy) // true

這個(gè)規(guī)則對(duì)深層級(jí)的對(duì)象也適用。依靠深層響應(yīng)性,響應(yīng)式對(duì)象內(nèi)的深層級(jí)對(duì)象依然是代理:

const proxy = reactive({})
 
const raw = {}
proxy.nested = raw
 
console.log(proxy.nested === raw) // false

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue3+vite創(chuàng)建項(xiàng)目方式

    Vue3+vite創(chuàng)建項(xiàng)目方式

    本文介紹了如何使用Vite創(chuàng)建Vue項(xiàng)目,包括版本升級(jí)、命令變化以及配置vue-router、Vuex和AntDesignVue的方法,同時(shí),也提供了降級(jí)Vue?CLI以兼容Vue2項(xiàng)目的步驟
    2024-12-12
  • Vue實(shí)現(xiàn)電子簽名功能的完整代碼

    Vue實(shí)現(xiàn)電子簽名功能的完整代碼

    本文介紹了在Vue項(xiàng)目中實(shí)現(xiàn)電子簽名功能的步驟,包括將原始文檔轉(zhuǎn)換為圖片、使用`signature_pad`和`html2canvas`庫(kù)、調(diào)整簽名位置和縮放比例、合并圖片等步驟,并提供了完整的源碼,需要的朋友可以參考下
    2025-02-02
  • 詳解在vue中如何實(shí)現(xiàn)屏幕錄制與直播推流功能

    詳解在vue中如何實(shí)現(xiàn)屏幕錄制與直播推流功能

    屏幕錄制和直播推流是現(xiàn)代Web應(yīng)用中常用的功能,Vue作為一種流行的JavaScript框架,提供了一些工具和庫(kù),可以方便地實(shí)現(xiàn)屏幕錄制和直播推流功能,本文將介紹如何在Vue中進(jìn)行屏幕錄制和直播推流,需要的朋友可以參考下
    2024-01-01
  • vue3實(shí)現(xiàn)手機(jī)上可拖拽元素的組件

    vue3實(shí)現(xiàn)手機(jī)上可拖拽元素的組件

    這篇文章主要介紹了vue3實(shí)現(xiàn)手機(jī)上可拖拽元素的組件,用vue3實(shí)現(xiàn)一個(gè)可在手機(jī)上拖拽元素的組件,可拖拽至任意位置,并且可以防止拖拽元素移出屏幕邊緣
    2022-09-09
  • vue3.0+element表格獲取每行數(shù)據(jù)代碼示例

    vue3.0+element表格獲取每行數(shù)據(jù)代碼示例

    這篇文章主要給大家介紹了關(guān)于vue3.0+element表格獲取每行數(shù)據(jù)的相關(guān)資料,在element-ui中,你可以通過(guò)為表格的行綁定單擊事件來(lái)獲取表格中的一行數(shù)據(jù),需要的朋友可以參考下
    2023-09-09
  • vue實(shí)現(xiàn)禁止瀏覽器記住密碼功能的示例代碼

    vue實(shí)現(xiàn)禁止瀏覽器記住密碼功能的示例代碼

    這篇文章主要介紹了vue實(shí)現(xiàn)禁止瀏覽器記住密碼功能的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • vue寫h5頁(yè)面的方法總結(jié)

    vue寫h5頁(yè)面的方法總結(jié)

    在本篇內(nèi)容里小編給大家整理了關(guān)于vue寫h5頁(yè)面的方法以及注意點(diǎn)分析,有需要的朋友們跟著學(xué)習(xí)下吧。
    2019-02-02
  • vue-star評(píng)星組件開(kāi)發(fā)實(shí)例

    vue-star評(píng)星組件開(kāi)發(fā)實(shí)例

    下面小編就為大家分享一篇vue-star評(píng)星組件開(kāi)發(fā)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • Vue封裝全局過(guò)濾器Filters的步驟

    Vue封裝全局過(guò)濾器Filters的步驟

    這篇文章主要介紹了Vue封裝全局過(guò)濾器Filters的步驟,通過(guò)封裝vue全局過(guò)濾器實(shí)現(xiàn)filters的統(tǒng)一管理。感興趣的朋友可以了解下
    2020-09-09
  • 解決vue路由后界面沒(méi)有變化,但是鏈接有的問(wèn)題

    解決vue路由后界面沒(méi)有變化,但是鏈接有的問(wèn)題

    今天小編就為大家分享一篇解決vue路由后界面沒(méi)有變化,但是鏈接有的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09

最新評(píng)論

五寨县| 科尔| 雅江县| 天全县| 娄烦县| 永清县| 婺源县| 神农架林区| 桦川县| 历史| 五大连池市| 天津市| 许昌市| 大石桥市| 龙海市| 赤城县| 河西区| 汕尾市| 黎平县| 资阳市| 大石桥市| 两当县| 龙口市| 阿克陶县| 泽库县| 白银市| 班玛县| 涟水县| 黎城县| 洛扎县| 古田县| 蒙自县| 安义县| 九龙坡区| 永济市| 杭州市| 云南省| 平泉县| 大丰市| 华容县| 搜索|