色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

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

Vuex 4 狀態(tài)管理全解析:核心原理、模塊拆分與高頻踩坑

Vuex 4 狀態(tài)管理全解析:核心原理、模塊拆分與高頻踩坑 Vuex 這玩意兒現(xiàn)在提起來(lái)有點(diǎn)微妙。新項(xiàng)目里 Pinia 基本是默認(rèn)選項(xiàng)很多人一上手 Vue 3 就沒(méi)碰過(guò) Vuex。但你去翻一翻手上維護(hù)的那些跑了三四年的中后臺(tái)系統(tǒng)十有八九還在store/index.js里躺著幾十個(gè) mutation改一個(gè)字段要先找 action、再找 mutation、最后才敢動(dòng) state。這時(shí)候你要是連 Vuex 的執(zhí)行鏈路都說(shuō)不清楚排查問(wèn)題基本靠猜。這篇就把 Vuex 的知識(shí)點(diǎn)掰開(kāi)揉碎講透從“到底什么時(shí)候該用它”到“store 怎么拆模塊”再到“為什么我的 commit 沒(méi)生效”這類真實(shí)踩坑全部過(guò)一遍。適合兩類人看一類是剛接手老項(xiàng)目、被mapState和各種root: true繞暈的新手另一類是想把狀態(tài)管理這塊徹底搞清楚、以后不管換 Pinia 還是別的庫(kù)都能快速上手的同學(xué)。代碼以 Vuex 4 Vue 3 為主線涉及 Vue 2 的差異我會(huì)單獨(dú)標(biāo)出來(lái)。1. 先搞清楚什么時(shí)候真的需要 Vuex1.1 狀態(tài)管理的邊界到底在哪我在帶人的時(shí)候發(fā)現(xiàn)一個(gè)特別普遍的問(wèn)題很多人學(xué)完 Vuex 的第一反應(yīng)是“好東西全塞進(jìn)去”。結(jié)果一個(gè)只有三個(gè)頁(yè)面的小工具store 里堆了二十多個(gè)字段其中一半是某個(gè)組件內(nèi)部的彈窗開(kāi)關(guān)。這就屬于把狀態(tài)管理當(dāng)成了全局變量倉(cāng)庫(kù)最后維護(hù)成本比不用還高。判斷一個(gè)狀態(tài)該不該進(jìn) store我一般看三條第一這份數(shù)據(jù)是不是被兩個(gè)以上互不相鄰的組件同時(shí)使用。父子組件之間傳值props加emit就夠了爺孫層級(jí)深一點(diǎn)provide/inject也能解決。只有當(dāng)兄弟組件、或者跨了好幾層的遠(yuǎn)房親戚都要讀寫(xiě)同一份數(shù)據(jù)時(shí)才輪到 Vuex 出場(chǎng)。第二這份數(shù)據(jù)是不是跨越了路由。比如登錄態(tài)、用戶信息、權(quán)限菜單從 A 頁(yè)面跳到 B 頁(yè)面還得用這種放在組件里必然會(huì)隨著組件銷毀而丟失必須提上去。第三這份數(shù)據(jù)變更后是不是需要留下可追溯的痕跡。Vuex 配 devtools 能記錄每一次 mutation 的時(shí)間旅行對(duì)于復(fù)雜的表單聯(lián)動(dòng)、購(gòu)物車(chē)增刪改這個(gè)調(diào)試能力值不少時(shí)間。反過(guò)來(lái)說(shuō)哪些不該進(jìn) store組件的 loading 狀態(tài)、某個(gè)列表的滾動(dòng)位置、彈窗的顯隱開(kāi)關(guān)這些都屬于“局部狀態(tài)”跟著組件生命周期走才是最干凈的。我見(jiàn)過(guò)有人把dialogVisible放進(jìn) store結(jié)果兩個(gè)頁(yè)面復(fù)用同一個(gè)彈窗組件時(shí)互相干擾排查了半天才發(fā)現(xiàn)是狀態(tài)被共享了。記住一句話狀態(tài)放得越高耦合就越重能不升就不升。還有一種常見(jiàn)誤區(qū)是把接口返回的原始數(shù)據(jù)全量塞進(jìn) store然后組件里再filter一遍。這樣做的問(wèn)題在于 store 變成了緩存層但你又沒(méi)做失效策略最后數(shù)據(jù)新舊不一致的 bug 特別難查。我的習(xí)慣是 store 只存“經(jīng)過(guò)業(yè)務(wù)加工、有明確語(yǔ)義”的狀態(tài)原始響應(yīng)體在 action 里處理完就丟掉。1.2 Vuex 和 Pinia 到底怎么選這個(gè)話題繞不開(kāi)。Pinia 確實(shí)是官方現(xiàn)在主推的方案API 更簡(jiǎn)潔、TypeScript 支持更好、沒(méi)有 mutation 這一層。但“新項(xiàng)目用 Pinia”不等于“Vuex 就沒(méi)用了”。我整理了一張對(duì)照表你對(duì)著自己項(xiàng)目的情況看就行。對(duì)比維度Vuex 4Pinia變更入口mutation 提交action 觸發(fā)直接改 stateaction 里也能改模塊機(jī)制modules namespaced 嵌套每個(gè) store 天然獨(dú)立TypeScript 支持需要額外類型聲明較繁瑣原生推導(dǎo)幾乎零配置devtools 時(shí)間旅行支持粒度到 mutation支持粒度到 action代碼量一個(gè)功能要寫(xiě) state/getter/mutation/action 四份基本一份 setup 或 option 就夠?qū)W習(xí)曲線概念多鏈路長(zhǎng)概念少接近組合式函數(shù)存量項(xiàng)目兼容原生可與 Vuex 共存逐模塊遷移適合場(chǎng)景老項(xiàng)目維護(hù)、團(tuán)隊(duì)已有約定新項(xiàng)目、TS 重度使用我的實(shí)際經(jīng)驗(yàn)是已經(jīng)在跑的 Vuex 項(xiàng)目別為了追新去動(dòng)它。遷移本身不難難的是遷移期間兩套狀態(tài)管理并存帶來(lái)的心智負(fù)擔(dān)以及測(cè)試覆蓋不足時(shí)的回歸風(fēng)險(xiǎn)。真要遷也是按模塊一個(gè)個(gè)搬先把用戶模塊搬過(guò)去跑一周沒(méi)問(wèn)題再搬下一個(gè)。反倒是新起的項(xiàng)目沒(méi)有歷史包袱直接上 Pinia 更省事。不過(guò)有一點(diǎn)要說(shuō)清楚Vuex 那套“mutation 必須同步、action 處理異步”的約束雖然寫(xiě)起來(lái)啰嗦但它強(qiáng)迫你把“改數(shù)據(jù)”和“做業(yè)務(wù)”分開(kāi)這個(gè)思維在團(tuán)隊(duì)協(xié)作里是有價(jià)值的。很多 Pinia 新手直接在 action 里一頓this.xxx yyy出了問(wèn)題連是哪一步改的都定位不到。所以就算你用的是 Pinia也建議保留“純函數(shù)式改狀態(tài)”的習(xí)慣。1.3 一張判斷清單幫你決定要不要引入我給自己團(tuán)隊(duì)寫(xiě)過(guò)一個(gè)很土但很好用的清單五個(gè)問(wèn)題中三個(gè)以上才考慮上 Vuex有沒(méi)有一份數(shù)據(jù)被三個(gè)以上的組件讀取且這些組件不在同一條父子鏈上這份數(shù)據(jù)會(huì)不會(huì)因?yàn)槁酚汕袚Q而需要保留這份數(shù)據(jù)的修改是否需要多人協(xié)作、且改動(dòng)點(diǎn)分散在多個(gè)文件出問(wèn)題時(shí)是否需要回放“誰(shuí)在什么時(shí)候改了什么”項(xiàng)目規(guī)模是不是已經(jīng)超過(guò)二十個(gè)頁(yè)面或者五個(gè)以上的業(yè)務(wù)模塊如果只中一兩條老老實(shí)實(shí)用props加組合式函數(shù)封裝別給自己找事。狀態(tài)管理的本質(zhì)是降低溝通成本不是炫技。2. Vuex 的五個(gè)核心概念一次捋直2.1 state單一狀態(tài)樹(shù)和它的設(shè)計(jì)原則Vuex 把所有狀態(tài)收攏到一棵樹(shù)里官方叫單一狀態(tài)樹(shù)Single Source of Truth。好處是任何一個(gè)時(shí)刻你都能通過(guò)store.state拿到應(yīng)用完整的數(shù)據(jù)快照調(diào)試的時(shí)候特別直觀。壞處是這棵樹(shù)如果沒(méi)人管長(zhǎng)到幾百個(gè)字段之后新人進(jìn)來(lái)根本看不懂哪個(gè)字段屬于哪個(gè)業(yè)務(wù)。我的做法是按業(yè)務(wù)域切分而不是按數(shù)據(jù)類型切分。什么叫按數(shù)據(jù)類型切就是state.list、state.detail、state.loading這么平鋪看著整齊實(shí)際上一旦業(yè)務(wù)變多就全亂。按業(yè)務(wù)域切就是user、order、permission各占一塊每個(gè)模塊自洽。具體到寫(xiě)法Vuex 4 里定義模塊的 state 一定要用函數(shù)返回對(duì)象// store/modules/user.js const state () ({ profile: null, token: , roles: [], permissionLoaded: false })為什么必須是函數(shù)因?yàn)槟K在注冊(cè)時(shí)會(huì)被合并進(jìn)根 state如果直接寫(xiě)對(duì)象字面量多個(gè)組件實(shí)例或者熱更新場(chǎng)景下會(huì)共享同一份引用出現(xiàn)“A 頁(yè)面改了 B 頁(yè)面也變了”的靈異事件。這個(gè)坑我在服務(wù)端渲染的項(xiàng)目里踩過(guò)一次排查了整整一個(gè)下午。另外 state 里的字段命名要帶語(yǔ)義。data、info、list這種詞盡量別用orderList、userProfile、pendingTaskCount一眼就知道是什么。字段一多命名就是最好的文檔。2.2 getters派生狀態(tài)和它的緩存機(jī)制getters 可以理解為 store 里的 computed。它的返回值會(huì)基于依賴做緩存依賴不變就不重新計(jì)算。這個(gè)特性用好了能省不少性能用不好反而會(huì)成為 bug 來(lái)源。const getters { isLogin: state Boolean(state.token), displayName: state state.profile?.nickname || state.profile?.username || 未登錄, // 依賴其他 getter第二個(gè)參數(shù)是當(dāng)前模塊的 getters welcomeText: (state, getters) ${getters.displayName}歡迎回來(lái), // 依賴根 state第四個(gè)參數(shù)是 rootState hasPermission: (state, getters, rootState) code { return state.roles.includes(code) || rootState.user.roles.includes(code) } }這里有個(gè)關(guān)鍵點(diǎn)getter 返回函數(shù)時(shí)緩存就失效了。上面hasPermission返回的是一個(gè)函數(shù)每次調(diào)用都會(huì)重新執(zhí)行因?yàn)?Vue 沒(méi)法追蹤函數(shù)內(nèi)部用到的參數(shù)。這種寫(xiě)法適合做權(quán)限判斷這類需要傳參的場(chǎng)景但別在模板里高頻調(diào)用它尤其是列表渲染里v-for每一項(xiàng)都調(diào)一次性能會(huì)明顯下降。真要這么用先在 computed 里把結(jié)果算好。還有一個(gè)容易翻車(chē)的地方getter 里返回新對(duì)象。比如// 不推薦每次都返回新數(shù)組緩存形同虛設(shè) filteredList: state state.list.filter(item item.active)因?yàn)閒ilter每次執(zhí)行都會(huì)產(chǎn)生新數(shù)組引用Vue 的依賴追蹤會(huì)認(rèn)為結(jié)果變了導(dǎo)致依賴這個(gè) getter 的組件反復(fù)更新。如果這個(gè)列表很大、更新又頻繁頁(yè)面會(huì)明顯卡頓。正確做法是把過(guò)濾邏輯放到組件 computed 里或者用shallowRef之類的思路做手動(dòng)緩存。我在一個(gè)萬(wàn)級(jí)數(shù)據(jù)的表格項(xiàng)目里就吃過(guò)這個(gè)虧后來(lái)把 getter 改成了只做簡(jiǎn)單映射流暢度立刻回來(lái)了。2.3 mutations為什么它必須是同步的這是 Vuex 里被問(wèn)得最多的問(wèn)題?!拔揖驮?mutation 里發(fā)個(gè)請(qǐng)求怎么了”答案藏在 devtools 的工作原理里。devtools 記錄狀態(tài)變化的方式是每執(zhí)行一次 mutation就拍一張 state 的快照存進(jìn)時(shí)間線。如果你在 mutation 里發(fā)異步請(qǐng)求那么“mutation 開(kāi)始執(zhí)行”和“state 真正被改”之間存在時(shí)間差devtools 拍到的那張快照可能是請(qǐng)求還沒(méi)回來(lái)的中間態(tài)。等你點(diǎn)時(shí)間旅行回到某一步看到的狀態(tài)和實(shí)際不符調(diào)試就徹底失去了意義。所以 Vuex 強(qiáng)制 mutation 同步是為了保證每一幀快照都是確定性的。const mutations { SET_PROFILE(state, payload) { state.profile payload }, SET_TOKEN(state, token) { state.token token }, ADD_ROLE(state, role) { if (!state.roles.includes(role)) { state.roles.push(role) } }, RESET(state) { // 重置時(shí)不要直接替換整個(gè) state 對(duì)象Vue 會(huì)丟失響應(yīng)式追蹤 Object.assign(state, { profile: null, token: , roles: [], permissionLoaded: false }) } }mutation 的命名我統(tǒng)一用全大寫(xiě)加下劃線這是社區(qū)慣例好處是在 devtools 列表里一眼就能和 action 區(qū)分開(kāi)。action 用小駝峰比如fetchProfile。這套約定看起來(lái)是小事但團(tuán)隊(duì)人多的時(shí)候能省掉很多溝通。還有一個(gè)細(xì)節(jié)mutation 里不要做副作用。什么叫副作用發(fā)請(qǐng)求、寫(xiě) localStorage、彈 toast這些都算。mutation 應(yīng)該是一個(gè)純函數(shù)給它同樣的輸入state 就變成同樣的結(jié)果。這樣你寫(xiě)單元測(cè)試的時(shí)候只需要斷言 state 變化不用 mock 一堆東西。2.4 actions異步編排和業(yè)務(wù)邏輯的落腳點(diǎn)action 是 Vuex 里唯一允許寫(xiě)異步的地方它不直接改 state而是通過(guò)commit觸發(fā) mutation。這個(gè)設(shè)計(jì)看起來(lái)多繞了一層實(shí)際上把“業(yè)務(wù)流程”和“數(shù)據(jù)變更”解耦了。const actions { async fetchProfile({ commit, state, dispatch }, force false) { if (state.profile !force) { return state.profile } const res await api.getUserProfile() commit(SET_PROFILE, res.data) // 跨模塊調(diào)用要加 root: true await dispatch(permission/loadRoutes, res.data.roles, { root: true }) return res.data }, async login({ commit, dispatch }, { username, password }) { const { token } await api.login({ username, password }) commit(SET_TOKEN, token) await dispatch(fetchProfile, true) }, logout({ commit }) { commit(RESET) commit(permission/RESET, null, { root: true }) } }action 的返回值很重要。因?yàn)?action 內(nèi)部是 Promise你可以在組件里await store.dispatch(login, form)拿到結(jié)果后再做跳轉(zhuǎn)或者提示。很多老代碼里 action 不 return組件只能靠 watch 某個(gè) state 來(lái)判斷成功與否這種寫(xiě)法非常脆弱。養(yǎng)成習(xí)慣action 有結(jié)果就 return 出去??缒K dispatch 的{ root: true }是新手最容易漏的參數(shù)。不加這個(gè)參數(shù)Vuex 會(huì)只在當(dāng)前模塊內(nèi)查找 action找不到就靜默失敗或者報(bào)unknown action type。我第一次遇到的時(shí)候盯著代碼看了半小時(shí)最后發(fā)現(xiàn)就是少了個(gè) root。2.5 modules 和 namespaced拆分與隔離項(xiàng)目一大單文件 store 必然爆炸。modules 就是用來(lái)拆的而namespaced: true決定了拆完之后彼此是否隔離。// store/index.js import { createStore } from vuex import user from ./modules/user import permission from ./modules/permission import cart from ./modules/cart export default createStore({ strict: import.meta.env.DEV, modules: { user: { namespaced: true, ...user }, permission: { namespaced: true, ...permission }, cart: { namespaced: true, ...cart } } })開(kāi)不開(kāi)命名空間我的答案是業(yè)務(wù)模塊一律開(kāi)。不開(kāi)的話所有模塊的 mutation 都注冊(cè)在全局兩個(gè)模塊都定義了SET_LOADING后注冊(cè)的會(huì)覆蓋前一個(gè)這種 bug 隱蔽性極強(qiáng)。開(kāi)了之后方法名變成user/SET_LOADING雖然寫(xiě)起來(lái)長(zhǎng)一點(diǎn)但邊界清晰。全局的通用狀態(tài)比如 app 級(jí)別的主題、語(yǔ)言可以單開(kāi)一個(gè)不開(kāi)命名空間的 root 模塊但數(shù)量要克制。嵌套模塊的調(diào)用鏈路也要理清楚。假設(shè)有個(gè)setting模塊掛在user下面那么在setting的 action 里調(diào)用兄弟模塊路徑要寫(xiě)成dispatch(cart/addItem, item, { root: true })。這個(gè) root 參數(shù)指的是“從根開(kāi)始找”不管你現(xiàn)在在哪一層。記不住的話就記一句只要跨出當(dāng)前模塊就帶 root: true。3. 從零搭一個(gè)能落地的 Store 結(jié)構(gòu)3.1 目錄設(shè)計(jì)和模塊拆分原則先看目錄這是我用了幾年、覺(jué)得最不容易亂的一種src/ ├── store/ │ ├── index.js // 入口注冊(cè)模塊和插件 │ ├── plugins/ │ │ └── persist.js // 持久化插件 │ ├── modules/ │ │ ├── user.js // 用戶信息、登錄態(tài) │ │ ├── permission.js // 路由權(quán)限、菜單 │ │ └── cart.js // 業(yè)務(wù)模塊示例 │ └── helpers.js // 通用工具比如生成 mutation types拆分粒度怎么定我的一般原則是一個(gè)模塊對(duì)應(yīng)一個(gè)業(yè)務(wù)域而不是一個(gè)頁(yè)面。比如訂單列表和訂單詳情都屬于 order 模塊不要拆成兩個(gè)。反過(guò)來(lái)用戶和權(quán)限雖然是相關(guān)的但職責(zé)不同用戶管“我是誰(shuí)”權(quán)限管“我能看什么”拆開(kāi)更好維護(hù)。模塊內(nèi)部的結(jié)構(gòu)我習(xí)慣按state → getters → mutations → actions → 導(dǎo)出的順序?qū)懞?Vuex 的執(zhí)行鏈路一致讀代碼的人從上往下看正好是數(shù)據(jù)流向。文件末尾統(tǒng)一導(dǎo)出export default { namespaced: true, state, getters, mutations, actions }有一點(diǎn)要注意如果模塊之間有數(shù)據(jù)依賴不要在模塊文件里直接import另一個(gè)模塊的 state那樣會(huì)造成循環(huán)依賴。正確方式是通過(guò)rootState讀取或者用dispatch讓對(duì)方的 action 來(lái)處理。3.2 完整實(shí)現(xiàn)一個(gè)購(gòu)物車(chē)模塊光說(shuō)概念沒(méi)意思直接上一個(gè)能跑的。假設(shè)我們要做一個(gè)購(gòu)物車(chē)需求是加商品、改數(shù)量、刪除、算總價(jià)、選中狀態(tài)管理。// store/modules/cart.js const state () ({ items: [], // { id, name, price, count, checked } submitting: false }) const getters { totalCount: state state.items.reduce((sum, i) sum i.count, 0), checkedItems: state state.items.filter(i i.checked), totalPrice: (state, getters) { // 金額用分做單位避免浮點(diǎn)誤差最后再除以 100 const cents getters.checkedItems.reduce((sum, i) sum i.price * 100 * i.count, 0) return cents / 100 }, isAllChecked: state state.items.length 0 state.items.every(i i.checked) } const mutations { ADD_ITEM(state, product) { const exist state.items.find(i i.id product.id) if (exist) { exist.count 1 } else { state.items.push({ ...product, count: 1, checked: true }) } }, UPDATE_COUNT(state, { id, count }) { const item state.items.find(i i.id id) if (item) { item.count Math.max(1, Math.min(99, count)) } }, TOGGLE_CHECK(state, id) { const item state.items.find(i i.id id) if (item) item.checked !item.checked }, TOGGLE_ALL(state, checked) { state.items.forEach(i { i.checked checked }) }, REMOVE_ITEM(state, id) { state.items state.items.filter(i i.id ! id) }, SET_SUBMITTING(state, flag) { state.submitting flag }, CLEAR(state) { state.items [] } } const actions { async checkout({ commit, state, rootState }) { if (!state.items.length) return { ok: false, msg: 購(gòu)物車(chē)是空的 } const payload state.items .filter(i i.checked) .map(i ({ productId: i.id, count: i.count })) commit(SET_SUBMITTING, true) try { const res await api.submitOrder({ items: payload, userId: rootState.user.profile?.id }) commit(REMOVE_ITEM_BATCH, res.data.removedIds) return { ok: true, orderId: res.data.orderId } } catch (e) { return { ok: false, msg: e.message } } finally { commit(SET_SUBMITTING, false) } } } export default { namespaced: true, state, getters, mutations, actions }這里有幾個(gè)我自己踩過(guò)坑之后固定下來(lái)的寫(xiě)法。金額全部用“分”來(lái)算最后展示時(shí)再轉(zhuǎn)回元0.1 0.2那種經(jīng)典浮點(diǎn)問(wèn)題在電商場(chǎng)景真的會(huì)出事。數(shù)量做了Math.max(1, Math.min(99, count))的鉗制防止用戶在輸入框里手打負(fù)號(hào)或者超大批量。checkout的返回值統(tǒng)一成{ ok, msg }結(jié)構(gòu)組件層不用 try-catch直接看ok就行。另外REMOVE_ITEM_BATCH我在 mutations 里沒(méi)寫(xiě)實(shí)際項(xiàng)目中應(yīng)該補(bǔ)上避免循環(huán)提交單條刪除。這類細(xì)節(jié)在真實(shí)業(yè)務(wù)里會(huì)因?yàn)榕坎僮鲗?dǎo)致幾十次 commitdevtools 面板直接被刷屏。3.3 組件里怎么調(diào)用四種方式對(duì)比Vuex 提供的調(diào)用方式有好幾種很多人只會(huì)mapState遇到方法就不知道咋辦了。列個(gè)表對(duì)照著記場(chǎng)景選項(xiàng)式寫(xiě)法組合式寫(xiě)法setup讀 statecomputed(() this.$store.state.user.profile)const profile computed(() store.state.user.profile)讀 getterthis.$store.getters[user/isLogin]computed(() store.getters[user/isLogin])觸發(fā) mutationthis.$store.commit(user/SET_TOKEN, t)store.commit(user/SET_TOKEN, t)觸發(fā) actionawait this.$store.dispatch(user/login, f)await store.dispatch(user/login, f)批量映射...mapState(user, [profile])storeToRefs(store.state.user)配合解構(gòu)組合式 API 里推薦用useStore加storeToRefsimport { computed } from vue import { useStore } from vuex import { storeToRefs } from pinia // 注意Vuex 沒(méi)有官方 storeToRefs這里用 toRefs 替代 export default { setup() { const store useStore() // 直接解構(gòu)會(huì)丟失響應(yīng)式必須轉(zhuǎn)成 ref const { profile, token } toRefs(store.state.user) const isLogin computed(() store.getters[user/isLogin]) function handleAdd(product) { store.commit(cart/ADD_ITEM, product) } return { profile, token, isLogin, handleAdd } } }補(bǔ)充一句上面代碼里storeToRefs是 Pinia 的 APIVuex 項(xiàng)目要用 Vue 的toRefs配合store.state.模塊名。這個(gè)區(qū)別我見(jiàn)過(guò)不止一個(gè)人寫(xiě)混。toRefs只能處理普通響應(yīng)式對(duì)象store.state本身就是響應(yīng)式的所以能用但store.getters不行因?yàn)?getters 是每次訪問(wèn)時(shí)動(dòng)態(tài)計(jì)算的得用computed包一層。選項(xiàng)式 API 里用輔助函數(shù)會(huì)簡(jiǎn)潔很多import { mapState, mapGetters, mapActions } from vuex export default { computed: { ...mapState(cart, [items, submitting]), ...mapGetters(cart, [totalPrice, isAllChecked]), // 自己再算的派生值 isEmpty() { return this.items.length 0 } }, methods: { ...mapActions(cart, [checkout]), async onSubmit() { const res await this.checkout() if (res.ok) { // 跳轉(zhuǎn)邏輯 } } } }有個(gè)小坑要提醒mapState映射出來(lái)的名字如果和組件data里的字段重名Vue 會(huì)告警而且行為不確定。命名的時(shí)候盡量錯(cuò)開(kāi)或者在映射時(shí)用對(duì)象形式重命名...mapState(cart, { cartItems: items })。3.4 嚴(yán)格模式、持久化插件和 devtools 配置嚴(yán)格模式我強(qiáng)烈建議只在開(kāi)發(fā)環(huán)境開(kāi)const store createStore({ strict: import.meta.env.DEV, modules: { ... } })嚴(yán)格模式下任何不經(jīng)過(guò) mutation 的 state 修改都會(huì)拋錯(cuò)[vuex] do not mutate vuex store state outside mutation handlers。這個(gè)檢查很耗性能因?yàn)樗枰疃缺O(jiān)聽(tīng)整棵 state 樹(shù)。生產(chǎn)環(huán)境開(kāi)嚴(yán)格模式在大型應(yīng)用里能明顯感覺(jué)到卡頓。用 Vite 的話import.meta.env.DEV就是現(xiàn)成的webpack 環(huán)境用process.env.NODE_ENV ! production。持久化這塊Vuex 本身不提供社區(qū)有插件但也都不太維護(hù)了我一般手寫(xiě)一個(gè)三十行的插件// store/plugins/persist.js const KEY APP_STORE_V1 export default function createPersistPlugin(paths []) { return store { // 恢復(fù) const raw localStorage.getItem(KEY) if (raw) { try { const saved JSON.parse(raw) paths.forEach(path { const [module, field] path.split(/) const target module ? store.state[module] : store.state if (saved[path] ! undefined) { target[field] saved[path] } }) } catch (e) { localStorage.removeItem(KEY) } } // 保存做節(jié)流避免頻繁寫(xiě)入 let timer null store.subscribe((mutation, state) { clearTimeout(timer) timer setTimeout(() { const data {} paths.forEach(path { const [module, field] path.split(/) const target module ? state[module] : state data[path] target?.[field] }) localStorage.setItem(KEY, JSON.stringify(data)) }, 300) }) } }用它的時(shí)候只白名單需要的字段createStore({ plugins: [createPersistPlugin([user/token, cart/items])] })為什么只白名單而不是全量存因?yàn)閟ubmitting、loading這類瞬時(shí)狀態(tài)被持久化下來(lái)刷新頁(yè)面后按鈕會(huì)一直處于 loading 狀態(tài)用戶以為卡死了。我見(jiàn)過(guò)一個(gè)項(xiàng)目把整個(gè) store 都存了 localStorage結(jié)果用戶重新打開(kāi)頁(yè)面上次沒(méi)提交完的表單數(shù)據(jù)混著新數(shù)據(jù)出現(xiàn)問(wèn)題反饋了一堆。4. 高頻踩坑與排查實(shí)錄4.1 報(bào)錯(cuò)信息對(duì)照表先會(huì)看再看懂Vuex 的報(bào)錯(cuò)信息其實(shí)寫(xiě)得挺清楚只是新手不知道往哪查。整理一張表遇到問(wèn)題先對(duì)號(hào)入座報(bào)錯(cuò)內(nèi)容大概率原因處理方式[vuex] unknown mutation type: xxx模塊沒(méi)開(kāi) namespaced或漏寫(xiě)模塊前綴檢查模塊配置commit 時(shí)補(bǔ)上模塊名/[vuex] unknown action type: xxx跨模塊調(diào)用漏了{(lán) root: true }dispatch 第三個(gè)參數(shù)加上 root[vuex] unknown getter: xxxgetters 沒(méi)導(dǎo)出或訪問(wèn)路徑錯(cuò)確認(rèn) export default 里有 gettersdo not mutate vuex store state outside mutation handlers開(kāi)發(fā)環(huán)境嚴(yán)格模式直接改了 state把所有賦值搬進(jìn) mutation[vuex] module namespace not found in mapState()模塊名拼錯(cuò)或模塊還沒(méi)注冊(cè)檢查 createStore 的 modules 鍵名Cannot read property xxx of undefined模塊 state 寫(xiě)成了對(duì)象但被復(fù)用state 改成函數(shù)返回?cái)?shù)據(jù)改了但頁(yè)面沒(méi)更新直接改數(shù)組下標(biāo)或?qū)ο笮略鰧傩杂?mutation 里整體替換或Vue.setVue 2這張表我自己貼在工位旁邊貼了兩年新人來(lái)的時(shí)候直接拍照。說(shuō)實(shí)話Vuex 報(bào)錯(cuò)里 80% 都是“路徑寫(xiě)錯(cuò)”或者“沒(méi)開(kāi)命名空間”這兩類剩下 20% 是響應(yīng)式丟失。4.2 響應(yīng)式丟失的幾種典型情況Vue 2 時(shí)代最經(jīng)典的問(wèn)題state.list[0] newItem頁(yè)面不更新。原因是Object.defineProperty攔截不到數(shù)組下標(biāo)賦值。Vue 3 換成 Proxy 之后這個(gè)問(wèn)題基本解決了但如果你維護(hù)的是 Vue 2 Vuex 3 的項(xiàng)目還是得注意數(shù)組按下標(biāo)賦值用splice或者整體替換數(shù)組對(duì)象新增屬性用Vue.set(obj, key, val)刪除屬性用Vue.delete(obj, key)Vue 3 里雖然 Proxy 能攔截新增和刪除但還是有兩個(gè)容易忽略的點(diǎn)。一是reactive對(duì)象被解構(gòu)之后失去響應(yīng)式比如const { profile } store.state.user后面profile就是普通對(duì)象了怎么改頁(yè)面都不動(dòng)。二是把 state 里的對(duì)象直接賦給組件里的變量做雙向綁定v-model一改就直接改了 state繞過(guò) mutation開(kāi)發(fā)環(huán)境立刻報(bào)嚴(yán)格模式錯(cuò)誤。正確的v-model寫(xiě)法是這樣computed: { keyword: { get() { return this.$store.state.cart.keyword }, set(val) { this.$store.commit(cart/SET_KEYWORD, val) } } }啰嗦是啰嗦但這條鏈路是完整的devtools 能記錄到每一次輸入。如果嫌麻煩就在組件內(nèi)用本地 ref提交時(shí)再一次性寫(xiě)回 store。4.3 性能問(wèn)題什么時(shí)候 store 成了瓶頸Vuex 的性能問(wèn)題我遇到過(guò)的就那么幾類但每一類都很要命。第一類是大列表全量放進(jìn) store。有個(gè)項(xiàng)目把五千條訂單數(shù)據(jù)放在 state 里每次篩選都要經(jīng)過(guò) getter頁(yè)面卡得沒(méi)法用。后來(lái)改成 store 只存篩選條件列表數(shù)據(jù)留在組件里通過(guò) action 拿問(wèn)題立刻解決。記住store 適合存“狀態(tài)”不適合存“數(shù)據(jù)集合”。第二類是在 getter 里做重計(jì)算。比如對(duì)列表做排序、格式化日期、算分組小計(jì)這些操作如果依賴頻繁變化getter 會(huì)被反復(fù)觸發(fā)。我的做法是把這類計(jì)算移到組件 computed或者在 store 里緩存一份計(jì)算結(jié)果只在源數(shù)據(jù)變化時(shí)重算。第三類是過(guò)度訂閱。mapState把整個(gè)模塊的 state 都映射進(jìn)來(lái)其中某個(gè)字段高頻變化導(dǎo)致組件整體重新渲染。用computed精確取需要的字段能緩解一部分更好的辦法是把高頻變化的狀態(tài)比如輸入框的值、鼠標(biāo)坐標(biāo)留在組件本地不要進(jìn) store。還有一種不太容易發(fā)現(xiàn)的devtools 開(kāi)著跑生產(chǎn)構(gòu)建。Vuex 的 devtools 集成在開(kāi)發(fā)模式下才有但如果你不小心在生產(chǎn)包里引入了開(kāi)發(fā)版本的 Vue性能會(huì)差好幾倍。打包配置里確認(rèn)一下mode和define有沒(méi)有問(wèn)題這個(gè)坑我踩過(guò)一次找了一周。4.4 老項(xiàng)目遷移與工程化建議如果手上的 Vuex 項(xiàng)目要重構(gòu)我建議按這個(gè)順序推進(jìn)別一把梭。第一步先把所有this.$store的直接調(diào)用收斂成統(tǒng)一的 API 層。寫(xiě)一個(gè)src/store/api.js把常用的讀寫(xiě)封裝成函數(shù)比如useUser()、useCart()。這一步不改邏輯只是加一層殼風(fēng)險(xiǎn)極低。第二步把模塊的 mutation 命名規(guī)范化。原來(lái)可能叫setUser、updateUser、changeUser統(tǒng)一成SET_USER。這一步靠grep加人工核對(duì)工作量不大但收益明顯后面遷移 Pinia 時(shí)一一對(duì)應(yīng)就能改。第三步按模塊遷移。先挑一個(gè)依賴最少的模塊比如cart改成 Pinia 的defineStore然后在入口同時(shí)注冊(cè)兩套。Vuex 和 Pinia 是可以共存的只要?jiǎng)e讓同一個(gè)業(yè)務(wù)狀態(tài)兩邊都存就行。第四步清理。所有模塊遷完之后刪掉 Vuex 依賴把mapState之類的 import 全部替換。這一步用 ESLint 的自定義規(guī)則能掃出一部分剩下的靠編譯報(bào)錯(cuò)兜底。遷移過(guò)程中有個(gè)細(xì)節(jié)值得說(shuō)Pinia 的storeToRefs和 Vuex 的toRefs行為不完全一樣直接在組件里解構(gòu)很容易出問(wèn)題。我當(dāng)時(shí)的做法是先把所有組件里的解構(gòu)都改成computed遷完之后再按需優(yōu)化。寧可多寫(xiě)幾行也別在響應(yīng)式上翻車(chē)。5. 幾個(gè)真實(shí)場(chǎng)景下的套路組合5.1 登錄態(tài)與路由守衛(wèi)的配合登錄態(tài)是最典型的需要 store 的場(chǎng)景但它和路由守衛(wèi)的配合有個(gè)時(shí)序問(wèn)題必須處理。守衛(wèi)在頁(yè)面渲染前執(zhí)行這時(shí)候如果 store 里的用戶信息還沒(méi)加載權(quán)限判斷就會(huì)失敗用戶被誤踢回登錄頁(yè)。我的處理方式是token 從 localStorage 同步恢復(fù)用戶信息異步加載但守衛(wèi)里做“是否已加載”的判斷沒(méi)加載就先觸發(fā) action 并等待。// permission.js router.beforeEach(async (to, from, next) { const store useStore() const token store.state.user.token if (!token) { return to.meta.public ? next() : next({ path: /login, query: { redirect: to.fullPath } }) } if (!store.state.user.permissionLoaded) { try { await store.dispatch(user/fetchProfile) await store.dispatch(permission/loadRoutes) } catch (e) { store.commit(user/RESET) return next(/login) } } if (to.meta.roles !store.getters[user/hasPermission](to.meta.roles)) { return next(/403) } next() })這里的關(guān)鍵是permissionLoaded這個(gè)標(biāo)記位。沒(méi)有它每次路由跳轉(zhuǎn)都要重新拉一次用戶信息接口壓力大不說(shuō)頁(yè)面還會(huì)閃。有了它第一次加載完之后所有跳轉(zhuǎn)都是同步判斷體驗(yàn)就順了。異步路由用router.addRoute動(dòng)態(tài)注冊(cè)注冊(cè)完再next({ ...to, replace: true })重新進(jìn)入一次否則會(huì)白屏。5.2 跨模塊協(xié)作別讓模塊之間互相 import項(xiàng)目一大模塊之間必然有協(xié)作。比如下單成功后要清空購(gòu)物車(chē)、刷新訂單列表、更新用戶積分。這三件事分屬三個(gè)模塊怎么串起來(lái)最差的做法是在order模塊里import cart from ./cart然后直接調(diào)。這樣寫(xiě)會(huì)形成循環(huán)依賴打包時(shí)可能報(bào)錯(cuò)運(yùn)行時(shí)也可能拿到 undefined。正確做法是通過(guò) action 互相 dispatch// order 模塊的 action async createOrder({ commit, dispatch }, payload) { const res await api.createOrder(payload) commit(ADD_ORDER, res.data) // 跨模塊通知各自處理各自的邏輯 await dispatch(cart/clearChecked, null, { root: true }) await dispatch(user/refreshPoints, null, { root: true }) return res.data }這樣order模塊不需要知道cart內(nèi)部怎么實(shí)現(xiàn)只要知道有這么個(gè) action 就行。耦合度低測(cè)試也好寫(xiě)。如果模塊數(shù)量多、協(xié)作關(guān)系復(fù)雜可以再引入一個(gè)“編排層”專門(mén)寫(xiě)跨模塊的 action把業(yè)務(wù)流程集中在一處。還有個(gè)小技巧跨模塊讀取數(shù)據(jù)用 getters不要直接讀rootState.xxx.yyy。getters 是一層抽象將來(lái)內(nèi)部結(jié)構(gòu)變了只要 getter 的返回不變調(diào)用方就不用改。5.3 表單草稿和列表緩存的取舍后臺(tái)系統(tǒng)里最常見(jiàn)的兩個(gè)需求表單填一半切走了回來(lái)要恢復(fù)列表翻到第五頁(yè)點(diǎn)進(jìn)詳情再返回要停在第五頁(yè)。表單草稿我的做法是不進(jìn) store用sessionStorage加組件內(nèi)的watch做防抖保存。原因很簡(jiǎn)單草稿是頁(yè)面級(jí)的狀態(tài)多個(gè)表單同時(shí)編輯時(shí)放 store 會(huì)互相干擾還要處理各種清理邏輯。sessionStorage 天然按標(biāo)簽頁(yè)隔離關(guān)掉就沒(méi)了符合直覺(jué)。列表緩存反而適合進(jìn) store。因?yàn)楹Y選條件、頁(yè)碼、排序方式這些是需要跨路由保留的而且詳情頁(yè)返回時(shí)要用。做法是在list模塊里存一份query對(duì)象列表頁(yè)onMounted時(shí)讀出來(lái)發(fā)起請(qǐng)求條件變化時(shí)同步更新。要注意的是從菜單重新點(diǎn)進(jìn)列表時(shí)應(yīng)該重置從詳情返回時(shí)應(yīng)該保留這個(gè)區(qū)分靠路由的meta.keepAlive或者判斷from路徑來(lái)做。const actions { async loadList({ state, commit }, { reset false } {}) { if (reset) { commit(RESET_QUERY) } const res await api.getList(state.query) commit(SET_LIST, res.data) } }reset參數(shù)由調(diào)用方?jīng)Q定模塊本身不猜。這種“讓調(diào)用方明確表達(dá)意圖”的設(shè)計(jì)比在模塊里寫(xiě)一堆 if 判斷當(dāng)前路由要清晰得多。6. 我個(gè)人在實(shí)際項(xiàng)目里的幾點(diǎn)體會(huì)寫(xiě)到這里Vuex 的主要知識(shí)點(diǎn)基本都覆蓋了。最后分享幾個(gè)不太適合寫(xiě)進(jìn)文檔、但實(shí)際干活時(shí)確實(shí)管用的經(jīng)驗(yàn)。第一別怕寫(xiě)重復(fù)代碼。Vuex 的四段式state/getters/mutations/actions看起來(lái)很啰嗦但每多寫(xiě)一行將來(lái)排查問(wèn)題時(shí)就少猜一次。我曾經(jīng)為了省事把 mutation 和 action 合并成一個(gè)函數(shù)結(jié)果 devtools 里全是匿名調(diào)用出問(wèn)題時(shí)完全不知道是誰(shuí)改的。后來(lái)老老實(shí)實(shí)拆開(kāi)調(diào)試效率反而高了。第二給 store 加注釋比加文檔有用。每個(gè)模塊文件頂部寫(xiě)清楚這個(gè)模塊管什么、依賴誰(shuí)、被誰(shuí)依賴比單獨(dú)維護(hù)一份文檔靠譜得多。文檔會(huì)過(guò)期代碼不會(huì)。我現(xiàn)在接手新項(xiàng)目第一件事就是看 store 模塊的頂部注釋五分鐘就能摸清業(yè)務(wù)脈絡(luò)。第三調(diào)試時(shí)善用 devtools 的 import/export。Vuex 面板可以把當(dāng)前狀態(tài)導(dǎo)出成 JSON也能導(dǎo)入一份狀態(tài)來(lái)復(fù)現(xiàn)問(wèn)題。遇到用戶反饋的詭異 bug讓對(duì)方導(dǎo)出一份狀態(tài)文件本地導(dǎo)入后就能完全復(fù)現(xiàn)當(dāng)時(shí)的場(chǎng)景比反復(fù)溝通效率高太多。這個(gè)功能知道的人不多但真的好用。第四測(cè)試只測(cè) action 和 getter。state 和 mutation 太簡(jiǎn)單測(cè)了也是形式主義。真正有價(jià)值的是 action 里的業(yè)務(wù)流程和 getter 里的計(jì)算邏輯這兩塊寫(xiě)單測(cè)覆蓋率能上一個(gè)大臺(tái)階。測(cè) action 的時(shí)候記得 mock 掉commit和dispatch用jest.fn()或者vi.fn()都行斷言調(diào)用參數(shù)就夠了。最后提一句狀態(tài)管理這塊工具會(huì)換但“什么狀態(tài)該放在哪一層、變更走什么路徑、如何保證可追溯”這三個(gè)問(wèn)題不會(huì)變。把 Vuex 這套東西吃透換成 Pinia、換成任何別的方案思路都是通用的。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
精品91日日夜夜超清资源| 国产自产91区13区| 日本免费一区二区不卡 | 久久99精品九九久久久婷婷| 精品久久久久久AV无码| 国产麻豆福利av在线播放| 丁香五月色| 蜜臀一二三区| 我要看免费韩日黄片| 色踪合AV| 欧美成va视频网站| 97久久久网站| 一起草av| 国产精品视屏| 欧亚日韩中文在线| 午夜福利免费福利视频| 精品久久久久成人码免| 亚洲精品人妻吞精av| 老熟妇一区二区三区啪啪| 综合久久久久久久久91| 夜草欧美| 欧美色宗合| 亚洲婷婷五月天| 日夜尻逼网| 国产精品亚洲免费| 国产精品人妻免费精品| 97 国产一区| 国产日韩色综合| 久久人妇| 一级啊性爱在线视频| 嫩草 人人网精品| 国产v亚洲v日韩v欧美v片另类| 人妻精品一区二区在线| 91亚洲综合在线| 欧洲色色| 囯产精品久久久久久久久久梁医生 | 久久超碰天天| 中文字幕大片三级狠狠干| 欧洲久久一二线| 91最新综合| 黄色激情电影在线观看| 超碰人妻久久人妻中文97| 74成人在线| 男人的天堂在线| 亚洲成人福利电影免费| 欧美色91| 五十路熟女工口 | 黄色在线网站| 国产精品天堂| 久久久专区| 十八岁啪啪视频免费看| 操曰本熟女| 91中文精品日韩欧美在线| 久9无限国产| 少妇啪啪自拍| 老熟女乱伦一区| 久久日本熟女精品一区| 欧美在线啊啊| 国产精品久久久九九九| 狠狠中文字幕| 国产精品激情久久久久久久| 91 欧美| 啊啊啊快操我视频| 日韩性爱播放| 老子午夜伦不卡影院| 在线五区| 午夜精品久久久久久久99蜜桃一| 情色五月天就去干| 欧美在线伊人色| 成人久久久| 殴美牲| 国产精品宅男免费| 97综合激情| 日韩欧美被操黄免费观看| 爽 好舒服 无码刺激久久| 欧美夜夜| 91操熟妇| 欧美综合 站| 91精品久久久久五月天精品 | 99久久婷婷国产综合| 国产二区三区免费视频| 96精品久久| 欧美伦乱爱| 六九九九| 中文字幕无码不卡啪啪| 麻豆AV一区二区| 五月婷婷爱六月丁香色| 欧美日本中字另类在线| 乱伦一二三区| 亚洲人成网站7777| 欧美裸体美女日麻屄| 久操视频在线| 亚洲欧美高清无码| 日韩精品一二三| 大香蕉中文在线| 很很干很很操| www.成人无码| 91黑丝在线播放| 97视频在线观看网站| 99热思思| 婷婷丁香五月激情啪啪| 在线国产福利网址导航| 欧美亚洲一级在线观看| 国产精品高潮久久久无码| 热热色AV| 公司1区2区3区精产精| 一道本东京热加勒比一区二区三区 | 天美精品原创av片国产| 啊啊啊好想要| 外国91| 一区二区三区四区五区久久久久久| 久草五月| 爱我干综合| 免费国产视频| 精品乱码在线观看| 亚洲爱爱视频一区二区| 超碰色中文| 色哟哟国产精品免费网址| 婷婷五月成人| 97色在线| 97精品综合久久| 国产日本久久免费精品| 狠狠色丁香| 精品久热| 75大香蕉| 97超碰免费人人性爱| 伦在线97| 欧美影音在线| 青青草自拍视频在线播放| 丁香五月偷拍| 午夜精品久久久久久久男人的天堂 | 美女超碰978| 日韩成人精品| 综合av影片| 99久在线精品99re8a| 神马午夜久久久| 亚洲av总站| 麻豆福利视频导航| 热久久国产精品视频大陆精品| 麻花传媒免费网站在线观看| 另类 日韩 熟女| 99国产精品| 久久精品国产亚洲5555| 中国操逼无码| 18精品一区| 日本人体九九九九九九| 情色五月天久久久| 色悠久久久av| 国产精品久久久 | 97亚洲国产| 欧美性少妇| 天天操天天舔| 午夜操逼不卡| 国产精品无码成人精品| 岛国片在线播放| 天堂俺去俺来也www久久婷婷| 亚洲中文字幕熟女| 国产69精品久久久久99尤物| 国产精品人妻熟女aⅴ| 中文字幕交换人妻| 综合五月天| 蜜臀久久99精品久久综合| 日韩97超碰中文字幕| 欧美狠狠操| 成人久久久精品| 久草看看看| 午夜精品久久久99热蜜桃的功能特点| 亚洲色91C| 国产女主播视频在线观看| 超碰97日韩| 大香蕉久久| 国内亚洲高清无码| 亚洲中文字幕av| 中文字幕 国产区| 亚州伊人色综台| 欧美美女在线高潮999| a男人的天堂| 亚洲91大片| 天天操天天舔| 亚洲精品影视老司机| 色哟哟的毛片| 99re热| 精品久久久久久久| 99婷婷一区二区| 91精品啪在线观看国产城中村| 大黄片做爱的大的| 一本一道人妻久久一区二区三区| 999久久久九| 粉嫩久久久极品| 台湾佬中文娱乐网久久久久久久久久com | 色播综合| 加勒比海成人视频网| 物业黑人 AV一区| 91丨人妻丨国产丨丝袜| 人人操人人爽人人操人人| 国产精品免费1区2区视频| 欧美亚洲韩国视频十五区| 国产AV人人夜夜澡人人爽麻豆| 青青草一区二区三区四| 人妻一二三区| 日韩成人大片一区二区| 伊人色综合超碰| 少妇色欲综合网2| 四虎午夜影院| 91老司机在线视频免费观看| 啊啊啊啊免费视频| 91人妻Pr| 欧美 日韩 国产传媒| 欧美东京热青青草| 国产激情综合五月久久| 97国产综合欧美| 370p日韩欧美亚洲精品| 国模精品一区二区三区苹果色戒| 大香蕉碰| 91观看 国产白丝| 青春草莓视频在线观看网址| 蜜乳性色无码专日粉嫩骚逼AV| 91九九| 干妹子| 人人艹亚洲| av在线人气| 亚洲欧美清纯| 久久曰曰| 今日头条成人一区二区三区四虎精品| 亚洲丨在线| 免费观看网黄| 中文字幕-区二区三区四区视频中国| 亚洲。天堂。日本在线观看| 日本午夜久久电影| 超碰97人人乐| www.狠狠干.coom| 亚洲 欧美 第一页| 九九亚洲| 九九九精品成人免费视频小说| 久久‘黄片视频| 91激情综合| 国产精品激情久久久久久久| 嗯嗯嗯嗯啊啊啊好紧好大| 天天狂操夜夜狂日| 美女尤物福利视频| 日韩免费在线观看不卡| 亚洲国产综合久久久性感熟妇| 欧美日韩亚洲国产中文永久天天看| 国产免费黄色一级大片| 欧洲免费一区二| 亚洲国产美女久久久久| 国产视频一区二区三区久久亚洲天堂| 67914在线兔费成人视频| 欧美中出1| 蜜臀99精品国产高清在线观看| 26uuu性| 欧美性天天影院| 久久精品高清AV| 亚州国产成人精品女人久久 | 日韩欧美俄罗斯A片| 99国产精品自在自在| 美女黄频a美女大全免费皮| 天天综合香 ld视频| a片久久久久久久久久久久 | 久久性爱大全| 亚洲s色图| 国产av美女被艹的乱叫| 九一综合网| 亚洲欧美国产成人综合不卡| 亚洲综合校园春色| 99色在线| 日韩高清黄片| 亚洲精品熟妇1区2区3区。| 天天爽天天干| 亚洲成aⅴ人片不卡无码| 嗯嗯啊好大| 国产成久久综合片| 狠狠爱夜夜干| 校园春色 男人天堂| 乱操乱伦AV| 亚洲综合图片在线| 丁香激情五月| 欧美亚洲尤物久久| 日韩三级av片| 久操操| 激情五月天社区| 日本一二区不卡| www.AV有限公司一区| 亚欧高清在线| 精品无码一区二区三区色欲| 丝袜色综合| 男人的天堂,欧美亚洲另类国产日韩,日本高清一区二区 | 蜜桃臀一区二区aV| 日韩午夜啪啪视频| 成人小说另类在线| 天天操福利视频综合网站| 国产av白丝| 成人aⅴ一区二区三区| 久日91在线| 五月香婷婷| 国产黄色小视频网站| 91日韩网站| 97超碰天天| 五月天婷婷成人网| 青青青在线高清视频在线一二三四区 | 女上位精品在线| 国产成人资源| 亚洲日本韩国在线| 国产 热久久久久国产精品| 国产乱青青草久久| 九九九久千久久激情蜜桃在线看 | 成人五月天色网| 亚洲欧洲另类| 国产三级中文有码在线视频| 高清国产无码av| 欧美精品 - 91爱爱| 国产99热| 久久精品国产亚洲AV高级北京| 天天影视网色欲色香| 人妻在线中出视频| 69人妻精品一区二区绯色| 亚洲蜜乳av| 亚洲一区二区中文字幕| 日韩大香蕉精品在线视频| 日韩天堂av电影在线观看| 在线国产探花| 欧美大香蕉专区网| 免费的黄片有限公司| 五月天亚洲色图| 在线播放中文字幕| 日韩欧美水蜜桃人妻| 日韩天堂av电影在线观看| 成人性爱视频在线看| 欧美欧美啪啪视频| 国产蜜臀在线| 成人久久久精品| 91久久18禁| 中文字幕一区二区三区人妻少妇在线| 亚洲AV无线| 亚洲精品国产无码高清| 伊人久久大香线蕉无码| AV中亚| 日韩人妻无码不卡网站| www.久久超碰| 亚洲另类色综合网站| 欧美中字不卡| 97视频观看| 亚欧精品久久久久久久久久久| 免费无码国产精品v片在线观看| 欧美一级二级三级| 超碰97伊人| 人人澡人人干| 久久久无码视频| 久久久久久性爱免费视频| 综合 亚洲 欧美| 大香蕉99999| 久久香蕉国产线看观看亚洲女人 | 亚洲精品男人的天堂| 丁香六月综合激情| 人妻嗯啊啊在线播放| 午夜爽爽爽在线观看永久入口姬片| 色汉综合| 久久久久久亚洲Av无码精| 欧美色www亚洲国产阿娇要播| 亚洲激情欧美色图| 丰满少妇一区二区三区免费看| 锕锕好爽 死我在线观看| 99蜜桃臀久久久欧美精品网站| 中国一级特黄大片护士| 国模无码一区二区三区在线| 国产亲戚伦亲在线| 黄色人人| 欧美自拍偷拍免费观看| 日本网色| 黄色网址在线免费观看| 91在线秘 男同| 在线人成亚洲视频免费观看| 精品国产一区二区三区香蕉欧美| 亚洲综合另类| 2018天天日天天日| 在线综合色| 久久久国产亚洲精品系列| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | yazhououmeizongya| 国产美女91| 色妇综合网| 丝袜人妻av一区二区| 大香蕉视频一二三区| 国产老太乱伦一区| 亚洲第一免费视频| 日本三级R| 激情色播| 青青草国产亚洲精品久久| 色眯眯射| 天天干夜夜鈤| 国产精品福利视频播放| 日韩不卡a级视频专区| 天天干少妇| 1区2区3区中文字幕日韩| 天天欧美色| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 九九九九88| 一个人在线看的黄色电影网站| 荡小穴在线观看| 国产亚卅97| n1038 一二三区| 色综合99999| 久久岛国| 午夜操一操| www.91逼逼.com| AV电影在线播放| 啊啊好多水| 夜夜操夜夜高潮夜夜爽国产精品区| 欧美激情久久久久| 亚洲超碰97| 亚洲乱码国产乱码精网站| 天天干天天做| 欧亚日韩综合精品国产| 四虎精品永久在线播放| 1禁看欧美黄片免费看| 亚洲色偷偷色噜噜狠狠99网| 激情五月天校园春色网| 国产在线播放成人免费| 五月天激情四射| 天天爽天天| 成人熟女区| 性色亚洲| 啪啪91| 欧美激色| 日韩免费福利在线观看| 91色女| 中韩中文字幕在线观看| 国产AV精久久| 亚洲欧美日产国产91毛片| 日本506070| 天天做天天爱天天高潮| 91久热| 在线观看高清AV| 国产av青草| 久久人| 91碰碰| 久久成人网站| 操逼不卡中文字幕| 神马影院午夜福利久久久| 夜夜爽夜夜操| 欧美亚洲日韩人妻在线观看| 91 亚欧| 国产日逼视频| 成人一区二区三区四区| 亚洲欧美国产va在线播放频| 盗摄 精品 另类 一区| 久9综合在线| 啪啪AV导航| 激情综合五月婷婷| 清纯唯美综合亚洲| 大屁股xxxxx| 欧美亚洲高清晰| 日本日逼高清| 欧美91在线+|+欧美| 91性高朝久久久久久久久| 曰韩欧美国产传媒麻豆第一区| 草久久久| 少妇人妻好深太紧了vr91| 色五月综合| 日韩在线观看AV| 国产精品探花视频| 一本大道久| 动漫爆乳3D奶水一区在线观看| 成人AV素股で擦久久| 99爱爱| 中国女人内射6XXXXX| 国精综合一二三区影视| 无码精品久久久天天影视| 色欲色香天天天综合网www-亚洲综合国| 暴力av在线| 99视频内射三四| 日本熟妇人妻一区二区三区| 操狠狠| 啊啊啊啊,啊啊好多水| 亚洲欧洲日韩国产自在线| 久久激情四射婷婷丁香五月天| 青青青国产手线观看视频2| 国产久久久9999| 国产精品不卡av免费在线观看| 自偷自拍的亚洲视频| 欧美,日韩,中文,另类| 97最新在线播放视频| 夜夜高潮夜夜爽| 亚洲图片激情综合另类| 91色堂| 蜜乳AV色欲AVAV无码| 欧美一区二区| 欧美色偷拍| 日本人妻伦在线中文字幕| 日韩AV一起草| 青青青青青手机视频| 久久超碰久| 国产强奸乱伦第1页| 久都青青视频| 2019精品国产无码成人| 欧美第一页| 天天插天天插| 九九精品99| 日韩大香蕉精品在线视频| 综合色色婷婷| 国产极品粉嫩馒头一线天av| 久久人妻无码毛片A片麻豆| 啪啪视频亚洲第一| 东京热av影院| 日韩二三区| 国产精品一区二区三区,亚洲综合 性开放中文AV高清无码免费看 | 约操熟妇| 91色欧美| 久久草视频污视频| 日韩一级二级| av中亚| 精彩久久中文| 视频黄色国产一级| 夜夜肏2021| 一区二区三区无卡视频在线观看| 超碰午夜| 操逼视频免费日韩无码| 草莓精品视频在线免费观看| 亚洲宅男天堂| 黄色AV影视| 日韩八十路老熟女| 日本人妻中文字幕| 欧州色图区| 日日骚一区二区三区| 黄色不卡视频| 97在线免费观看| 久久久国产三级黄色片| 97免费视频在线| 久久黄色视频一区二区三区| 秋霞男人网| 最新日本中文字幕| 男人的天堂不卡一区二区| 婷婷色一区| 老外又粗又长一晚做五次| 久久久com| 一类无码操逼视频| 欧州一区二区三区四区| 国产精品高潮久久久无码| 欧美1区二区三区公司| www超碰| 欧美在线啊啊啊| 日韩射精| 超碰亚洲欧美日韩无| 精品二区三四区五电影| 搞中出久久| 国产午夜精品在线观看| 欧美性爱系列| 91美女国产在线| 性爱综合一区二区| 美女淫穴| 午夜男人的天堂| 91社操逼| 九九九九九九九九九九九蜜桃| 99精品综合久久久久五月天| 一区二区影院| 96久久久精品| 亚洲日本韩国在线| 国产999精品久久久| 久久久精品视频免费观看| 在线综合 亚洲 欧美中文字幕 | 激情久久av一区av二区av| 91久久精品国产| 国产一级内射高清视频| 日逼五月天| 人妻精品免费一二三区| 天天天天天超碰| 人妻性爱一区二区| 伊人少妇久久久| 婷色五月天| 精品区国产区一区二区三区| 美女91色黄18| 99久久com免费视频′| 人人干人人操人人爱| 天综合网欧美| 亚洲小说视频| 亚州色图狠狠干| 久/久精品99看9| av激情亚洲五月天| 超碰这里只有精品| 免费观看性欧美一级| 欧美色图自拍| 久久五月丁香| a一区二区三区乱码在线| 久久九九97| 999久久久久久久精| 一级片在线观看高清无码| 色综合天天爱去电影网| 一卡二卡在线播放| 天天α片| 370p日韩欧美亚洲精品| 国产亚洲99久久精品熟| 黄页av| 婷婷色在线| 人人干人人操人人爱| 一本色道久久综合精品婷婷| 99色| 天天色播| 在线看片国产精品每日更新| 97超碰人人操人人操| 国产十八禁视频| 欧美性猛交美女自慰91| 97最新在线播放视频| 日日操丁香五月天| 99re28在线观看| 欧美 综合 亚洲| 久久久久久91香蕉国产| 久操网无码在线| 色综合99999| 欧色性第一页| 精品亚州18| 国产精品天干天干综合网麻豆| 欧美 日韩 亚洲 春色| 无码一区免费在线不卡| 人人人摸人人| 少妇一区二区三区| 四虎精品永久在线播放| 91视频伊人| 日韩国产不卡在线视频| 女人被男人桶爽视频网站| 九九热AV| 超碰性爱97| 久9爱经典视频| 四虎影视国产精品| 日本欧美中文字幕| 99∨VTV| 人妻丝袜无 码视频专区| 午夜欧美J进J出白浆流出久久久| 黄色AAAAA欧美| 国产亚洲日本精品在线| 日日噜噜夜夜狠狠视频无| 99色热| av三级电影在线播放| 精品毛片av一区二区| 亚洲国产午夜真人一级片中文字幕精品黄网站 | 大干人妻| 国产九区| 亚洲高清欧美总合| 97干在线| 亚洲高清无码AAA久久久精品| 成人性爱视频在线看| 这里都是精品在线观看| 熟妇高潮精品一区二区三区下载| 91精品国久久久久久无码| 日韩欧美蜜桃精品久久中文字幕久久| 怡红院成人av| 强奸乱伦AV一天堂网| 日韩无码专区| 欧洲亚洲综合| 国产精品点击进入在线影院| 爽爽淫人网| 美女t无毒不卡不卡| 日韩有码回春沙龙第一页| 老妇女91| 久草视频分类在线| 风骚少妇视频中文字幕| 欧美 精品国产制服第一页| av资源在线播放天堂| 尤物视频网 刘玥| 思思热久久成人| 天综合中文| 色九九综合AV| 国产美女高潮视频| 欧美超碰9798| 欧美片第一页| 日韩欧美tv一区二区在线观看| 日韩视频中文字幕| 91neishe| A片大香蕉在线| 久久久久久久六六| 天天看片麻豆| 2023天天操夜夜操| 九一屌逼| 黑人美精品 A片| 久久久一区二区| 五月天伊人| 九九九九九精品视频| 吖在线不卡一区二区国产剧情| 久久青青草原免费视频| 91亚.色| 国产超碰人人操| 欧美色999| 日产123区精品免费观看| 欧美性爱视频免费一区一A| 女人高潮大叫一级毛片| 色九久| 大香蕉手机视频| 国产老女人久久毛| 蜜臀AV成人精品蜜臀| 亚洲精品人妻吞精av | 中文久久一区| 大香网站| 久草精品国产99| 日韩有码中文字幕女同性恋| 91色色综合| 亚洲,欧美,春色,另类| 欧美不卡二区| 日韩强奸av| 日韩一二三区| 97精品一区二区视频在线观看| 无码人妻丰满热妇又大又粗| 亚欧成人一级片在线播放| 加勒比海成人视频网| 五月婷婷深深爱| 欧美丰满熟妇XXXX性ppX人交| 久久久熟女一区| 日产中文字幕2020| 九九热五区| 很黄很污的免费网站| 夜夜狼人妻| 无码二级三级| 亚洲图片欧美偷拍| 91综合网在线| 狠日欧美| 91色狼| 日本不卡一二区| 中文字幕第7页| 97在线免费公开视频| q2午夜理论片夜色av| 国产视频97| 蜜屁Av| 欧美91久久久久| 久草视频分类在线| 人妻天天夜夜爽一区二区| av无线看| a级成人毛片免费视频高清| 亚洲欧洲av影音| 日本爽爽爽爽爽爽免费视频| 91宗合网| 狠狠色伊人亚洲综合网站色| 狠狠操狠狠燥| 91成人亚洲色图| 久久久久久人体| 精品国产国产AV| 欧美色爱综合| 天天色黄色影院天天操| 91色久| 日本天堂网| 一级性爱aaaa| 日本欧美一区二区三区免费| 亚洲国产综合图区中文字幕 | 日韩精品一区二区三区色欲| 丁香五月婷婷基地| 欧美激情片一区二区| 日本精品久久久久久久| 欧美亚洲今日在线| 中文字幕亚洲在线一区| 操人妻逼91| 亚洲无线观看久久| 七久久久| 9久久久久久| 久久精品日韩| 日本不卡码黄色| 国产精品乱码久久久久久久| 精品人妻一区二区三区日产乱码| 亚洲天堂资源| 久久国产熟女影院| 免费人人搞97| 伊人热综合| 91嫩草欧美| 日本淫乱女一区二区三区视频| 久久伊人东京热| 亚洲精品人妻在线| s片在线观看| 久久亚洲欧美中文字幕国语| 香一区二区三区| 人妻精品一区二区| 九九九免费视频| 免费AV播放| 9久9久| 久久久久国产精品久久久| 国产67194| 99re9| 国产蜜臀精品一区免费尤物| 大学生美女口爆| 少妇一线天久久久久久| 人人妻人人澡人人爽久久av| 大稥蕉免费视频这里只有精品| 人妻出轨一区二区三区| 亚洲欧美天堂| 亚洲黄日韩无码专区| 午夜操一操| 人妻在线臀日韩| 亚洲av综合色区图片亚洲| 1024午夜激情男人的天堂| 99ri在线视频| 欧洲特黄毛片免费看欧洲毛片| 欧美v亚洲v综合v国产v妖精| 美性中文综合网| 另类 日韩 熟女| 久热精品在线| 欧美另类自拍| 丁香色五月 97干| 97无码视频在线播放| 欧洲亚洲综合| 强奸乱伦资源| 91亚洲高清| 91超碰碰在线| 91在线|亚| 国产精品自在自拍视频| 好属操| 午夜福利区| 超碰97男女| 色婷婷综合久久久久中文一区二区| 亚洲有码视频二区| 欧美色图校园春色| 性爱欧美五月| 嗯嗯啊啊啊好舒服| 2020视频1区2区3区| 青青草啪啪网| 色色色综合| 天天干,夜夜爽| 97香蕉碰碰人妻国产欧美| 综合欧美日韩在线观看| 久久天堂网| 日本亚洲vr欧美不卡高清专区| 日本中文熟女视频| 九热中文字幕| 久久久久久久| 91人人| 国产精品内射婷婷一级二| 久草尤物| 色五天伊人| 入口操逼网站| 99久久99久久综合| 99热精品在线| 丁香五月激情综合| 大香蕉在线视频15| 蜜桃视频一区二区三区在线观看| 欧美人妻一区| 免费a级毛片av无码久久精品中文字幕| 91在线色| 久久亚洲AV无码专区国产精品| 亚洲熟妇白浆无码AV| 91网站在线播放| 欧美爱国产综合、| julia国产在线 | 欧美亚男人的天堂| 亚洲欧洲综合视频在线| 久久精品 六十路 熟女 欧美| 老熟妇一区二区三区| 97AV在线免费观看| 亚洲黄色网址| 91撸色网 玖玖网 欧美| 第二页中文字幕| 啊啊啊啊好大好硬啊啊啊啊啊 | 天天综合,91入口| 欧美双插| 3d成人精品一区二区| 在线看免费无码AV天堂的| 国产激情久久久| 18一区二区三区| 嗯嗯啊啊好疼| 亚洲精品91| 日本成熟少妇A∨网站| 精品人妻av在线播放| www.久久爱| av亚洲天堂资源网站| 午夜精品久久久久久久99热影院| 丁香六月婷婷综合| 日本不卡二三区| 天天综和| 色婷婷九月天天综合| 偷拍亚洲高清图片| 亚洲天天精品| 亚洲精品乱码线路中文字幕| 欧美精品999| 人妻另类 专区 欧美 制服| 亚洲国产成人精品久久久国产成人一区二区三.| 欧美性爱另类综合| av天堂5| 国产成人主播| 国产日韩欧美中文在线播放| 97在线精品观看视频| 伊人久久蜜月| 日本人妻一区二区| 欧美肥臀在线| 欧美性爱伊人| 久草加勒比一区在线| 91久久99久久91熟女精品| 大胆91| 人人妻人人澡人人爽人人精品浪潮| 欧美综合传媒| 激情一区二区| av在线免费一区二区| 在线 制服丝袜中出 人妻| 91综合熟女| 大香蕉伊人网WWWn0n| 九久久精品| 99操| 国产精品网址| 91狠婷| 无码人妻精品一区二区三区99不卡| 人妻少妇av在线观看| 搡老女人老91二区| 老熟女熟妇| 亚洲欧洲日韩国产自在线| 91真人天天在线| 午夜高清成人在线视频| 亚洲欧美日韩有码| 激情综合网五月婷婷| 在线日韩精品一区二区三区| 久久久久国产| 极品色社| 上特色A在线| 99999这里都精品| 91亚·色| 精品人妻久久久久一区二区三区| 一区不卡在线观看av| 5252色欧美在线男人的天堂| 亚洲色诱惑| 啊啊啊水好多| 天天看人人操屄犊摸阴| 高清国产av无码| 91中出视频| 熟女丝袜视频| 97 色综合| 精品国产99999| 亚州 综合 色图| 青青久操| 一区二区三区四区姦女| 污到发麻的视频 国产| 日韩成人网址| 国产18精品亚洲精品| 日韩人妻播放| 26uuu国产免费观看| 亚洲 欧美 日韩另类 麻豆| 中文字幕 一区二区 亚洲无码| 精品人妻一区二区蜜桃视频 | 性色高清在线| 91精品国产麻豆国产自产在| 国产精品视频一区二区三区八戒| 9精品久久久久| 欧美三级免费伊人| 91丝袜美腿网站| 性爱精品一区| 精品一区二区亚洲国产| 婷婷色播婷婷| 91久久久久免| 夜夜久久| 密臀国产在线| 亚洲色91| 丁香五月天啪啪| 久久久国产亚洲精品系列| 清纯唯美亚洲综合| 日韩av免费一级电影| 国语国产操逼伊人AV网| 久久久久亚洲Av无码专区老牛影视| 白丝在线一区| 91亚洲人| 操熟女91| 亚洲,日韩,欧美,成人播放| 亚洲天堂人妻熟妇视频| 亚洲色综合| 中国一区二区亚洲人妻| 国产精品久久天天干| 啊好爽快点-国产一区二区三区撒尿在线-成人AV | 超碰1997| 欧美 亚洲 第一页 | AV99热18这里只有精品| 日本护士高潮| 亚洲熟妇乱女区二区三区| 亚州精品丝袜-不卡成人免费| 99免费视频| 九九九九九九视频| 91亚洲综合| 国产日韩欧美三级片| 日韩精品黄片免费观看| 中文字幕视频在线观看一区二区| AV女优男人的天堂| 九九碰九九爱97超| 欧美v亚洲v日韩v最新在线二区| 岛国视频免费在线观看| 婷婷色五月激情| 国产精品一区二区麻豆| 亚洲综人网| 在线色导航| 久久免费看高潮毛片韩国| 日本在线15p| 久久久久久久国产a∨| 九九热精品免费视频| 狠狠2050在线观看| 成人性爱视频在线看| 97超碰色屌| 午夜国产乱伦视频| 色五月综合网| 中文字幕88av在线| 日韩免费福利在线观看| 日韩无码黄色片| 国产精品久久久久久久久久久久久久久 | 免费综合亚洲中文| 十八禁黄色成人网站观看| 综合av社区| 精吧天堂| 屌逼传媒| 久久久新亚洲AV| 日日黄色三级网站| 97操碰| 色九区| 蜜臀一区二区三区在线| 久久中文色图| 成人免费福利网站国产| 亚洲风情综合网| 久操高青| 福利在线观看一区二区| 久热这里只有精品9| 99爱久久视频频| 久久精品—区二区三区内射| 色狠人在线99| 国产精品秘 福利姬在线观看| 亚洲爱爱视频一区二区| 亚洲中文字幕网| 久久久久国色αv免费观看| 91美女在线视频| 久久女婷| 欧美不卡二区| 国产精品久久久777| 99无码视频| 操逼视频国产无套| 97在线视频免费看| 极品色电影院| 情色五月天久久久| 韩日精品四区| 国产精品麻豆成人AV艾秋| 日本91白丝| 国产麻豆福利av在线播放| 久操操| 中文字幕一区二区三区四五区| 国产一区在线观看无码AV| 99精品综合久久久久五月天| 无遮挡h肉动漫在线观看| 亚洲人妻av| 欧美另类丝袜熟女| 99r九九| 高清无码国产亚洲| HEYZO高无码国产精品227| 97硬碰| 国产福利av精彩对白| 中文字幕一区二区三区四五区| 国产高清自拍| 国产成人五月天丁香花| 99热精品青草在线| 欧美激情视频一区二区三区不卡| 特级特黄一级毛片免费| 丝袜色综合| 亚洲天堂少妇| 亚洲AV乱码专区国产噜噜亚洲| 成年人黄色视频免费| 天天碰操中国年青熟妇| av午夜玫瑰| 青青草乱入乱欲视频在线观看| 欧美一区二区三区日韩| 亚洲丁香花色| 男人的天堂2010| 97色色色| 中文字幕天天天天天| 中文字幕综合人妻| 夜夜骑操视频| 人妻第一页| 伊人专区一区二区三区| 久久精品国产AV一区二区三区| 最新AV在线| 国产精品懂色tv影视免费观看| 日韩欧美三级| 午夜人人操| 日本肏逼视频在线观看| 久久久久久久久久久久久久久性生活视频| 在线观看色视频| www鬼畜国产男人的天堂| 中文字幕综合人妻| 日韩在线国产字幕| 中文字幕亚韩| 超碰人人干| 91久久精品国产| 91精品久久久久久久久久| 国产97视频| 岛国免费黄色网址| 中文伊人大香蕉视频| 蜜桃狠狠色伊人亚洲综合| 天天干夜夜鈤| 九月丁香综合网| 亚洲不卡av在线| 丝袜足交视频| 91人妻Pr| 日本有码久久| 精品人人| 一二三四区电影| 伊人久操| 熟妇国产免费一区| 乱伦熟女论坛| 日本三级久| 亚洲Av无码成人精品国产| 天天爱天天韩国日本牛牛牛牛 | a片亚洲一本通视频| 超碰免费人妻人人| 婷婷五月天AV| 老熟乱一区二区三区四区| 天天日日夜夜| 国产精品久久久亚洲第一牛牛_在线观看| 久jiu久神马影院| 亚州综合图片| 综合网亚洲在线| 91GD.COM| 密臀在线免费观看| 欧美亚洲清纯| 激情四射五月天| 一起草三级AV电影在线观看 | 欧美色视频在线| 无码九九| 激情综合亚洲| 天天躁日日躁狠狠躁| 精彩国产视频播放1区2区| 久久伊人亚洲AV无码网站| 亚洲男人的天堂网| 国产精品久久伊人| 国产91 丝袜在线播放 | 黄色操人| 国产青青综合伊人| 91欧美高清| 免费av在线播放二区| 亚洲日韩狠狠撸视频| 日韩美一区| 综合免费无码中文| 国产久久天堂资源| 中文字幕一区二区韩| 蜜臀色乳| 亚洲欧洲综合视频在线| 人人模人人看| 成人九九| 精品九九九九九九九九九| 欧美情色贴图| 大奶啊啊好爽 | 一区二区三区探花在线观看| juliaann丝袜| 亚洲国产精品久久久久婷婷老年| 国产一区免费午夜视频| 亚洲精品91| 玖玖超碰熟| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 高潮9999外国| 亚洲欧洲第二视频在线观看色图| 国产欧美在线观看免费观看| 99视频在线| 白嫩国模丰满一二三区| 久久黄片国产一区二区| 亚洲国产熟妇综合色专区| 青青草依人大香蕉| 超碰综合97在线| 强奸少妇AV导航网| 久久久一级| 欧美色性爱| 国产热RE99久久6国产精品首| 粉嫩av平台| 久久精品国产亚洲av水密被窝| 天天日天天插| 狠狠色噜噜狠狠狠狠2018| 亚洲网站一区二区在线| 三上悠亚在线毛片91| 亚洲av无码国产精品字幕| 999久久芭蕾|