日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Vue3后臺(tái)系統(tǒng)刷新機(jī)制全解析:告別白屏與狀態(tài)丟失

Vue3后臺(tái)系統(tǒng)刷新機(jī)制全解析:告別白屏與狀態(tài)丟失 做完一段時(shí)間的 Vue3 后臺(tái)系統(tǒng)你會(huì)發(fā)現(xiàn)團(tuán)隊(duì)里最常聽到的一句話不是“這個(gè)需求怎么實(shí)現(xiàn)”而是“我這邊一刷新就白屏你過(guò)來(lái)看看”。微信上、工位上、代碼評(píng)審時(shí)到處都有它的身影。剛接手 Vue3 項(xiàng)目的時(shí)候我也在這種問(wèn)題上栽過(guò)好幾次跟頭甚至一度懷疑是不是路由寫錯(cuò)了、組件崩了、依賴裝錯(cuò)了。后來(lái)排查得多了才慢慢意識(shí)到Vue3 項(xiàng)目里的“刷新”真不是指按一下 F5 或者調(diào)一下window.location.reload()那么簡(jiǎn)單。它背后是一整套關(guān)于組件生命周期、路由渲染、狀態(tài)持久化、緩存策略的設(shè)計(jì)問(wèn)題。這篇文章我打算把這套東西重新捋一遍結(jié)合我自己在真實(shí)項(xiàng)目中踩過(guò)的坑聊聊 Vue3 里到底有哪些刷新頁(yè)面的思路為什么會(huì)導(dǎo)致白屏以及怎么從根上建立一個(gè)更絲滑的刷新體驗(yàn)。不管你是剛學(xué) Vue3 的新手還是已經(jīng)在后臺(tái)系統(tǒng)里摸爬滾打的同學(xué)只要你被白屏折磨過(guò)、被“刷新后狀態(tài)丟了”困擾過(guò)這篇內(nèi)容應(yīng)該能給你提供一些靠譜的參考。1. 刷新問(wèn)題背后的底層邏輯1.1 為什么 Vue3 項(xiàng)目里的“刷新”比想象中復(fù)雜先把話說(shuō)透Vue3 是一個(gè)單頁(yè)應(yīng)用框架SPA 的核心特點(diǎn)是頁(yè)面切換都在瀏覽器端完成不重新請(qǐng)求 HTML 文檔。這種模式下你點(diǎn)擊菜單從用戶列表跳到訂單列表其實(shí)是前端路由把 URL 切了一下然后 Vue Router 動(dòng)態(tài)地銷毀舊組件、掛載新組件整個(gè)過(guò)程瀏覽器沒(méi)有真正刷新過(guò)頁(yè)面。但“瀏覽器沒(méi)有刷新”和“頁(yè)面內(nèi)容更新了”這兩件事恰恰在 Vue3 里容易產(chǎn)生錯(cuò)位。你調(diào)用location.reload()強(qiáng)制刷新時(shí)瀏覽器會(huì)把整個(gè)文檔重新加載Vue 應(yīng)用從頭初始化一遍所有內(nèi)存狀態(tài)全部清空。這就像你正在一個(gè)編輯器里寫文檔突然把瀏覽器標(biāo)簽頁(yè)整個(gè)關(guān)掉重開之前沒(méi)保存的內(nèi)容自然全沒(méi)了。Vue3 的 Composition API 又帶來(lái)一個(gè)新的變量setup里的普通變量本身就是組件實(shí)例的一部分組件銷毀時(shí)全部消失。所以你在setup里let count 0刷新頁(yè)面后它回到初始狀態(tài)這很正常。但如果用戶從列表頁(yè)進(jìn)入詳情頁(yè)改了一些數(shù)據(jù)然后返回列表頁(yè)列表頁(yè)也被重新創(chuàng)建了之前滾動(dòng)的位置、篩選條件、當(dāng)前頁(yè)碼全部歸零這就不一定是用戶想要的了。所以Vue3 項(xiàng)目里的刷新問(wèn)題本質(zhì)上是兩件事的博弈組件狀態(tài)的生命周期和用戶對(duì)“刷新”這個(gè)動(dòng)作的心理預(yù)期。我們要做的不是讓用戶不刷新而是搞清楚他為什么刷、刷新后哪些東西該保留、哪些東西該重建。1.2 Vue2 與 Vue3 刷新思維的差異Vue2 時(shí)代解決刷新問(wèn)題方案比較固定大多是this.$forceUpdate()硬觸發(fā)視圖更新或者通過(guò)v-if重新掛載組件。比如最常見的“刷新列表”需求你直接在父組件里把childVisible設(shè)為 false再 set 個(gè) true子組件就重新 mounted 了。這種寫法能用但很脆。Vue3 里這些經(jīng)驗(yàn)有些還能用有些已經(jīng)不太合適了。先看$forceUpdateVue3 里它雖然還在但官方已經(jīng)不建議把它當(dāng)成常規(guī)手段因?yàn)樗谋举|(zhì)是跳過(guò)響應(yīng)式追蹤強(qiáng)制更新用的次數(shù)多了容易掩蓋真實(shí)的數(shù)據(jù)問(wèn)題。再看v-if重建這個(gè)思路本身沒(méi)錯(cuò)但 Vue3 的組件結(jié)構(gòu)更復(fù)雜模板里一堆v-if嵌套不僅難維護(hù)還會(huì)讓transition和動(dòng)效失效。Vue3 更推薦的做法是把刷新需求拆開按場(chǎng)景選方案。需要重置組件內(nèi)部狀態(tài)的用key變更最合適需要重新拉取后端數(shù)據(jù)的用watch監(jiān)聽路由、用onActivated鉤子響應(yīng)數(shù)據(jù)變化需要維持全局信息的交給 Pinia 統(tǒng)一管理。這些方案沒(méi)有一招鮮但組合起來(lái)基本能覆蓋你在后臺(tái)管理系統(tǒng)里遇到的所有刷新場(chǎng)景。我對(duì) Vue2 項(xiàng)目里到處找刷新 hack、在幾十個(gè)組件里塞forceUpdate的那種日子記憶猶新。Vue3 給了我們更清晰的設(shè)計(jì)路徑但如果還是照著舊習(xí)慣寫那項(xiàng)目的白屏率不會(huì)比 Vue2 低只會(huì)更高。準(zhǔn)確地說(shuō)不管哪個(gè)版本刷新這件事都應(yīng)該在設(shè)計(jì)階段就想清楚而不是等到用戶罵了再補(bǔ)。2. 白屏問(wèn)題從哪來(lái)2.1 首屏加載白屏打包體積與資源路徑的坑很多 Vue3 項(xiàng)目的白屏問(wèn)題第一步就掛在初始加載上。開發(fā)環(huán)境跑著好好的一打包部署到服務(wù)器就打不開或者打開后白屏控制臺(tái)一堆資源 404。這類問(wèn)題八成出在靜態(tài)資源的 base 路徑上。Vue3 Vite 項(xiàng)目里默認(rèn)的base是/意思是構(gòu)建出來(lái)的 JS、CSS 路徑都是/assets/xxx.js。如果你的部署環(huán)境不是放在域名根路徑下而是放在https://example.com/admin/這種二級(jí)目錄下那么訪問(wèn)時(shí)瀏覽器就會(huì)到https://example.com/assets/xxx.js去加載自然找不到。我自己的處理方式是在.env.production里顯式寫一個(gè)VITE_PUBLIC_PATH然后在vite.config.js里這樣引用import { defineConfig, loadEnv } from vite import vue from vitejs/plugin-vue export default defineConfig(({ mode }) { const env loadEnv(mode, process.cwd()) return { base: env.VITE_PUBLIC_PATH || /, plugins: [vue()], build: { chunkSizeWarningLimit: 1500, rollupOptions: { output: { manualChunks: { vue: [vue, vue-router, pinia], echarts: [echarts] } } } } } })這樣一來(lái)不管部署到根路徑還是二級(jí)目錄只要改環(huán)境變量就能解決資源路徑問(wèn)題。首屏白屏的另一大元兇是打包體積過(guò)大Vue 全家桶加上圖表庫(kù)、UI 庫(kù)全塞進(jìn)一個(gè) bundle在弱網(wǎng)環(huán)境里下載 JS 就要十幾秒白屏期自然長(zhǎng)。解決辦法是路由懶加載按需加載頁(yè)面組件配合manualChunks把第三方庫(kù)拆開讓首屏只加載當(dāng)前頁(yè)面必需的內(nèi)容。2.2 路由切換白屏組件沒(méi)渲染出來(lái)還有一種很折磨人的白屏是頁(yè)面能打開但跳轉(zhuǎn)到某個(gè)特定路由時(shí)白屏而且控制臺(tái)沒(méi)有明顯報(bào)錯(cuò)或者報(bào)錯(cuò)了也看不太明白。我曾經(jīng)在一個(gè) Vue3 后臺(tái)系統(tǒng)里遇到過(guò)一個(gè)單點(diǎn)從任何一個(gè)頁(yè)面點(diǎn)進(jìn)“系統(tǒng)設(shè)置”內(nèi)容區(qū)就是一片空白。排查過(guò)程是典型的逐步縮小范圍先確認(rèn)路由有沒(méi)有匹配上發(fā)現(xiàn) URL 變了菜單高亮也變了說(shuō)明路由跳轉(zhuǎn)成功。組件沒(méi)有渲染只有一個(gè)可能組件自身出了問(wèn)題。打開控制臺(tái)看到一個(gè)比較隱晦的報(bào)錯(cuò)信息大概是某個(gè)依賴的 undefined 方法。進(jìn)到組件源碼里一查發(fā)現(xiàn)onMounted里調(diào)了一個(gè)第三方插件的方法而這個(gè)插件在組件掛載失敗時(shí)沒(méi)有做空值判斷。組件在 minted 階段拋錯(cuò)后續(xù)渲染就直接中斷了于是白屏。這類路由切換白屏多數(shù)不是刷新引發(fā)的而是組件渲染異常。但它最容易在“刷新”時(shí)暴露出來(lái)因?yàn)樗⑿潞笏薪M件重新走一遍生命周期平時(shí)偶發(fā)的錯(cuò)誤此時(shí)集中爆發(fā)。我的建議是開發(fā)時(shí)把 Vue 的報(bào)錯(cuò)提示全部打開不要忽略黃色警告生產(chǎn)環(huán)境里給自己的應(yīng)用加一個(gè)全局錯(cuò)誤捕獲在app.config.errorHandler里記錄錯(cuò)誤并彈一個(gè)友好的提示而不是讓用戶對(duì)著白屏發(fā)呆。2.3 數(shù)據(jù)丟失與狀態(tài)斷裂刷新后露出馬腳刷新后狀態(tài)丟失表面上看不是白屏但它往往是白屏的前置因素。舉個(gè)例子你在用戶管理頁(yè)打開了一個(gè)編輯彈窗修改了一些內(nèi)容但還沒(méi)保存這時(shí)候 F5 一按頁(yè)面刷新彈窗關(guān)閉表單數(shù)據(jù)清空用戶開始罵人。這個(gè)場(chǎng)景沒(méi)有白屏但它同樣屬于“刷新體驗(yàn)”差的范疇。更嚴(yán)重的場(chǎng)景是你的頁(yè)面依賴一個(gè)全局狀態(tài)比如用戶權(quán)限列表、當(dāng)前選擇的組織架構(gòu)。刷新后 Pinia store 重新初始化這個(gè)狀態(tài)變成了空數(shù)組。頁(yè)面渲染時(shí)可能會(huì)因?yàn)闄?quán)限列表為空把菜單全部隱藏、路由全部攔截于是用戶刷新完發(fā)現(xiàn)整個(gè)系統(tǒng)變成了“白紙”比白屏還嚇人。解決的思路其實(shí)很清楚刷新頁(yè)面后要把關(guān)鍵狀態(tài)從持久化存儲(chǔ)里恢復(fù)。Vue3 項(xiàng)目里常用pinia-plugin-persistedstate這類插件把 store 里的關(guān)鍵數(shù)據(jù)同步到 localStorage 或 sessionStorage。要注意不需要把所有狀態(tài)都持久化那些重量級(jí)的、含有函數(shù)或復(fù)雜嵌套對(duì)象的數(shù)據(jù)不適合塞進(jìn) localStorage。我在項(xiàng)目里只持久化用戶信息、權(quán)限標(biāo)識(shí)、系統(tǒng)配置這幾類像當(dāng)前頁(yè)碼、表單篩選條件這類臨時(shí)狀態(tài)用vue-router的 query 參數(shù)來(lái)帶別往 localStorage 里寫。3. 刷新方案的實(shí)操對(duì)比3.1 方案一路由容器重掛載provide/inject v-if這是 Vue3 項(xiàng)目里最經(jīng)典、團(tuán)隊(duì)使用率最高的局部刷新方案。核心思路是給根組件套一個(gè)具備“重建能力”的入口然后用v-if控制整個(gè)路由容器的掛載和銷毀。實(shí)現(xiàn)起來(lái)很簡(jiǎn)單在根組件里這樣寫!-- App.vue -- template router-view v-ifisRouterAlive / /template script setup import { provide, ref, nextTick } from vue const isRouterAlive ref(true) const reload () { isRouterAlive.value false nextTick(() { isRouterAlive.value true }) } provide(reload, reload) /script子組件里通過(guò)inject獲取刷新方法script setup import { inject } from vue const reload inject(reload) // 某些操作完成后調(diào)用 reload() /script這個(gè)方案有兩個(gè)關(guān)鍵點(diǎn)很多人寫的時(shí)候容易忽略第一nextTick不是萬(wàn)能的。你先把isRouterAlive置為 falseVue 會(huì)排隊(duì)執(zhí)行 DOM 更新nextTick的回調(diào)在 DOM 更新完成后觸發(fā)此時(shí)再置為 true 才能確保組件真正被銷毀后再重建。有些同學(xué)圖省事把兩行寫在一起不包nextTick可能在同一個(gè) tick 里連續(xù)變更Vue 會(huì)幫你合并成一次更新組件從頭到尾沒(méi)被卸載過(guò)刷新完全不生效。第二provide和inject的響應(yīng)式關(guān)系要搞明白。reload本身不需要是響應(yīng)式數(shù)據(jù)它只是父組件作用域里的一個(gè)函數(shù)子組件拿到的引用是確定的調(diào)用它就會(huì)觸發(fā)父組件里的邏輯。這個(gè)方案的好處是改動(dòng)小、侵入性低適合在線編輯數(shù)據(jù)后想要重置整頁(yè)的場(chǎng)景。缺點(diǎn)是它比較“重”會(huì)把當(dāng)前路由下所有組件全部重建包括那些維護(hù)了臨時(shí)交互狀態(tài)的組件。如果你只是想刷新某個(gè)路由對(duì)應(yīng)的頁(yè)面不想影響其他頁(yè)面這個(gè)方案可以做一點(diǎn)變體限制const reload () { // 只對(duì)特定路由生效 if (route.name orderDetail) { isRouterAlive.value false nextTick(() { isRouterAlive.value true }) } }這樣就能把刷新范圍收縮到具體場(chǎng)景而不是全局一刀切。3.2 方案二動(dòng)態(tài) key 刷新組件比provide/inject v-if更輕量的方案是給組件或路由容器設(shè)置動(dòng)態(tài)key。Vue 的渲染機(jī)制里同樣類型的組件在相同位置渲染時(shí)如果key變了Vue 會(huì)認(rèn)為這是不同的組件實(shí)例于是銷毀舊實(shí)例、創(chuàng)建新實(shí)例。這個(gè)方案最常見的用法是在路由視圖上綁定route.fullPathtemplate router-view :keyroute.fullPath / /template script setup import { useRoute } from vue-router const route useRoute() /script這樣每次路由地址變化整個(gè)視圖組件都會(huì)重新渲染。這其實(shí)已經(jīng)成為很多 Vue3 后臺(tái)項(xiàng)目的基礎(chǔ)配置因?yàn)樗芤?guī)避一個(gè)隱藏問(wèn)題從/user/1跳到/user/2如果路由配置里面用的是同一個(gè)組件Vue Router 默認(rèn)會(huì)復(fù)用組件實(shí)例created和mounted不會(huì)重新執(zhí)行頁(yè)面內(nèi)容如果沒(méi)有監(jiān)聽路由響應(yīng)就會(huì)停留在上一個(gè)用戶的數(shù)據(jù)。不過(guò):keyroute.fullPath有一個(gè)副作用它把刷新粒度綁定到了 URL 層面。如果頁(yè)面上有 tab 切換、彈窗開關(guān)這類不改變 URL 的交互組件不會(huì)被重建但如果你在詳情頁(yè)修改數(shù)據(jù)后想返回列表頁(yè)并刷新列表只靠這個(gè)方案做不到因?yàn)榱斜眄?yè)和詳情頁(yè)已經(jīng)是兩個(gè)不同的路由了列表頁(yè)組件在詳情頁(yè)打開時(shí)已經(jīng)被銷毀你返回時(shí)它重新走mounted數(shù)據(jù)是重新拉取的。所以在我看來(lái)動(dòng)態(tài) key 更適合解決“同一路由不同參數(shù)”的組件復(fù)用問(wèn)題而對(duì)“跨路由數(shù)據(jù)聯(lián)動(dòng)”的刷新需求幫助不大。但把它作為基礎(chǔ)配置放上去能減少很多意想不到的 bug。3.3 方案三keep-alive 配合生命周期鉤子很多后臺(tái)系統(tǒng)都希望保留用戶已經(jīng)打開頁(yè)面的狀態(tài)比如用戶在列表頁(yè)篩選了一堆條件切到別的頁(yè)面再切回來(lái)?xiàng)l件還在從詳情頁(yè)返回列表頁(yè)時(shí)滾動(dòng)位置也不能丟。這種需求用keep-alive是最合適的。Vue3 里keep-alive和router-view配合的寫法是這樣的template router-view v-slot{ Component } keep-alive :max10 component :isComponent :keyroute.name / /keep-alive /router-view /templatekeep-alive緩存了組件實(shí)例組件不用反復(fù)銷毀重建。但被緩存的組件沒(méi)有再走普通生命周期而是會(huì)觸發(fā)兩個(gè)新鉤子onActivated和onDeactivated。這里就是“刷新”哲學(xué)的核心操作點(diǎn)。比如一個(gè)訂單列表頁(yè)你希望它每次從別的頁(yè)面切回來(lái)時(shí)都拿到最新數(shù)據(jù)可以在setup里這樣寫script setup import { onActivated, onDeactivated } from vue import { getOrderList } from /api/order const pageInfo reactive({ page: 1, size: 10 }) const fetchData async () { const res await getOrderList(pageInfo) orderList.value res.data.list } // 首次掛載也觸發(fā) onMounted(() { fetchData() }) // 每次激活時(shí)刷新數(shù)據(jù) onActivated(() { fetchData() }) onDeactivated(() { // 可以做一些清理工作 // 比如取消未完成的請(qǐng)求 }) /script這里要注意一個(gè)細(xì)節(jié)onMounted在組件第一次被掛載時(shí)會(huì)執(zhí)行首次通過(guò)keep-alive緩存后onActivated也會(huì)執(zhí)行一次。如果你在兩個(gè)鉤子里都調(diào)用fetchData首次進(jìn)入頁(yè)面會(huì)請(qǐng)求兩次。解決辦法是只留onActivated因?yàn)樗谑状螔燧d后也會(huì)執(zhí)行。onActivated是 Vue3 里最優(yōu)雅的“數(shù)據(jù)刷新”方案。它不銷毀組件不丟失狀態(tài)只在組件重新變得可見時(shí)把該拉的數(shù)據(jù)重新拉一遍。這正好符合用戶的直覺(jué)——用戶切走再切回來(lái)確實(shí)期望看到最新的狀態(tài)。比每次都重建組件、全屏 loading 的體驗(yàn)好太多了。但keep-alive也有自己的坑。緩存數(shù)量過(guò)多會(huì)占用大量?jī)?nèi)存組件里如果有定時(shí)器、WebSocket 連接等資源一定要在onDeactivated里清理否則頁(yè)面切走后資源還在運(yùn)行時(shí)間一長(zhǎng)系統(tǒng)卡頓甚至崩潰。我一般會(huì)根據(jù)頁(yè)面復(fù)雜度設(shè)置:max值比如 10 個(gè)頁(yè)面超過(guò)后 Vue 會(huì)按照 LRU 策略淘汰最久未訪問(wèn)的組件。3.4 方案四iframe 場(chǎng)景下的刷新控制Vue3 后臺(tái)系統(tǒng)里iframe 依然是繞不開的場(chǎng)景。集成第三方系統(tǒng)、預(yù)覽報(bào)表、打開舊系統(tǒng)頁(yè)面很多都依賴 iframe。iframe 的刷新思路和頁(yè)面內(nèi)部組件完全不一樣因?yàn)樗且粋€(gè)獨(dú)立的文檔Vue 的響應(yīng)式系統(tǒng)管不到它。最直接的 iframe 刷新方式是通過(guò)重新賦值srctemplate iframe refiframeRef :srciframeUrl loadhandleLoad / /template script setup import { ref, nextTick } from vue const iframeRef ref(null) const iframeUrl ref(/base/iframe.html) const refreshIframe () { // 方式一重新賦值觸發(fā)加載 iframeUrl.value /base/iframe.html?t Date.now() // 方式二調(diào)用 iframe 內(nèi)部的 reload nextTick(() { iframeRef.value?.contentWindow?.location.reload() }) } /script兩個(gè)方式各有適用場(chǎng)景。重新賦值src相當(dāng)于原本的 iframe 頁(yè)面被卸載再重新加載適合 iframe 內(nèi)部狀態(tài)徹底亂了、想完全重置的場(chǎng)景。調(diào)用contentWindow.location.reload()只在 iframe 內(nèi)部執(zhí)行刷新父頁(yè)面沒(méi)動(dòng)速度更快適合 iframe 內(nèi)容更新后只想重新拉取的場(chǎng)景。iframe 刷新有一個(gè)隱私相關(guān)的限制如果 iframe 加載的是跨域頁(yè)面contentWindow只能訪問(wèn)有限屬性reload方法可能被瀏覽器攔截。這種情況下建議用重新賦值src并帶一個(gè)時(shí)間戳參數(shù)的方式繞過(guò)緩存強(qiáng)制加載新內(nèi)容。還有一點(diǎn)iframe 里的頁(yè)面加載很慢時(shí)會(huì)讓用戶感覺(jué)像卡死一樣??梢栽?iframe 外層加一層 loading 遮罩在load事件里隱藏這樣至少在等待期間用戶知道系統(tǒng)還在工作不會(huì)反復(fù)刷新。3.5 表格數(shù)據(jù)刷新局部刷新優(yōu)先頁(yè)面級(jí)別的刷新方案說(shuō)完了再說(shuō)說(shuō)需求頻率最高的局部刷新——表格數(shù)據(jù)刷新。后臺(tái)系統(tǒng)里幾乎每個(gè)表格頁(yè)面都有“查詢”“重置”“刷新”按鈕。有些同學(xué)偷懶直接調(diào)用全局刷新方案把整個(gè)頁(yè)面重建一遍。這種辦法其實(shí)很浪費(fèi)表格寫好查詢條件后查詢按鈕只要重新請(qǐng)求當(dāng)前頁(yè)的數(shù)據(jù)就行完全沒(méi)有必要重建組件。我的建議是表格頁(yè)單獨(dú)封裝一個(gè)fetchTableData函數(shù)查詢按鈕和刷新按鈕都調(diào)用它script setup import { reactive, ref } from vue import { getTableData } from /api/table const queryParams reactive({ keyword: , status: , page: 1, size: 10 }) const tableData ref([]) const loading ref(false) const fetchTableData async () { loading.value true try { const res await getTableData(queryParams) tableData.value res.data.records } finally { loading.value false } } // 查詢按鈕 const handleSearch () { queryParams.page 1 fetchTableData() } // 刷新按鈕 const handleRefresh () { fetchTableData() } /script這樣每次刷新只走一次數(shù)據(jù)請(qǐng)求頁(yè)面不閃爍、滾動(dòng)位置不丟失、加載狀態(tài)可控。這是用戶感知最絲滑的刷新方式。至于什么時(shí)候需要把provide/inject或key變更這些重方案搬出來(lái)我的判斷標(biāo)準(zhǔn)是刷新后頁(yè)面的 DOM 結(jié)構(gòu)、組件層級(jí)、交互狀態(tài)是否需要全部重置。如果只是數(shù)據(jù)變了就別動(dòng)組件只動(dòng)數(shù)據(jù)。4. 實(shí)戰(zhàn)場(chǎng)景中的刷新設(shè)計(jì)4.1 后臺(tái)管理系統(tǒng)的標(biāo)準(zhǔn)刷新閉環(huán)一個(gè)典型的 Vue3 后臺(tái)管理系統(tǒng)菜單欄、標(biāo)簽頁(yè)、內(nèi)容區(qū)三個(gè)部分組成了基本的頁(yè)面骨架。菜單切換聯(lián)動(dòng)標(biāo)簽頁(yè)標(biāo)簽頁(yè)聯(lián)動(dòng)內(nèi)容區(qū)內(nèi)容區(qū)根據(jù)路由渲染組件。整個(gè)系統(tǒng)的刷新體驗(yàn)就靠這三個(gè)模塊的協(xié)作。我目前維護(hù)的項(xiàng)目中內(nèi)容區(qū)的渲染是這樣處理的template router-view v-slot{ Component } keep-alive :includecachedViews component :isComponent :keyroute.fullPath / /keep-alive /router-view /templatecachedViews是 Pinia store 里維護(hù)的緩存列表用戶在標(biāo)簽頁(yè)關(guān)閉某個(gè) tab 時(shí)把對(duì)應(yīng)的組件名從cachedViews里移除同時(shí)把內(nèi)容區(qū)的key變一下組件就銷毀了下次再打開時(shí)重新創(chuàng)建。這個(gè)閉環(huán)能保證用戶打開 A 頁(yè)面篩選數(shù)據(jù)、滾動(dòng)瀏覽器切到 B 頁(yè)面處理任務(wù)再切回 A 頁(yè)面所有狀態(tài)都在。用戶主動(dòng)關(guān)閉 A 標(biāo)簽頁(yè)A 組件的狀態(tài)被釋放下次進(jìn)入不再?gòu)?fù)用舊數(shù)據(jù)。處理 Tab 關(guān)閉的時(shí)候有一個(gè)細(xì)節(jié)必須小心要先改cachedViews再改key如果反了組件已經(jīng)從緩存里移除了但 key 還沒(méi)來(lái)得及變可能造成短暫的異常渲染。建議在 Pinia 的 action 里封裝好邏輯頁(yè)面里只調(diào)用一個(gè)方法// stores/tabs.js import { defineStore } from pinia export const useTabsStore defineStore(tabs, { state: () ({ tabs: [], cachedViews: [] }), actions: { removeTab(fullPath) { const index this.tabs.findIndex(tab tab.fullPath fullPath) if (index -1) { this.tabs.splice(index, 1) } const cachedIndex this.cachedViews.indexOf(fullPath) if (cachedIndex -1) { this.cachedViews.splice(cachedIndex, 1) } } } })然后內(nèi)容區(qū)監(jiān)聽cachedViews變化同步更新key值。這個(gè)方案把標(biāo)簽頁(yè)關(guān)閉和組件緩存完美銜接起來(lái)了用起來(lái)很順手。4.2 表單頁(yè)編輯后的刷新聯(lián)動(dòng)另一個(gè)高頻場(chǎng)景是從列表頁(yè)點(diǎn)“編輯”進(jìn)入表單頁(yè)保存成功后回到列表頁(yè)列表要刷出新數(shù)據(jù)。如果列表頁(yè)被keep-alive緩存了返回時(shí)mounted不會(huì)重新執(zhí)行列表數(shù)據(jù)依然是舊值。這種需求有幾種處理方式我用下來(lái)最穩(wěn)定的是通過(guò)事件總線或者 Pinia 里的“刷新標(biāo)記”來(lái)實(shí)現(xiàn)。在表單頁(yè)保存成功后設(shè)置一個(gè)標(biāo)記列表頁(yè)在onActivated里檢測(cè)到標(biāo)記后主動(dòng)重新拉數(shù)據(jù)// stores/listRefresh.js import { defineStore } from pinia export const useListRefreshStore defineStore(listRefresh, { state: () ({ refreshMap: {} }), actions: { markRefresh(listKey) { this.refreshMap[listKey] Date.now() }, consumeRefresh(listKey) { const time this.refreshMap[listKey] delete this.refreshMap[listKey] return time } } })列表頁(yè)的onActivated邏輯script setup import { onActivated } from vue import { useListRefreshStore } from /stores/listRefresh const listRefreshStore useListRefreshStore() onActivated(() { const needRefresh listRefreshStore.consumeRefresh(user-list) if (needRefresh) { fetchTableData() } }) /script這種方案的優(yōu)點(diǎn)是不需要關(guān)心組件是否被緩存表單頁(yè)保存成功后只做一件事往 store 里寫標(biāo)記。列表頁(yè)返回時(shí)自己判斷要不要刷新。解耦充分后續(xù)維護(hù)也不容易踩踏。4.3 權(quán)限變化后的全量刷新還有一種刷新場(chǎng)景比較特殊用戶登錄后系統(tǒng)根據(jù)權(quán)限動(dòng)態(tài)生成菜單和路由。如果在使用過(guò)程中管理員給用戶改了角色或者用戶自己切換了租戶前端菜單需要立刻變化。這時(shí)候局部刷新已經(jīng)不夠了必須重新加載動(dòng)態(tài)路由。我處理動(dòng)態(tài)路由刷新的方式是通過(guò)重新拉取用戶信息和權(quán)限列表然后重置路由import router from /router import { useUserStore } from /stores/user const resetDynamicRoutes async () { const userStore useUserStore() // 1. 重新獲取用戶信息 await userStore.fetchUserInfo() // 2. 移除舊動(dòng)態(tài)路由 const dynamicRoutes router.getRoutes().filter( route route.meta?.dynamic ) dynamicRoutes.forEach(route { if (router.hasRoute(route.name)) { router.removeRoute(route.name) } }) // 3. 重新注冊(cè)動(dòng)態(tài)路由 await userStore.buildDynamicRoutes() // 4. 跳轉(zhuǎn)到當(dāng)前頁(yè)面觸發(fā)重渲染 const currentPath router.currentRoute.value.fullPath router.replace({ path: /redirect currentPath }) }這個(gè)/redirect路由是我習(xí)慣添加的一個(gè)空組件它的作用很簡(jiǎn)單在重定向組件里馬上router.replace(to.path)把頁(yè)面重新跳回原本的地址。這樣既不影響 URL又能讓整個(gè)路由視圖重新渲染。實(shí)際解決的效果非常好權(quán)限變更后刷新菜單和路由就是一瞬間的事。有一點(diǎn)務(wù)必注意動(dòng)態(tài)路由的刪除要按名字來(lái)getRoutes()返回的路由記錄里name不一定都有值如果用的動(dòng)態(tài)路由是通過(guò)addRoute添加的通常在配置路由時(shí)就指定了name。你要在添加動(dòng)態(tài)路由時(shí)就設(shè)計(jì)好命名規(guī)則便于后面精確刪除。不要試圖用router.removeRoute刪掉所有路由靜態(tài)路由也會(huì)受影響導(dǎo)致刷新后連登錄頁(yè)都進(jìn)不去。5. 排查白屏與刷新問(wèn)題的實(shí)戰(zhàn)方法論5.1 白屏問(wèn)題的一步步定位法遇到白屏問(wèn)題我有一套固定的排查流程按順序來(lái)基本能定位到絕大多數(shù)問(wèn)題。第一步先打開瀏覽器控制臺(tái)看 Network 面板里 JS、CSS 請(qǐng)求有沒(méi)有失敗。失敗的判斷標(biāo)準(zhǔn)不只是 404還要看資源狀態(tài)是不是 200。如果資源 404優(yōu)先檢查vite.config.js的base配置和部署目錄是否匹配。資源請(qǐng)求全部正??刂婆_(tái)也沒(méi)有報(bào)錯(cuò)信息那問(wèn)題往往出在路由匹配上。打開頁(yè)面試著手動(dòng)在地址欄輸入一個(gè)完整路由地址如果仍然白屏且控制臺(tái)有No match found for location之類的警告基本是動(dòng)態(tài)路由沒(méi)有注冊(cè)成功。這種情況需要檢查用戶權(quán)限加載的邏輯看看路由是不是在權(quán)限信息就緒之后才添加的??刂婆_(tái)報(bào)錯(cuò)信息非常關(guān)鍵。很多同學(xué)一看紅了就慌直接貼報(bào)錯(cuò)到群里問(wèn)。其實(shí)只要把報(bào)錯(cuò)信息往上翻幾行找到at關(guān)鍵字后面指向的文件路徑和組件名定位會(huì)快得多。我用這一招解決過(guò)好幾個(gè)看起來(lái)毫無(wú)頭緒的白屏問(wèn)題最后都是某個(gè)組件內(nèi)部一個(gè)空指針導(dǎo)致的。最后一步是環(huán)境差異排查。開發(fā)環(huán)境正常、生產(chǎn)環(huán)境白屏優(yōu)先檢查環(huán)境變量和接口地址。線上接口是 HTTPS你寫成了 HTTP瀏覽器會(huì)攔截混合內(nèi)容頁(yè)面照樣能打開但數(shù)據(jù)渲染不出來(lái)效果和白屏差不多。這類問(wèn)題最容易被人忽略因?yàn)榇a本地跑得好好的。5.2 刷新后狀態(tài)丟失的規(guī)律總結(jié)刷新后狀態(tài)丟失的問(wèn)題可以從數(shù)據(jù)維度分成三類每一類的處理策略完全不同。第一類是必須持久化的用戶級(jí)數(shù)據(jù)比如 token、用戶信息、權(quán)限標(biāo)識(shí)這類數(shù)據(jù)用 localStorage 或 Pinia 持久化插件儲(chǔ)存刷新后自動(dòng)恢復(fù)。第二類是頁(yè)面間傳遞的臨時(shí)數(shù)據(jù)比如從列表頁(yè)帶一個(gè) id 到詳情頁(yè)這類數(shù)據(jù)盡量不要存在 store 里而是放在路由的 query 參數(shù)中刷新后依然能拿到。第三類是組件內(nèi)部的臨時(shí)交互狀態(tài)比如彈窗開關(guān)、表單草稿、折疊面板這類數(shù)據(jù)默認(rèn)不用保留如果產(chǎn)品明確要求記住再用sessionStorage或keep-alive處理。我踩過(guò)一個(gè)經(jīng)典的坑在 store 里保存了一個(gè)大的對(duì)象數(shù)組不僅存了數(shù)據(jù)字段還存了組件實(shí)例和方法引用。結(jié)果刷新后從 localStorage 里恢復(fù)了頁(yè)面直接崩潰因?yàn)榉椒ㄒ迷诨謴?fù)時(shí)變成了 undefined。從那時(shí)起我給自己定了一條規(guī)矩localStorage 只放可序列化的純數(shù)據(jù)。任何包含函數(shù)、正則、Map、Set 的對(duì)象都不能直接持久化。5.3 與刷新相關(guān)的高頻報(bào)錯(cuò)速查我把 Vue3 項(xiàng)目里和刷新、白屏最相關(guān)的幾類問(wèn)題整理成了一張速查表排查時(shí)可以對(duì)照著看。報(bào)錯(cuò)現(xiàn)象可能的根因解決方向刷新后資源 404白屏部署路徑和 Vite base 配置不一致修改vite.config.js的base或用環(huán)境變量配置Vue Router 報(bào)No match found for location動(dòng)態(tài)路由未注冊(cè)或刷新后路由丟失刷新后重新拉取權(quán)限、重新 addRoute走路由守衛(wèi)Cannot read properties of undefined (reading xxx)組件里數(shù)據(jù)未就緒就渲染或接口返回結(jié)構(gòu)變化模板里加空值判斷、初始化默認(rèn)數(shù)據(jù)、用v-if控制渲染時(shí)機(jī)刷新后菜單/路由全沒(méi)了權(quán)限信息沒(méi)有持久化Pinia 初始化時(shí)為空安裝持久化插件或路由守衛(wèi)里檢測(cè)權(quán)限缺失時(shí)重新拉取iframe 內(nèi)部白屏跨域限制src被攔截或頁(yè)面地址寫錯(cuò)使用帶時(shí)間戳的重賦值src方式加上load事件提示組件緩存后數(shù)據(jù)不更新組件被keep-alive緩存走不到mounted改用onActivated鉤子刷新數(shù)據(jù)必要時(shí)移除緩存這張表可以幫你快速縮小排查范圍。不過(guò)說(shuō)真的無(wú)論速查表多全面都不如自己親手在瀏覽器 DevTools 里跑一遍看 Network、看 Console、看 Vue Devtools 的組件樹。工具用得多了很多白屏問(wèn)題你在心里其實(shí)已經(jīng)有八成的判斷了。再分享一個(gè)小技巧在根組件里加一個(gè)全局錯(cuò)誤提示把 Vue 組件的渲染錯(cuò)誤可視化展示出來(lái)。生產(chǎn)環(huán)境里用戶遇到白屏?xí)r大部分人是不會(huì)主動(dòng)打開控制臺(tái)的你永遠(yuǎn)不知道問(wèn)題在哪。如果在頁(yè)面右上角彈個(gè) toast寫上錯(cuò)誤碼和幫助信息用戶反饋質(zhì)量會(huì)高很多。我做過(guò)這樣一個(gè)小改動(dòng)之后線上白屏問(wèn)題的響應(yīng)速度提升了一倍不止因?yàn)橛脩裟芨嬖V你“刷新后右下角出來(lái)一個(gè)紅色的條上面寫著 xxx”對(duì)照錯(cuò)誤碼就能快速定位。我在 Vue3 項(xiàng)目里處理刷新問(wèn)題最終沉淀下來(lái)的核心原則特別簡(jiǎn)單能局部刷新的絕不動(dòng)整個(gè)頁(yè)面能恢復(fù)狀態(tài)的絕不從零開始能給用戶反饋的絕不讓他盯著空白屏幕猜測(cè)。按這個(gè)標(biāo)準(zhǔn)去設(shè)計(jì)你的刷新交互白屏問(wèn)題自然越來(lái)越少。如果你正在做 Vue3 后臺(tái)系統(tǒng)建議從這幾個(gè)點(diǎn)入手檢查第一確認(rèn)路由視圖有沒(méi)有綁定動(dòng)態(tài)key這是最基礎(chǔ)也最容易被忽略的一步第二給列表頁(yè)加上緩存和onActivated數(shù)據(jù)刷新機(jī)制讓用戶在標(biāo)簽頁(yè)之間切換時(shí)始終看到最新數(shù)據(jù)第三把權(quán)限信息做成持久化存儲(chǔ)不要讓刷新成為權(quán)限丟失的導(dǎo)火索。把這三件事做完你的“刷新”體驗(yàn)就已經(jīng)超過(guò)大部分項(xiàng)目了。至于刷新按鈕本身我的個(gè)人習(xí)慣是能用數(shù)據(jù)請(qǐng)求解決的不用組件重建能用組件重建解決的不用瀏覽器 reload。這一層一層地守住用戶基本感知不到“刷新”的存在只會(huì)覺(jué)得系統(tǒng)用起來(lái)很流暢不管怎么操作內(nèi)容都穩(wěn)穩(wěn)地在那里。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
18禁精品网站在线看| 97日韩欧美亚洲| 国产精品直播在线观看直播| 在线观看视频91| 黄网在线播放| 国产不良强奸视频免费看| 九九综合网| 日本不卡高清免v欧美日韩在线观看| 草草影院日本第一页| 欧美+日产+中文| 久久成人午夜狠狠| 又黄又硬又粗又长国产视频| 骚日日av| 欧美激情色婷婷花野真衣一区二区| 色色99| 欧美亚洲尤物久久| 人妻精品视频一区二区三区 | 亚洲情色 欧美| 久久久久大香青草精品综合| 亚洲美欧999| 欧美色偷拍| 人人干黄色| 精品夜夜澡人妻无码AV| 97欧美久久久久久久| 中文字幕少妇色 | 色色婷婷丁香| 成人性爱电影网| 国产精品99精品视频网站| 夜夜嗨一区二区三区直播内容| 最新精品久久蜜桃 | 蜜臀精品1区2区| 婷婷五月丁香五月| 精品视频久久久久九九九九9999| 不卡免费av在线播放| 日韩国产不卡在线视频| 操逼啊啊啊91| 中文自拍欧美影视| 亚洲夜夜欢无码一区二区| 乱欲一区二区| 黄片无码在线制服| 高清在线偷拍自拍视频| 99热久| 另类 日韩 熟女| 久久精品国产亚洲AV高级北京| 三级AV入口| 黄色片,com| 欧美亚洲一级在线观看| 成人精品一区二区91毛片不卡| 日韩精品字幕| 亚欧Av| 欧美老妇曰批的视频| 天天射天天| 欧美中文字幕日韩在线| 日韩在线一区高清在线| 久久精品国产亚洲AV无码做| 怡红院一区二区熟女人妻| 国产乱人伦AVA麻豆软件.| 立川理惠无码一区二区| 少妇超碰在线| 91美女看B| 91欧美综合在线| 成人精品一区二区三区| 伊人久大| 97超碰色| 国产AV无码AV| 青青国产精品在线| 日本精品久久久久久久| 美女裸体无遮挡永久免费观看网站 | 99久久精品无码一区二区毛片免费| 波多野结衣之双飞调教在线播放| 欧美性爱五月天| 久久免费中文字幕在线观看| 久久久九九九九| 91久久婷婷| 无码人妻一区二区三区免费九色| 影音先锋新男人| 伊人女女资源在线观看| 加勒比五月天| 91精片| 日韩在线一区高清在线| 亚洲激情久久| 熟女熟妇一区二区三区视频| 女欧美一区二三区| 五月丁香色综合| 91网站视频在线观看| 色图四区| 亚洲超碰AV| 四虎AV无码| 一卡二卡在线播放| 国产成人免费观看在线视频| 欧美日韩人人精品| 中国熟妇| 国产麻豆一级精品视频| 1204金沙人妻懂旧版免费| 啊啊啊啊好疼| 欧亚乱色熟女一区二区| 中文字幕精品久久久久人妻红杏ⅰ| 狠狠爱夜夜| 97人妻免费中文字幕| 久都青青视频| 日韩精品-原创伙伴| 欧美日韩不卡a片| 99热这里是精品| 激情五月天校园春色网| 午夜一级免费毛片| 国产91丝袜 在线播放| 中国一区二区亚洲人妻| 四虎视频在线观看| 久久亚洲国产成人| 欧美久久草熟女| 深爱伊人影院| 亚洲无线码一区国产欧美国| 女上位精品在线| 麻豆国产视频精品观看| 成人无码专区精品视频| 蜜臀99久久| 骚逼高潮久久精品| 插插综合网天天影视网| 九九性视频| 九九热只有精品| 全免费a敌肛交毛片免费| 成人热久久精品| 超碰免费人妻人人| 一区二区视频你懂的| 2017av无码免费无线播| 九九九九免费高| 免费观看国产小粉嫩喷水精品午| 91中文精品日韩欧美在线 | 五月天婷婷久久| 日韩欧美蜜桃精品久久中文字幕久久 | 色牛牛AV| 亚洲天堂电影网99999| 色官网色综合| AV色五月天| 日本人人操人人操| 96一区二区三区| 亚欧国产无码精品在线| 一级毛片电影免费看| 欧美亚洲国产自久久| 一区二区三区美女超清| av线电影| 久热9| 人妻一区二区三区四区视频| 精品国产乱码久久久兰草影视| 成人a级高清视频在线观看| 99亚洲人人| 探花熟女,姿勢到位,體驗感也到位| 影音先锋一区二区在线资源| 秋霞蝌科网日本一区| 玖色av| 精品一区二区啪啪啪| 丁香五六月啪啪| 热热热热日日漂亮永久永久国产日| 思思热久久成人| 欧美图片校园春色| 日本天天干天天搞一区| 啊啊啊操一区| 中国乱伦一区二区| 国产精品久久蜜乳av| 你草精品在线视频| 激情五月天丁香| 国产黄色视频久久| 亚洲资源吧| 亚洲激情 欧美色图| 一级啊性爱在线视频| 麻豆精品.欧美精品.日韩精品.| 亚洲另类久操网| 久久久久久久国产a∨| 中文视频在线观看| 色香91| 九月AV| 爆操无码| 青草草免费网站av| 九九热国产| 91性| 91电影色诱| 亚洲丁香花色| 成年女人18级毛片毛片免费观看| 老外又粗又长一晚做五次| 少妇丝袜在线观看AV| 超碰调教97| 欧美性爱中文字幕无线码| 亚洲性天堂| 国产第二页| 久久色一区| 色色五月天婷婷| 乱伦av麻豆| 国产色图乱伦| 嫩草美女久久| 精品无码久久久久久久杏吧| 天天综合官网| 高颜值美女口爆高潮浪叫| 国产25页| 九九热精彩视频| 九九十八精品| 美女露胸露屁股| 五月天激情小说网| 99热婷婷| 九九成人视频| 观看免费区二区三区二| 91美乳| 午夜精品一区二区三区三上悠亚| 超碰碰碰碰| 精品超碰国产| 一级免费啪啪片| 温婉少妇玩3p| 色婷婷五月天| 超碰人人乐97| Av色五月| 91jk色拍| 欧美性爱网97| 97精选久久| 日韩不卡一二三四| 少妇熟女视频一二三区| 欧美+日产+中文| 九九热re99re6在线精品| 大香蕉懂9| 天天干18禁| 久久精品无码一区二区三区| 日韩簧片免费看| 影音先锋每日最新资源在线观看| 秋霞一级A片黄色视频| 亚洲国产精品99久久久| 国产大学生口爆吞精合集| jk白丝没脱就开始啪啪| 欧美一级做a爰片免费视频| 久久九九网| 人人喜人人妻| 国产极品久久久| 欧美大干日韩| 亚洲精品97| 国产真实子伦对白| 婷婷去俺也去六月色| 99热这里只有精品地址| 亚洲精品久久久久久久久豆丁网| 97在线欧洲| 国产人妻一区二区三区欧美毛片| 91天天美女| 国产品精品自在在线午夜免费| 国产91会所女技师在线观看| 国产精品探花在线| 麻豆天美国美国产| 色香91| 老女人综合| 亚洲一区二区三区不卡国产欧美| 大香蕉丝袜一级片| 69综合网| 人妻蜜桃臀| 日本成人在线不卡一区二区三区 | 成人精品一区二区三区| 天天色综合影视网| 天堂中文日本在线观看| 91黑丝少妇| 亚洲天天精品| 国产在线视频二区| 欧美人妻二区三区| 亚洲精品熟妇1区2区3区。| 天天网综合| 色狠狠 - 百度| 野狼激情网| 久久久精品中文字幕麻豆| 久久春色| 一区二区三区视频| 龙兴卡官方查询| 欧美色人| 婷婷六月色| 新视频sss国产| 香港澳门日本三级网站| 人妻av在线| 日本天天干天天搞一区| 狠狠色伊人亚洲综合网站色| 黄污污污污| 亚洲 欧美 综合 91| 国产亚洲福利第一页丝袜| 久久五月天婷婷| 欧美色色人| 午夜乱轮操逼视频免费看| 开心婷婷五月| 免费男人的天堂| 高清一区AV无码| 操我啊啊啊啊啊| 久久无码精品| 五月婷婷激情| 欧美春色| 色婷婷电影网| 日本二三四区| 婷婷五月综合激情| 中文字幕一区二区三区人妻不卡| 国产免费永久精品无码| 亚洲另类色综合网站| www.久久最新地址| 激情婷婷丁香| 国产伦精品一区二区三区在线观| 天天在线91| 家庭乱伦性爱av| 国产天美传媒精品| 亚洲日韩美女中文字幕乱| 亚洲色图美腿丝袜| 国语国产操逼伊人AV网| 好一吊区二区| 久热这里| 蜜臀一区二区三区在线| 精品久久久久黄少妇| 一级做a爰片性色毛片久久| 一二三啪啪专区| 亚洲成a人v欧美综合天堂下载| 夜夜嗨一区二区| 欧美色涩| 宗合情欲网| 人人贴人人摸| 夜夜爽夜夜摸夜夜操免费视频| 蜜乳AV一区二区三区四| 中出20p| 激情五月天丁香社区| 亚洲中字慕不卡| 99色在线| 国产9 9在线 | 亚洲| 免费网站观看www在线观| 日日噜噜夜夜狠狠视频无| 精品国产乱码久久久兰草影视| 久久久国产亚洲精品系列| 天天在线91| 中文字幕 码精品视频网站| 精品人妻一区二区三区不卡断| 亚洲 综合 欧美| 26uuu最新| 亚洲电影91| 狼人久草| 免费?级毛片无码?∨蜜芽试看| 天天爱综合网| 欧美激情亚洲色图| 在线一道啪| 久久内射| 加勒比av网| 婷婷五月天激情网| 911粉嫩人妻| 欧美色狠| 久久r精品| 色哟哟-国产专区| 天天干天天狼在线视频| 肏逼视频日本| 精品国产乱码久久久久久免费| 丁香五月天婷婷姐| 99久久精品国产高潮| 国产自制av蜜乳| 一区二区三区四区在线不卡| 动漫片子网站3黄| 久久‘黄片视频| 国产在线能看的你懂的| 极品少妇久久久| 久久神马影院| 性色乱AV一区二区| 骚逼高潮久久精品| 亚洲Av无码成人精品国产| 视频国产成人精品日本亚洲18| 精久久久| 日韩丝袜高跟制服在线观看| 亚洲日韩肥臀视频在线观看| 97天天爽| 无码9区| 很很热性爱视频| 曰韩精品视频一区二区| 超碰日韩人妻| 日韩性爱啪啪视频| 农村女一级毛卡片| 91熟女丨91老女人| 久久精品超碰| 超碰97人妻自拍| 亚洲怡春院| 天天操人人操骚逼网站| 欧洲自拍色图gif在线| 蜜臀亚洲中文| 岛国小电影| 国产农村妇女一区二区| 无码9区| 狠狠操天天干| 亚洲人成网www| 五月天激情四射| 爱做久久久久久| 久久久久久久久成人av解说| 人人摸人人干人人拍97| 久久久久久精品免费看A级| 国产51色综合久久免费| 最新岛国大片| 操逼啊啊啊91| 狠狠色综合网| 超碰亚洲欧美日韩无| 黑操B| 综合网欧美在线| 小少妇| 蜜桃臀 后入 一区 二区 三区 在线| 色99在线| 成人综合网 欧美| 九九九九日本| 欧美成人国产精品| 欧美丝袜中文字幕07在线| 久草草一二三四区久久| 欧亚无码视频| 亚洲日韩精品久久久久一区壹牛| 久久受www免费人成| 国产成人 综合亚洲 天堂| 在线人成亚洲视频免费观看| 精品少妇人妻av久久免费| 久操网无码在线| 99精品视频在线观看免费| 国产探花精品在线| 涩五月婷婷| 久悠悠av| 最新9久久久9免费视频| 大香蕉日韩| 狠狠色伊人亚洲综合网站色| 婷婷五月天激情网| 国产精品久久久亚洲一区| 国产熟女一区二区丰满| 日韩精彩视频| 黑人猛交| 色小视频蜜乳| 97硬碰| 蜜桃精品一区二区三区久在线| 久久中文字幕人妻熟av女蜜柚| 欧美美女视频| 亚洲国产av中文字幕久久| 欧美网站免费| 黑人中出21连凳花野真衣| 国产精品久久久久久久免牛肉蒲团 | 夜夜夜夜夜夜夜夜夜狠狠狠狠狠狠狠| 九一性生活免费视频| 亚洲欧美97| 亚洲另类小说卡通动漫| av在线资源| 青青草十区九区爱夜| 亚洲自拍青操视频| 一级成人性爱| 国产少妇与亚洲av| 九九九九九九九九九九九蜜桃| 91骚熟女| 欧美黄色片AAAAA| 中文97国产| 精品人妻一区二区免费看| 天天色天天干天天爱| 色情综合网| 男人的天堂久久狠| 国产精品福利资源在线尤物| 色色操| 美国三级日本三级久久99| 亚洲一区中文精品| 爽爽淫人网| 久久精品无码不卡| 国产女乱淫真高清免费视频| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 国产又粗又大硬免费色网视频| 精品伊人久久久大香线蕉小说| 亚洲av总站| 免费视频一二三区| 精品色色| 老熟女天天操| 精品少妇一区二区三区在线视频| 免费超碰97久久| 欧美A片中文字幕| 九九热男人天堂| 亚洲中文丝袜美腿诱惑字幕| 日韩精品一区二区三区色欲 | 国产超碰| 校园春色美腿丝袜 | 无码人妻一区二区一牛影视| 精品无吗m| 日韩午夜啪啪视频| 日韩天天综合| www.狠狠| 啊啊啊网站| 五月天婷婷欧美三区| 99精品九九九九九九| 999国产精品999| 中文精品少妇天堂| 亚洲AV免费在线| 天天综合网~91| 激情色色| 九九久久久| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 97人人夜夜精品视频| 亚洲一区二区专区-国产丝袜精品丝袜-成人AV | 欧美精品久久久久久久久88| 人妖欧美一区二区| 五月丁香影视| 中文?日韩?免费?精品| 日韩AV一区二区三区三州三州| av三级电影在线播放| 一区二区三区日韩欧美| 乱伦一二三区| 亚欧美色图| 丁香五月AV| 婷婷涩嫩草鲁丝久久午夜精品| 99热这里只有精| 永久电影三级在线观看| 日韩精品9区| 精品一二三区久久AAA片| 国产丝袜啪啪| 91亚洲欧美色图| 手机在线人成免费视频| 91免费看中出视频| 成人综合网 欧美| 无码逼| 亚洲欧美洲综合| 日韩熟女精品无码专区一区二区| 超碰在线观看av不卡| 久久华人网| 色妹子A V| 性久久| 水滴偷拍| 日本黄色裸日本黄色裸体 | 精品制服美女中文一区二区三区| 桃色五月天| 大香蕉乱级| 日韩成人小视频| 熟妇熟女一区二三区| 国产亚洲精品av一区| 伊香蕉综合久久久久久久噜噜噜| 97精品视频网站| 男人夜色天堂ss| 欧美一级特黄淫片在线观看| www亚洲欧美| 青青三级视频| 日本不卡卡一区| 无码 有码 国产18p| 91精品无码久久久久久久| 欧美专区17页| 裸体美女久久久| 无码99| 日本精品不卡一二三区| 国产午夜在线观看视频| 国产精品久久久久久久久久久久久久| 中文字幕一区二区三四五区日日骚| 欧美操逼一二三区| 日韩一级成人毛片免费观看| AA级电影三区| 激情五月天中文字幕色| 大香久久| 亚洲高清欧美总合| 欧美性第1页| 97丝袜亚洲在线播放| 一区,二区,三区网站| 丁香五月天堂| 国产一级黄色片在线观看| www.色吧5.com| 综合色好色| 午夜经典| 97在线公开视频| 日日玩天天干| wuyechaopeng| 久久久久国产精品人妻aⅴ天堂| 久久熟妇五十路一区| 色精品极品| 久久国产三区| 天美传媒av 在线| 婷色五月| 色婷婷五月天| 97天天搞在线| 美女啊啊啊啊啊啊啊| 中文字幕精品一区二区精品| 激情丁香五月婷婷| 人妻少妇一区二区| 欧美亚涩| 欧洲乱码一区二区| 欧美久久久15P| 美女的肌被草喷水视频| 精品视频97| 欧美色日本| 96久久久精品| 久久一二三四五六七八九区| 黄页网站成人免费| 久久人妻熟女一区二区| 国产400孕妇孕交群| 97精品视频| 黑人免费福利视频| 色翁荡息又大又硬又粗又爽| 一本一道波多野毛片中文在线| 999亚洲国产视频| 人人爱人人操人人性| 国产一区二区三区精品观看啪| 国产亚洲国产超碰| 夜夜操天| 欧美72网页| 中文字幕伊人| 亚洲小说视频| 人人弄人人摸| 91三级理论片播放器| 色区久久| 亚州精品丝袜-不卡成人免费| 黄资源| 超碰97人人乐| 国产精品视频内谢女人| 搡老女人老妇女AAA一VU麻豆| 九九综合久久| 国产精品对白内射| 日本黄色天堂| 久久久新亚洲AV| 人干人人人操人人摸| 婷婷色五月激情| 久久久久久性爱视频| 欧美亚洲国产日本在线,久久精品国产| 国产精品夜夜夜| 国产v亚洲v日韩v欧美v片另类| 综合五月婷婷亚洲一区| 久久久久久亚洲精品不卡人乳| 加勒比综合九九99视频在线播放| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 黄页网站免费高清在线观看| 视频二区美腿丝袜制服人妻欧美 | 亚欧无码在线| 有码人妻系列| 有码专区最新中文字幕有码| 人妻献身系列第54部| 激情综合五月| 99国产精品自在自在| 爱爱动态60秒| 欧美黄色大香蕉一区二区| 成人AV素股で擦久久| 午夜九九| 人妻 丝袜美腿 中文字幕| 亚洲18禁| 午夜啊啊| 久草免费在线一区二区| 97视频7| 九九九九久久久久| 欧美性爱在线无码| 中字一区| 国产一在线观看| 亚洲综合网图| 三上悠亚在线毛片91| 操碰97| 97精品视频在线| 亚洲中文字幕久久人妻| 欧美爆操91| 天天操夜夜操| 嗯嗯啊操我| 啊啊啊水好多| 噜噜噜无码AV一级一级久久影院| 久久夜精品一区二区三区| 高清无码久操视频| 啊啊啊啊啊啊在线看| 福利视频网站| 亚欧精品久久久久久久久久久| 美女黄色91| 日韩去日本高清在| 天天干夜夜操一区二区| 懂色AV蜜臀无码精品APP| 一本久久精品中文字| 高清一区AV无码| 欧美青青视频| 国产理论视频在线播放| 美女91av| 第一高清av中文字幕| 99日视频在线免费| 色色五月天激情| 亚洲中文字幕av| 操操啪| 天堂性色| 欧美熟爽综合| 国产精品人妻一区二区| 大香蕉国产中文自拍| 人人干黄色| 天天舔天天日天天射| 亚洲啪啪视频一区二区| 欧美特黄视频网站| 激情文学网伊人| 91色综合| 91真人天天在线| 亚洲成人一区二区精品| 老色鬼成人精品视频下载大在线观看| 去干网最新版| 人妻欧美| 蜜桃色院一区久久 | 日韩ab网| 人、人、摸,人、人、草| 这里都是精品| 成年男人的天堂| 一区二区三区黄色片a| 乱码人妻一区二区三区| 亚洲AV免费在线| 尤物视频视频官网| 婷婷15月天青娱乐| 成人看片网站| 在线岛国新天堂8| 热久久无毒不卡| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 偷拍盗拍亚洲色图图片| 神马午夜久久久| 日韩去日本高清在| 日韩免费a级毛片无码a∨| 在线亚洲丝袜视频网站| 久久,精品一二三| 天天躁日日躁AAAAXXXX国产 | 偷拍欧美综合| 成人性爱视频在线看| 欧美激情内射| 亚洲老司机123专区| 欧美激情综合色综合啪啪五月| 久久av无码| 综合少妇网| 亚洲吊色| 四虎 精品 WWW| 亚洲性爱无码乱伦av| 一区二区三区美女超清| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 狼人狠干| 亚洲欧美啪啪| 亚洲永久AV无码精品秋霞| 97色色婷婷| 国产传媒操逼视频| J?P?NESEHD熟女熟妇伦| 91痴汉| 欧美夜夜骑视频| 91亚洲精品青草| 大香蕉综合| 欧美性爱三区二区| 伊人专区一区二区三区| 国产精品视频在线观看| 国产suv精品一区二六| 久久一二三四不卡| 台湾佬激情综合| 99自拍视频在线| 亚洲αv一区二区三区| 日本爽爽爽爽爽爽免费视频| 欧美日韩亚洲天堂| 67914在线兔费成人视频| 美女AV一区二区| 亚洲av总站| 国产av白丝| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 国产一国产一级毛片古装| 超碰导航97| 欧美偷| 国内外毛片在线观看| 狠色婷婷久久一区二区三区_| 成人女人国产| 激情图片亚洲色图| 夜夜爽妓女| 91女网站| 亚洲综合影片| 无码视频一区二区| 97日视频| AV中文字幕剧情1区2区3| 手机久操欧美综合色码| 欧美曰韩国产精品| 四虎视频在线观看| 嗯嗯啊啊好疼| 日韩不卡网操逼中文字幕日韩| 精品亚州18| 欧美亚州综合图片| 四虎在线观看网站| asc国产精品| 99超碰网| 性猛交| 精品一级毛片在线观看| 四虎国产精品永久在线囯在线| 2024黄色视频| 日日操免费视频| 日本狂喷奶水在线播放212| 国产51色综合久久免费| 国人欧美精品一区二区| 久久久激情| 亚洲欧洲小说图片视频| 台湾大香蕉99热| 亚洲男人的天堂网| 91大香蕉伊人| 男人天堂网站| 久久国产免费激情视频| 国产AV超爽| 久久国产三区| 330dv亚洲成年视频网| 日本熟妇自慰性高潮一区二区三区| 蜜臀中文无码午夜| 电家庭影院午夜69久久夜色精品国产69乱| 人人性爱视频免费| 少妇干B| 夜夜嗨一区二区| 日日AV加勒比| 日本久久久久久久久久| 麻豆天美91| 国产三级多多影院2022国产AA一级毛片无码| 日本一区二区成人在线| 午夜精品一区二区三区三上悠亚| 日韩精品熟妇| yazhououmeizongya| 99久久国产精品免费高潮| 国产传媒操逼视频| 懂色AV一区二区三区| 超碰综合色| 97色综合中文网| 黄色片,com| 亚洲一区深夜| 91少妇通奸网站| 九九九九精品九九九九| 黄片免费久久久久久久| 青青操97| 青青草在线视频播放器| 久久精品午夜国产亚洲AV无码| 8050午夜少妇无码| 日韩99神马视频片| 欧美偷拍| 免费A V在线播放| 日韩一区二区熟女| 国语精品av| AV污污污污| 色爱欲亚洲| 狼人狠干| 强免费黄色网址| 天天看高清麻豆| 亚洲欧美国产va在线播放频| 久久99网站| 啊啊啊不要嗯嗯在线观看| 国产精品免费久久久久久久久久 | 91亚洲欧美激情| 岛国艾薇凹凸视频天堂| 伊人久久大香蕉线AV五月天| 91综合熟女| 超碰人人干| 伊人久久亚洲色欲综合网站 | 天天草AV| 超碰国产精品久| 国产性感在线观看| 久久一区二区三区四区五区| 色五月激情网| 久久久一二三四区| 午夜福利精品| 亚av顶级裸体一区二区三区四区五区| 国产亚洲色停停久久99精品91| 日韩人妻大香蕉| 97欧美资源| 亚洲天堂热| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 午夜欧美女人操逼| 后入式视频国产自| 久久久久久电影| 大香蕉宅男伊人| 久久精品久久久久久久久| ss久久| av三级电影在线播放| 久久久久久久极品香蕉视频| 欧美91变态| 91人妻爽爽人人做人人澡| 色九久| 嗯嗯嗯好爽| 偷拍精品一区二区三区| 91视频观看网站| 中日韩一区二区三区欧美| 偷拍欧美激情| 乱伦日本中文自拍| 麻豆AV96熟妇人妻| 一区二区三区黄色片a| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 日躁天天爽爽| 青青青操| 国产乱色国产精品免费视| 欧美激情色婷婷花野真衣一区二区| 国产美女裸体秘 永久无遮挡| 欧美97视频| 久久久久九九九| 最新AV在线| ,国产乱人伦精品一区二区三区| 不卡中文字幕aⅴ在线| 天天操人人操骚逼网站| 国产精品久久久三级无码| 久操频道免费在线呗看| 欧美熟爽综合| 中国一级特黄大片护士| 国产人人干| 天天日天天舔| 成人精品久久久午夜福利| 九九九热精品| 色色国产| 欧美五十路熟| 亚洲第一视频 欧美风情 日韩| 久久精品人体| 韩日性爱av| 精精品人妻一区二区三区| 免费农村成人少妇人妻Aa一区二区视频| 黄片免费视频2019| 久久久免费高清中文视频| 久久久久久久一级黄色打同平台| 狠狠操官网| 国产久久天堂资源| 97日视频| 99综合网| 久久久久久日韩| 先锋女优在线观看视频| 日韩精品第3页| 操操啪| 再深点灬舒服灬太大了添视频| 四虎AV在线播放| 精品一久久久| 激情五月天婷婷| 2018天天干在线视频| 东北女人高潮视频| 伊人aaa| 欧美久久九九| 国产精品无码在线| 思思热在线视频免费| 玖玖无码超碰| 熟妇人妻一区二区三在线| 日本在线一二| 久久久久成人亚洲国产| 国内偷拍精品一区二区| 一区二区无码视频| 超碰碰激情97+久| 九九精品美女高溯喷水| 三级三久久线久久99久目本WW| 日本欧美韩国国产在线| 美女啊啊啊啊啊| 久久精品91| 老女人碰碰在线碰碰视频| 亚洲AV无码天美传媒一区| 中文字幕av乱伦| 波多野42部无码喷潮在线观看| 久操电影| 丝袜AV一区二区三区| 亚洲午夜蜜臀| 射丝袜大香蕉| 色偷偷色偷偷欧美日韩| ,国产乱人伦精品一区二区三区| 天天弄天天操| 97婷婷色| 色色色999| 国产精品视频精品一二| 91成人久久| 亚洲va有码在线天堂| 国产黄色在线播放观看| 一中国女人毛片水真多| 在线观看中文字幕| 九九热九九| 蜜桃久久一区二区| 亚洲a色| 欧美亚洲今日在线| 亚洲一区二区av| 欧美激情 亚洲色图| 久久精品噜噜噜成人看免欧美大片| 久久人妻少妇| 狠狠操狠狠燥| 日本高清一本二本免费不卡| 熟女一区二区三区四区| 不卡六六在线91| 尤物视频偷拍免费| 欧美肥臀在线| 国产日本顶级一区二区三区| 午夜啊啊| 在线不欧美| 日本成a人v网站在线观看| 精品国产一区探花在线观看| 97超碰磁| 免费一级黄色录像影片| 人人人人插| 亚洲AV无码成人精品久久| 性爱1区| 日产狠狠干| 91人妻视频在线| 99青青草国产视频| 60秒免费视频| 国产国产亚洲一二三久久| 欧美日韩久久精品爱爱| 亚洲情色综合| 国产一区二区三区免费视频在性观看 | 人人操人人操人人人操| 亚洲精品第一| 久久久婷婷婷| 啪啪视频mP4| 精品无码人妻一区二区免费蜜桃| 97超色| 台湾佬激情综合| 八人操人人摸人人看| 国产又黄又粗的视频| 男女激烈网站最新| 人人操人人舒服| 久久久久久九九九| 久久啊啊| 97免费在线| 国产中出内射一区二区| a级免费在线观看| 东京热一区二区中文字幕| 亚洲综合影院| 亚洲精品一二区| 亚洲色久| 日本999精品| 久久黄色网址| 呻吟 欧美 日本 中出| 久艹99| 欧美猛交黑寡妇中文字幕| 国产Aα| 久久精品国产亚洲AV高清演员表| 国产精品久久久久久久久久久久久久吹 | 色噜噜人妻av 中文字幕| 欧美极品少妇交| 大香蕉十区| 99热婷婷一区二区三| 超碰97.com| 一本久道久久综合狠狠爱一密臀精| 探花精品 一区二区| 99这里只有精品国产| 五月激情啪啪| 欧美在线色| 日本久久女同性恋视频| 福利在线黄片| 久久中出在线| 熟妇熟女一区二区三区| 老司机射| 日韩午夜国产| 人妻丝袜美腿中文字幕| 天天躁日日躁AAA片李宗瑞| 97香蕉人人乳| 国产剧情在线| 日本综合久久| 日韩色女精品| 免费观看性欧美一级| 精品久久視頻在线| 在线播放欧洲免费av| 青娱乐国产盛宴视频| 日韩少妇丰满亚洲| 熟妇一区二区| 99re国产中文字幕| 超碰久久综合| 国产精品熟女九色九色蜜臀| 色性荡荡荡荡视频| 欧美性爱超碰97| 亚洲AV无码国产成人| 久久久男人的天堂| 亚欧免费| 熟啊v色欧美热| 凹凸视频在线一区二区| 又黄又爽在线观看视频| 久久东京热成人| 在线看免费无码AV天堂的| 日韩综合97P| 人人操人人操人人操人人操人人操人人人11.CM | 亚洲图片偷拍视频区| 亚洲色资源| 大香蕉www.超碰| a人欧美综合天堂麻豆| 啪啪性爱免费视频| 粘花网06av视频| 国产91影院| av操操不卡| 国产精品麻豆成人av| 啊啊好多水| se01国产在线视频| 色拍偷亚洲| 免费的黄片wwwwww| 青青草原av| www.久久| 97在线免费观看| 国产日韩精品一区二区三区| 老熟女乱伦片| 日韩人妻无码精品系列| a一区二区三区乱码在线| 欧美青青视频| 欧美激情中文字幕另类小说| 俺也射| 久久久97| 一区二区不卡视| 欧美色图亚洲特色| www.91理论| 精品人妻高清麻豆av| 99re9在线| 国产精品麻豆成人av| 亚洲美女 晚间男人天堂 | 91美乳| 亚洲欧美中文一区二区三| 精品女同一区| 开心五月激情网| 欧美欧美啪啪视频| 久噜噜| 日本综合久久| 久久性爱视频免费看| 国产精品久久久九九九| 韩国一级婬片A片AAAAA| 欧美综合另类| 欧美韩国你懂得在线 | 懂色AV一区二区三区| 欧美性生活男人的天堂| 日韩国产九九精品一区二区三区毛片| 操逼日韩无码| 囯产精品久久久久久久久久梁医生| 亚洲天堂情色| 五月婷婷六月丁香| 久久超碰国产一区二区三区| 试看60秒| 天天色香欲综合网| 黄片免费看的| 国产97免费视频| 97在线青| 女色视频社区| 一区二区视频在线播放| 九九九九热| 中文字幕二区| 情色av电影| 婷婷综合五月| 巨爆乳一区二区爆乳区| 神马麻豆福利院| 98超碰日本| 青青草在线视频人人想人人上| 久草免费在线一区二区| 伊人热综合| 亚洲中文丝袜美腿诱惑字幕| 色大师网站www永久网站视频| 超碰AV在线| 盗摄女人妻在线| 99婷婷一区二区| 精品人妻一区二区免费看| 久9久精品视频| 97亚洲一区| 婷婷色婷婷| 91在线精品| 国产一区二区三区视频在线看| 国产99999| 欧美色图自拍| 99精品人人爽| 免费9 1久久| 亚洲黑丝在线| 97色碰| 啊啊啊啊,啊啊好多水| 99综合自拍| 97综合在线观看| 婷婷色导航| 秋霞蝌科网日本一区| 亚洲日本激情| 婷婷超| 欧美色青| 南澳成人一级片在线播放| 超碰到97情色| 麻豆国产成人精品| 国产AV天美| 午夜久久一区二区无码中出| 亚洲第一页色| 亚洲第一综合| 丁香六月啪| 操美女高潮抽搐白浆| 精品在线观看视频在线| 国模艳艳啪啪一区| 黄色在线网站| 高清一区AV无码| 天天狠操| 日本性爱欧美性爱| 日本一区二区三区免费观看| 草草电影院| 极品销魂美女一区二区| 啪啪综合网| 亚洲成人激情小说视频| 亚欧色图在线激情| 亚洲综合999| 女沟厕偷窥piss小便| 一起草三级AV电影在线观看 | 女人喷水视频在线观看| 色色香蕉| 日本精品高清一二区一本到| 干婷婷综合网| 99在线精品观看99| 伊人成人中文字幕久久网| 九九久久九九久久| 九九玖玖精品| 啊啊啊啊二区好大| 黄色片G G G| 少妇大屁屁|