欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue3 reactive響應(yīng)式賦值頁面不渲染的解決

 更新時(shí)間:2022年08月12日 10:32:42   作者:原萊_  
這篇文章主要介紹了Vue3 reactive響應(yīng)式賦值頁面不渲染的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Vue3 reactive響應(yīng)式賦值頁面不渲染

問題描述

//聲明變量
let data = reactive([])
http().then(res=>{
? data = res.data
? console.log(data)
})
//data數(shù)據(jù)更新,頁面沒有渲染

1.因數(shù)據(jù)結(jié)構(gòu)而導(dǎo)致的未渲染解決方法

依舊是reactive,可以在外面包一層

//聲明
let state = reactive({
? data:[]
})
//賦值
state.data= res.data

改為ref賦值

//聲明
let data = ref([])
//賦值
data.value = res.data

2.因頁面節(jié)點(diǎn)未加載導(dǎo)致頁面未渲染解決方法

import {nextTick} from 'vue'
const func = async ()=>{
?? ?await nextTick()
?? ?state.data= res.data
}

3.因未指到具體點(diǎn)未渲染解決方法

const state = reactive({
?? ?data:[{
?? ??? ?name:'tom',
?? ??? ?age:3
?? ?},...]
})
const func = async ()=>{
?? ?//state.data.forEach(item=>{
?? ?//?? ?item.age = 4//未生效
?? ?//})
?? ?state.data.forEach((item,index)=>{
?? ??? ?state.data[index].age = 4
?? ?})
}

Vue3 響應(yīng)式原理-reactive

Reactivity模塊基本使用

<div id="app"></div>
<script src="./reactivity.global.js"></script>
<script>
? ? const { reactive, effect, shallowReactive, shallowReadonly, readonly } = VueReactivity;
? ? // let state = reactive({ name: 'jw', age: 30 });
? ? // const state = shallowReactive({ name: 'jw', age: 30 })
? ? // const state = readonly({ name: 'jw', age: 30 })
? ? const state = reactive({ name: 'jw', age: 30})
? ? effect(() => { // 副作用函數(shù) (effect執(zhí)行渲染了頁面)
? ? ? ? app.innerHTML = state.name + '今年' + state.age + '歲了'
? ? });
? ? setTimeout(() => {
? ? ? ? state.age++;
? ? }, 1000)
</script>

reactive方法會(huì)將對象變成proxy對象, effect中使用reactive對象時(shí)會(huì)進(jìn)行依賴收集,稍后屬性變化時(shí)會(huì)重新執(zhí)行effect函數(shù)。

編寫reactive函數(shù)

const reactiveMap = new WeakMap(); // 緩存列表
const mutableHandlers: ProxyHandler<object> = {
? ? get(target, key, receiver) {
? ? ? ? // 等會(huì)誰來取值就做依賴收集
? ? ? ? const res = Reflect.get(target, key, receiver);
? ? ? ? return res;
? ? },
? ? set(target, key, value, receiver) {
? ? ? ? // 等會(huì)賦值的時(shí)候可以重新觸發(fā)effect執(zhí)行
? ? ? ? const result = Reflect.set(target, key, value, receiver);
? ? ? ? return result;
? ? }
}
function createReactiveObject(target: object, isReadonly: boolean) {
? ? if (!isObject(target)) {
? ? ? ? return target
? ? }
? ? const exisitingProxy = reactiveMap.get(target); // 如果已經(jīng)代理過則直接返回代理后的對象?
? ? if (exisitingProxy) {
? ? ? ? return exisitingProxy;
? ? }
? ? const proxy = new Proxy(target, mutableHandlers); // 對對象進(jìn)行代理
? ? reactiveMap.set(target,proxy)
? ? return proxy;
}

這里必須要使用Reflect進(jìn)行操作,保證this指向永遠(yuǎn)指向代理對象

let school = {
? ? name:'zf',
? ? get num(){
? ? ? ? return this.name;
? ? }
}
let p = new Proxy(school,{
? ? get(target, key,receiver){
? ? ? ? console.log(key);
? ? ? ? // return Reflect.get(target,key,receiver)
? ? ? ? return target[key]
? ? }
})
p.num

將對象使用proxy進(jìn)行代理,如果對象已經(jīng)被代理過,再次重復(fù)代理則返回上次代理結(jié)果。 那么,如果將一個(gè)代理對象傳入呢?

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

相關(guān)文章

  • 讓ChatGPT解讀Vue3源碼過程解析

    讓ChatGPT解讀Vue3源碼過程解析

    這篇文章主要為大家介紹了讓ChatGPT解讀Vue3源碼過程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • vue+antv實(shí)現(xiàn)雷達(dá)圖的示例代碼

    vue+antv實(shí)現(xiàn)雷達(dá)圖的示例代碼

    這篇文章主要介紹了vue+antv實(shí)現(xiàn)雷達(dá)圖,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • vue中props值的傳遞詳解

    vue中props值的傳遞詳解

    這篇文章主要介紹了vue中props值的傳遞,在vue中父組件要正向的向子組件傳遞數(shù)據(jù)或者參數(shù),子組件接收到后根據(jù)參數(shù)的不同來進(jìn)行對應(yīng)的渲染,這個(gè)正向的數(shù)據(jù)傳遞在vue組件中就是通過props來實(shí)現(xiàn)的,需要的朋友可以參考下
    2009-05-05
  • 如何把vuejs打包出來的文件整合到springboot里

    如何把vuejs打包出來的文件整合到springboot里

    這篇文章主要介紹了如何把vuejs打包出來的文件整合到springboot里,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-07-07
  • element-ui中table表格的折疊和隱藏方式

    element-ui中table表格的折疊和隱藏方式

    這篇文章主要介紹了element-ui中table表格的折疊和隱藏方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 詳解vue移動(dòng)端項(xiàng)目的適配(以mint-ui為例)

    詳解vue移動(dòng)端項(xiàng)目的適配(以mint-ui為例)

    這篇文章主要介紹了詳解vue移動(dòng)端項(xiàng)目的適配(以mint-ui為例),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • Vue+scss白天和夜間模式切換功能的實(shí)現(xiàn)方法

    Vue+scss白天和夜間模式切換功能的實(shí)現(xiàn)方法

    這篇文章主要介紹了Vue+scss白天和夜間模式切換功能的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 使用Vue實(shí)現(xiàn)移動(dòng)端左滑刪除效果附源碼

    使用Vue實(shí)現(xiàn)移動(dòng)端左滑刪除效果附源碼

    這篇文章主要介紹了使用Vue實(shí)現(xiàn)移動(dòng)端左滑刪除效果,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • Vuex的初探與實(shí)戰(zhàn)小結(jié)

    Vuex的初探與實(shí)戰(zhàn)小結(jié)

    這篇文章主要介紹了Vuex的初探與實(shí)戰(zhàn)小結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • Vue3中echarts無法縮放的問題及解決方案

    Vue3中echarts無法縮放的問題及解決方案

    很多朋友在使用vue3+echarts5技術(shù)時(shí)會(huì)遇到echarts無法綻放的問題,今天小編就給大家分享下問題描述及解決方案,感興趣的朋友跟隨小編一起看看吧
    2022-11-11

最新評論