Vue3 reactive響應(yīng)式賦值頁(yè)面不渲染的解決
Vue3 reactive響應(yīng)式賦值頁(yè)面不渲染
問(wèn)題描述
//聲明變量 let data = reactive([]) http().then(res=>{ ? data = res.data ? console.log(data) }) //data數(shù)據(jù)更新,頁(yè)面沒(méi)有渲染
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.因頁(yè)面節(jié)點(diǎn)未加載導(dǎo)致頁(yè)面未渲染解決方法
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í)行渲染了頁(yè)面) ? ? ? ? app.innerHTML = state.name + '今年' + state.age + '歲了' ? ? }); ? ? setTimeout(() => { ? ? ? ? state.age++; ? ? }, 1000) </script>
reactive方法會(huì)將對(duì)象變成proxy對(duì)象, effect中使用reactive對(duì)象時(shí)會(huì)進(jìn)行依賴收集,稍后屬性變化時(shí)會(huì)重新執(zhí)行effect函數(shù)。
編寫reactive函數(shù)
const reactiveMap = new WeakMap(); // 緩存列表 const mutableHandlers: ProxyHandler<object> = { ? ? get(target, key, receiver) { ? ? ? ? // 等會(huì)誰(shuí)來(lái)取值就做依賴收集 ? ? ? ? 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)代理過(guò)則直接返回代理后的對(duì)象? ? ? if (exisitingProxy) { ? ? ? ? return exisitingProxy; ? ? } ? ? const proxy = new Proxy(target, mutableHandlers); // 對(duì)對(duì)象進(jìn)行代理 ? ? reactiveMap.set(target,proxy) ? ? return proxy; }
這里必須要使用Reflect進(jìn)行操作,保證this指向永遠(yuǎn)指向代理對(duì)象
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
將對(duì)象使用proxy進(jìn)行代理,如果對(duì)象已經(jīng)被代理過(guò),再次重復(fù)代理則返回上次代理結(jié)果。 那么,如果將一個(gè)代理對(duì)象傳入呢?
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- vue3的reactive賦值問(wèn)題解決
- Vue3中reactive變量重新賦值無(wú)法響應(yīng)的3種處理方法
- vue3 reactive定義的引用類型直接賦值導(dǎo)致數(shù)據(jù)失去響應(yīng)式問(wèn)題
- vue3使用reactive賦值后頁(yè)面不改變
- vue3中reactive數(shù)據(jù)被重新賦值后無(wú)法雙向綁定的解決
- vue3中reactive不能直接賦值的解決方案
- 關(guān)于vue3中的reactive賦值問(wèn)題
- vue3中reactive的對(duì)象清空所引發(fā)的問(wèn)題解決方案(清空不了和清空之后再去賦值就賦值不了)
相關(guān)文章
Vite圖片資源打包優(yōu)化的實(shí)現(xiàn)
本文主要介紹了Vite圖片資源打包優(yōu)化的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04vue中實(shí)現(xiàn)div可編輯并插入指定元素與樣式
這篇文章主要給大家介紹了關(guān)于vue中實(shí)現(xiàn)div可編輯并插入指定元素與樣式的相關(guān)資料,文中通過(guò)代碼以及圖文將實(shí)現(xiàn)的方法介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vue具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09vue3導(dǎo)入excel并解析excel數(shù)據(jù)渲染到表格中(純前端實(shí)現(xiàn))
在Vue中實(shí)現(xiàn)導(dǎo)出Excel有多種方式,可以通過(guò)前端實(shí)現(xiàn),也可以通過(guò)前后端配合實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于vue3導(dǎo)入excel并解析excel數(shù)據(jù)渲染到表格中的相關(guān)資料,文中介紹的方法是純前端實(shí)現(xiàn),需要的朋友可以參考下2024-04-04vuejs開(kāi)發(fā)組件分享之H5圖片上傳、壓縮及拍照旋轉(zhuǎn)的問(wèn)題處理
這篇文章主要介紹了vuejs開(kāi)發(fā)組件分享之H5圖片上傳、壓縮及拍照旋轉(zhuǎn)的問(wèn)題處理,需要的朋友可以參考下2017-03-03vue-element-admin中node-sass換成dart-sass,安裝依賴報(bào)code?128多種問(wèn)題的解決
這篇文章主要介紹了vue-element-admin中node-sass換成dart-sass,安裝依賴報(bào)code?128多種問(wèn)題的解決方法,本文給大家分享問(wèn)題原因分析及解決方法,需要的朋友可以參考下2023-02-02VUE前端實(shí)現(xiàn)token的無(wú)感刷新方式
這篇文章主要介紹了VUE前端實(shí)現(xiàn)token的無(wú)感刷新方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11