亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

Vue 3 中后臺表格組件封裝實戰(zhàn):從 loading 到分頁的完整設計

Vue 3 中后臺表格組件封裝實戰(zhàn):從 loading 到分頁的完整設計 管理后臺開發(fā)中表格組件封裝是繞不開的一步。一個中后臺項目里列表頁少說十幾個多則幾十個如果不做封裝每個頁面都要重復寫 loading 狀態(tài)、分頁邏輯、空數(shù)據(jù)判斷、操作列按鈕和批量選擇。頁面代碼一多維護成本直接翻倍。這篇文章講的不是 Element Plus 基礎用法而是把表格組件封裝成團隊內(nèi)部可復用業(yè)務組件的完整思路包括 props / slots / events / expose 四層設計、搜索表單聯(lián)動、批量操作、動態(tài)列、性能優(yōu)化和常見坑位排查。示例代碼基于 Vue 3 Element Plus Vite核心思路同樣可以遷移到 React Ant Design。1. 核心能力速覽封裝表格組件不是做一個萬能組件而是把列表頁里反復出現(xiàn)的邏輯抽成公共能力。先看一張能力速覽表能力項說明封裝目標統(tǒng)一數(shù)據(jù)請求、loading、分頁、空狀態(tài)、多選、操作列、插槽擴展技術(shù)方案Vue 3 Element Plus封裝 BaseTable 組件核心收益單個列表頁業(yè)務代碼從 300 行降到 100 行左右團隊風格統(tǒng)一主要功能自動請求數(shù)據(jù)、分頁聯(lián)動、列配置驅(qū)動、工具欄插槽、批量選擇、動態(tài)列擴展方式props 控制行為具名插槽擴展單元格expose 暴露刷新方法適用框架Vue 2 / Vue 3 均可遷移React 項目可用 useTable Hook 實現(xiàn)類似效果后端約定統(tǒng)一返回 { list, total }字段解析可在組件內(nèi)做一層兼容文章下面會按這套設計一步步給出代碼讀者可以直接復制到項目里跑通再根據(jù)后端返回結(jié)構(gòu)調(diào)整字段解析邏輯。2. 適用場景與封裝邊界表格組件封裝最適合管理后臺的 CRUD 列表頁、查詢統(tǒng)計頁和數(shù)據(jù)導出頁。這些頁面有共同特征一個查詢表單、一張表格、一個分頁器、若干操作按鈕數(shù)據(jù)從接口拉取展示結(jié)構(gòu)高度相似。不適合封裝成通用組件的場景也要明確復雜透視表、Excel 級在線編輯、樹形大數(shù)據(jù)表格、需要大量自定義表頭的報表。這些場景更適合直接用 Element Plus 或 Ant Design 的原生表格或者上專業(yè)表格庫硬套一層封裝只會增加理解成本。封裝邊界要守住三條原則業(yè)務邏輯不能寫死在組件里。狀態(tài)標簽、操作按鈕、導出邏輯都應該通過插槽或事件交給父組件處理。組件不感知具體后端字段。返回結(jié)構(gòu)解析要做兼容但表格列配置必須由父組件傳入。不要做萬能組件。props 數(shù)量控制在合理范圍超過二十個就要考慮是不是拆得太粗了。過度封裝的典型表現(xiàn)是組件內(nèi)部塞了搜索表單、權(quán)限判斷、導入導出、字典翻譯頁面只要稍微不一樣就會寫一堆 if else。封裝表格組件的正確姿勢是表格只負責表格的事其他能力用插槽和事件擴展。3. 環(huán)境準備與目錄結(jié)構(gòu)本文示例基于 Vue 3 Element Plus先創(chuàng)建一個標準項目npm create vitelatest table-demo -- --template vue cd table-demo npm install element-plus如果使用 TypeScript再加類型依賴npm install -D types/node目錄結(jié)構(gòu)建議按組件庫的方式組織不要把所有代碼堆在 App.vue 里src/ ├── components/ │ └── BaseTable/ │ ├── index.vue # 表格組件主入口 │ ├── types.ts # Props / 列配置類型定義 │ └── README.md # 組件使用文檔 ├── pages/ │ └── user/ │ ├── index.vue # 用戶列表頁 │ ├── columns.ts # 列配置獨立文件 │ └── api.ts # 接口請求函數(shù) └── api/ └── request.ts # axios 實例封裝列配置獨立成文件是很容易被忽略的好習慣。列表頁的列會頻繁調(diào)整單獨放一個 columns.ts改列寬、加字段、調(diào)順序都更直觀也方便后續(xù)做動態(tài)列配置。接口請求函數(shù)單獨放在 api.ts方便復用和 mock。BaseTable 只接收一個 api 函數(shù)不關心請求是 axios 還是 fetch 實現(xiàn)的。4. 封裝思路props / slots / events / expose 四層設計表格組件封裝的核心是設計好對外接口。我把 BaseTable 的對外能力分成四層4.1 props控制行為和外觀props 負責告訴組件你要展示什么、怎么請求、是否支持分頁和多選。核心 props 包括props 名稱類型默認值說明columnsArray必填列配置數(shù)組apiFunction必填獲取數(shù)據(jù)的接口函數(shù)queryParamsObject{}查詢參數(shù)變化時觸發(fā)刷新showPaginationBooleantrue是否顯示分頁器showSelectionBooleanfalse是否顯示多選列rowKeyStringid行的唯一 key多選翻頁記憶必需pageSizesArray[10,20,50,100]每頁條數(shù)選項paginationLayoutStringtotal, sizes, prev, pager, next, jumper分頁布局4.2 slots擴展單元格和工具欄插槽解決組件顯示不了所有業(yè)務場景的問題。BaseTable 需要提供兩類插槽具名單元格插槽名字和列配置里的 slot 字段對應父組件可以用#status、#action這樣的方式自由定制單元格內(nèi)容。toolbar 插槽放在表格上方用于放新增、批量刪除、導出等按鈕同時把當前選中行透傳給父組件。4.3 events通知父組件業(yè)務事件父組件需要知道表格內(nèi)部發(fā)生了什么events 負責對外通知。常用事件包括selection-change多選變化時觸發(fā)傳入選中的行數(shù)組row-click行點擊事件load-success數(shù)據(jù)加載成功load-error數(shù)據(jù)加載失敗4.4 expose暴露刷新方法表格組件內(nèi)部維護了 page、pageSize、tableData 等狀態(tài)父組件不能直接改但需要觸發(fā)刷新。通過 defineExpose 暴露 refresh 和 reload 方法父組件調(diào)用tableRef.value.refresh()就能重置到第一頁并重新請求。這四個層次想清楚封裝就完成了一半。下面直接進入代碼實現(xiàn)。5. 基礎表格組件完整代碼實現(xiàn)BaseTable 組件分為模板和腳本兩部分。模板負責渲染表格、插槽和分頁器腳本負責數(shù)據(jù)請求、分頁控制和事件轉(zhuǎn)發(fā)。5.1 模板部分template div classbase-table div v-if$slots.toolbar classbase-table__toolbar slot nametoolbar :selected-rowsselectedRows/slot /div el-table v-loadingloading :datatableData :row-keyrowKey :borderborder :stripestripe :heightheight :max-heightmaxHeight selection-changehandleSelectionChange row-clickhandleRowClick el-table-column v-ifshowSelection typeselection width50 :reserve-selectiontrue / template v-forcol in columns :keycol.prop || col.label el-table-column :propcol.prop :labelcol.label :widthcol.width :min-widthcol.minWidth :fixedcol.fixed :sortablecol.sortable :aligncol.align || left :show-overflow-tooltipcol.ellipsis ! false template #defaultscope slot :namecol.slot || col.prop :rowscope.row :indexscope.$index :valuescope.row[col.prop] span{{ scope.row[col.prop] }}/span /slot /template /el-table-column /template slot nameappend-column/slot /el-table div v-ifshowPagination classbase-table__pagination el-pagination :current-pagepageInfo.page :page-sizepageInfo.pageSize :totalpageInfo.total :page-sizespageSizes :layoutpaginationLayout background current-changehandlePageChange size-changehandleSizeChange / /div /div /template這里有幾個細節(jié)需要說明。第一col.slot || col.prop作為插槽名的設計。如果列配置里寫了slot: status父組件用#status定制如果沒寫默認用 prop 作為插槽名父組件依然可以通過#name覆蓋默認展示這個約定很實用。第二show-overflow-tooltip用col.ellipsis ! false控制。遇到長文本時默認開啟省略提示但某些列比如操作列并不需要在列配置里傳ellipsis: false關閉即可。第三append-column插槽用于追加操作列等場景。列配置里寫 action 列也行但操作列往往要放在最后并且要做 fixedright單獨用插槽更靈活。5.2 腳本部分script setup import { ref, watch, onMounted } from vue const props defineProps({ columns: { type: Array, required: true }, api: { type: Function, required: true }, queryParams: { type: Object, default: () ({}) }, showPagination: { type: Boolean, default: true }, showSelection: { type: Boolean, default: false }, pageSizes: { type: Array, default: () [10, 20, 50, 100] }, defaultPageSize: { type: Number, default: 10 }, rowKey: { type: String, default: id }, border: { type: Boolean, default: false }, stripe: { type: Boolean, default: false }, height: { type: [String, Number], default: null }, maxHeight: { type: [String, Number], default: null }, paginationLayout: { type: String, default: total, sizes, prev, pager, next, jumper }, immediate: { type: Boolean, default: true } }) const emit defineEmits([selection-change, row-click, load-success, load-error]) const loading ref(false) const tableData ref([]) const selectedRows ref([]) const pageInfo ref({ page: 1, pageSize: props.defaultPageSize, total: 0 }) const fetchData async () { loading.value true try { const params { page: pageInfo.value.page, pageSize: pageInfo.value.pageSize, ...props.queryParams } const res await props.api(params) const list res.list || res.records || res.rows || res.data || [] tableData.value Array.isArray(list) ? list : [] pageInfo.value.total res.total ?? tableData.value.length emit(load-success, res) } catch (error) { emit(load-error, error) } finally { loading.value false } } const handlePageChange (page) { pageInfo.value.page page fetchData() } const handleSizeChange (size) { pageInfo.value.pageSize size pageInfo.value.page 1 fetchData() } const handleSelectionChange (rows) { selectedRows.value rows emit(selection-change, rows) } const handleRowClick (row, column, event) { emit(row-click, row, column, event) } const refresh () { pageInfo.value.page 1 fetchData() } const reload () { fetchData() } onMounted(() { if (props.immediate) { fetchData() } }) watch( () props.queryParams, () { refresh() }, { deep: true } ) defineExpose({ refresh, reload, getSelectedRows: () selectedRows.value, getTableData: () tableData.value }) /script腳本部分有幾個工程問題需要在代碼里提前處理掉避免線上踩坑。返回數(shù)據(jù)解析這里做了一層兼容res.list || res.records || res.rows || res.data。不同后端團隊返回字段不一樣有返回 records 的、有返回 rows 的組件內(nèi)部做兼容能減少接新項目時的改動量。但這里要謹慎處理 total后端返回 total 時用 total沒有 total 時用當前數(shù)組長度兜底這只能保證組件不報錯真實總數(shù)還是要以接口為準。watch queryParams 用了 deep 監(jiān)聽。這意味著父組件修改 queryParams 的某個字段會自動觸發(fā)刷新不用手動調(diào)用 refresh。這個能力好用但有個大坑如果父組件在搜索回調(diào)里同時修改 queryParams 又手動調(diào)用了 refresh就會觸發(fā)兩次請求。后面搜索表單聯(lián)動部分我會詳細說這個問題的解法。expose 出來的 refresh 是重置到第一頁再請求reload 是保持當前頁重新請求。這兩個方法語義不同比如刪除當前頁最后一條數(shù)據(jù)后應該先判斷當前頁是否只剩這一條是則頁碼減一再刷新否則直接 reload。這個邏輯寫在業(yè)務頁面里更合理所以組件只提供原始能力。6. 搜索表單與表格聯(lián)動列表頁幾乎都有搜索功能。搜索表單和 BaseTable 的聯(lián)動方式有兩種先看推薦方案。6.1 推薦方案queryParams 驅(qū)動父組件維護一個響應式 searchParams通過 queryParams 傳給 BaseTable組件內(nèi)部 deep watch 到變化后自動刷新。template div div classsearch-bar el-input v-modelsearchParams.keyword placeholder請輸入用戶名 clearable / el-select v-modelsearchParams.status placeholder狀態(tài) clearable el-option label啟用 :value1 / el-option label停用 :value0 / /el-select el-button typeprimary clickhandleSearch查詢/el-button el-button clickhandleReset重置/el-button /div base-table reftableRef :columnscolumns :apifetchUserList :query-paramssearchParams show-selection template #status{ row } el-tag :typerow.status 1 ? success : info {{ row.status 1 ? 啟用 : 停用 }} /el-tag /template template #action{ row } el-button link typeprimary clickhandleEdit(row)編輯/el-button el-button link typedanger clickhandleDelete(row)刪除/el-button /template /base-table /div /template腳本部分script setup import { ref } from vue const tableRef ref() const searchParams ref({}) const handleSearch () { // 不在這里手動調(diào)用 tableRef.value.refresh() // BaseTable 內(nèi)部已經(jīng) watch 到 queryParams 變化會自動刷新 tableRef.value.refresh() } const handleReset () { searchParams.value {} } /script上面這個示例其實暴露了那個坑handleSearch 里既修改了 searchParams 又會觸發(fā) watch頁面里如果再調(diào) refresh 就是雙重請求。寫代碼時必須二選一。我的建議是如果 BaseTable 內(nèi)部已經(jīng)做了 deep watch業(yè)務頁面就不要再調(diào) refresh只負責修改 searchParams。但 deep watch 也有性能開銷如果 searchParams 對象特別大每次修改都會觸發(fā)深度遍歷。更可控的做法是在組件里去掉 deep watch完全由父組件手動控制刷新時機script setup // BaseTable 內(nèi)部不再 watch queryParams // 父組件搜索時手動調(diào)用 refresh const handleSearch () { searchParams.value { ...formData } tableRef.value.refresh() } /script兩種方案各有取舍。自動刷新的優(yōu)點是父組件代碼少缺點是雙請求的坑需要團隊約定手動刷新的優(yōu)點是行為顯式、可控缺點是容易忘記調(diào)用。實際項目里我更推薦手動刷新因為請求時機這件事越明確越不容易出錯。如果團隊約定用自動刷新那就在組件 README 里明確寫清楚修改 queryParams 會自動請求禁止再手動調(diào)用 refresh。6.2 搜索表單組件化搜索表單本身也值得做輕量封裝但不要和 BaseTable 耦合太深。搜索表單的字段、校驗規(guī)則、布局差異很大強行塞進表格組件只會讓組件變得臃腫。建議搜索表單單獨維護和 BaseTable 通過 queryParams 通信。表單重置時要注意時間范圍字段。如果用了 el-date-picker 的 daterange提交時要轉(zhuǎn)換成startDate和endDate兩個字段轉(zhuǎn)換邏輯可以放在單獨的工具函數(shù)里const formatSearchParams (form) { const { dateRange, ...rest } form if (dateRange dateRange.length 2) { return { ...rest, startDate: dateRange[0], endDate: dateRange[1] } } return rest }這個函數(shù)建議放在業(yè)務頁面目錄里屬于業(yè)務邏輯不該進公共組件。7. 批量操作與工具欄擴展管理后臺的列表頁離不開批量操作。BaseTable 通過 showSelection 開啟多選列通過 toolbar 插槽把選中行傳給父組件。7.1 批量刪除示例template base-table reftableRef :columnscolumns :apifetchUserList show-selection row-keyid template #toolbar{ selectedRows } el-button typedanger plain :disabledselectedRows.length 0 clickhandleBatchDelete(selectedRows) 批量刪除 /el-button el-button typeprimary clickhandleAdd新增用戶/el-button /template /base-table /template script setup import { ElMessage, ElMessageBox } from element-plus import { fetchUserList, batchDeleteUser } from ./api const tableRef ref() const handleBatchDelete async (rows) { const ids rows.map((row) row.id) await ElMessageBox.confirm(確認刪除選中的 ${ids.length} 條數(shù)據(jù), 提示, { type: warning }) await batchDeleteUser(ids) ElMessage.success(刪除成功) tableRef.value.refresh() } /script這個例子里 row-key 是必須的。多選列開啟后如果不設置 row-key翻頁時選中狀態(tài)會丟失。Element Plus 的多選記憶依賴 row-key同時 el-table-column 要加上reserve-selectiontrue這個屬性在 BaseTable 模板里已經(jīng)寫好了。批量操作要注意的細節(jié)是權(quán)限控制。toolbar 插槽里可以包一層權(quán)限判斷組件比如 v-permission 指令沒有權(quán)限就不渲染按鈕。不要把權(quán)限邏輯寫進 BaseTable那是業(yè)務層的職責。7.2 動態(tài)列配置動態(tài)列的意思是列配置可以根據(jù)角色、頁面狀態(tài)、用戶設置動態(tài)生成。列配置通常是從接口拿到的也可能是前端根據(jù)權(quán)限計算的。script setup import { computed } from vue const props defineProps({ showScore: { type: Boolean, default: false }, role: { type: String, default: admin } }) const columns computed(() { const cols [ { prop: name, label: 用戶名, minWidth: 140 }, { prop: email, label: 郵箱, minWidth: 180, ellipsis: true } ] if (props.showScore) { cols.push({ prop: score, label: 積分, width: 100, align: center }) } if (props.role admin) { cols.push({ prop: department, label: 部門, width: 120 }) } return cols }) const actionColumn { prop: action, label: 操作, width: 160, fixed: right, slot: action } /script注意操作列的處理。操作列不依賴接口數(shù)據(jù)直接放在 columns 里配置使用 action 插槽即可BaseTable 的插槽機制會把它渲染出來。操作列建議固定在最右側(cè)用fixed: right列寬按按鈕數(shù)量和文案長度估算一般在 140 到 200 之間。動態(tài)列有一個需要協(xié)調(diào)的指標列寬。數(shù)據(jù)量大的時候所有列都用固定寬度會導致小屏幕下橫向滾動條件很差全部用 min-width 又會讓表格在寬屏下拉伸得很難看。實踐上文本短且固定的列用 width文本可能很長的列用 min-width 加 show-overflow-tooltip操作列一律用固定 width。8. 性能優(yōu)化與渲染注意事項表格是列表頁性能消耗的重災區(qū)封裝組件的時候就要把性能問題考慮進去。8.1 優(yōu)先使用服務端分頁中后臺列表頁的數(shù)據(jù)量通常較大一次性把幾千條數(shù)據(jù)拉到前端不僅慢而且 DOM 渲染會很卡。默認就應該走服務端分頁也就是 BaseTable 每次請求都帶 page 和 pageSize。前端分頁只適合數(shù)據(jù)量小、接口一次性返回全部數(shù)據(jù)的場景。服務端分頁的另一個好處是排序也可以交給后端。列配置里sortable: custom開啟服務端排序監(jiān)聽 el-table 的 sort-change 事件把排序字段和排序方式拼進請求參數(shù)即可。BaseTable 目前沒有內(nèi)置 sort-change屬于可以擴展的方向有需要的團隊可以在組件里加一個 sortable 參數(shù)把排序信息通過sort-change透傳出來由父組件決定如何拼接參數(shù)。8.2 控制單元格渲染成本表格中每一個單元格都是一個組件實例列多、數(shù)據(jù)多的時候渲染成本會成倍上升。以下幾條優(yōu)化手段按性價比排序減少不必要的插槽。能用默認渲染就不要寫插槽每個插槽都會多一層 vnode 解析。避免整列使用復雜組件。比如狀態(tài)列優(yōu)先用 el-tag 而不是自定義組件。列寬優(yōu)先用 min-width減少橫向滾動時的重排壓力。show-overflow-tooltip 會用 tooltip 包裹單元格列特別多的時候工具提示實例數(shù)量很大只在有長文本需求的列開啟。固定列fixed會額外渲染一層表格能用盡量少用一般只固定操作列。8.3 大數(shù)據(jù)量下的虛擬滾動如果業(yè)務確實需要一次性展示大量行數(shù)據(jù)比如導出預覽或者全量展示可以考慮虛擬滾動。Element Plus 的 el-table 在 2.4 版本之后對虛擬表格有實驗性支持也可以引入基于 el-table 的社區(qū)虛擬表格方案或者換成 Ant Design Vue 的虛擬表格。虛擬滾動不是銀彈它犧牲了部分能力換渲染性能。開啟虛擬滾動后行高必須是固定的表格的自動高度、列寬自適應、復雜插槽都會受到限制。判斷標準很簡單一屏數(shù)據(jù)超過幾百行再考慮虛擬滾動普通分頁列表完全不需要。8.4 避免深層監(jiān)聽帶來的性能損耗BaseTable 內(nèi)部對 queryParams 做了 deep watch。如果 queryParams 里有大型對象比如富文本內(nèi)容、大數(shù)組每次修改都會造成深度遍歷。改進思路是組件只做淺監(jiān)聽要求父組件在數(shù)據(jù)變化時傳入新的對象引用或者干脆去掉自動監(jiān)聽改為手動 refresh。我在第 6 節(jié)推薦手動刷新原因就在這性能更可控行為也更顯式。9. 常見問題與排查方法把封裝表格組件過程中的高頻問題整理成一張排查表遇到問題先查這張表。問題現(xiàn)象可能原因排查方式解決方案表格請求重復發(fā)送父組件修改 queryParams 后又手動調(diào)用 refresh在 Network 面板看請求時序二選一要么用 deep watch 自動刷新要么手動 refresh分頁后表格空白api 返回字段和組件解析字段不一致在 load-success 回調(diào)里打印 res按后端實際返回調(diào)整 list / total 解析多選翻頁后選中狀態(tài)丟失沒有設置 row-key 或未開啟 reserve-selection檢查 el-table 是否設置 row-key設置 row-key 并確認組件模板里 reserve-selection 為 true插槽內(nèi)容不渲染父組件 slot 名和子組件動態(tài) slot 名不一致檢查 DevTools 里的插槽傳遞統(tǒng)一列配置里的 slot 字段或使用默認 prop 名查詢參數(shù)變化但表格沒刷新queryParams 被 watch 了但父組件直接改對象屬性打印 watch 回調(diào)是否觸發(fā)讓父組件替換 searchParams 整體對象或開啟 deep表格高度異常height 和 max-height 同時設置且頁面布局變化檢查瀏覽器布局固定外層容器高度或用 max-height 讓表格自適應操作列按鈕點擊觸發(fā)行點擊row-click 冒泡在按鈕 click 事件里阻止冒泡給按鈕綁定 click.stop切換頁面大小后數(shù)據(jù)不刷新size-change 里只改了 pageSize 沒重新請求打斷點看 handleSizeChange確認 size-change 回調(diào)調(diào)用了 fetchData幾個重點排查項展開說一下。插槽不渲染這個問題的坑在于BaseTable 用col.slot || col.prop動態(tài)決定插槽名。如果父組件里寫了#customName但列配置里沒有對應的 slot 字段組件默認走 prop 名插槽頁面自然顯示默認 span。排查時先看列配置里的 prop 和 slot再對照父組件模板里的插槽名。多選翻頁丟失的問題除了 row-key 之外還要注意數(shù)據(jù)唯一性。row-key 對應的字段必須是每條記錄的唯一值如果后端返回的 id 在同一頁數(shù)據(jù)里不唯一選中記憶依然會混亂。批量刪除后列表不刷新最常見的錯誤是刪除成功后調(diào)用了 reload 而不是 refresh。當前頁刪光了數(shù)據(jù)reload 會停留在空頁面這時候應該把頁碼重置到第一頁或者做頁碼減一處理。10. 最佳實踐與團隊規(guī)范表格組件封裝做完只是第一步讓團隊統(tǒng)一使用、持續(xù)迭代才是目的。這里給幾條可落地的團隊實踐建議。10.1 統(tǒng)一接口返回結(jié)構(gòu)BaseTable 在內(nèi)部做了一層字段兼容但它只是兜底不能替代接口規(guī)范。團隊應該和后端約定統(tǒng)一的列表接口返回結(jié)構(gòu)比如{ code: 0, message: success, data: { list: [ { id: 1, name: 張三, status: 1 } ], total: 128, page: 1, pageSize: 10 } }axios 響應攔截器統(tǒng)一解包 code 和 data業(yè)務層拿到的就是 data 對象。BaseTable 內(nèi)部再按res.list和res.total解析這樣所有列表頁的解析邏輯就完全一致了。10.2 列配置獨立、注釋清晰columns.ts 是團隊最容易忽略維護的地方。列配置文件里每列都要寫清楚字段來源和展示邏輯特別是字典字段。比如 status 列的注釋要寫明1-啟用2-停用3-封禁這樣后續(xù)接手的人不用翻接口文檔。字典字段的展示建議做成全局字典翻譯組件比如 DictTag。BaseTable 不限制列配置里透傳的內(nèi)容dict 字段由業(yè)務頁面在插槽里處理保持組件純凈。10.3 用 TypeScript 泛型提升體驗如果項目使用 TypeScript建議給 BaseTable 增加泛型支持。組件接收一個泛型 T表示行數(shù)據(jù)類型這樣插槽和作用域插槽里的 row 都能獲得類型提示。復雜類型定義可以寫在 types.ts 里export interface TableColumn { prop: string label: string width?: number | string minWidth?: number | string fixed?: left | right | boolean sortable?: boolean | custom align?: left | center | right ellipsis?: boolean slot?: string } export interface PageResultT { list: T[] total: number } export type TableApiT (params: Recordstring, any) PromisePageResultT父頁面使用時的收益非常明顯base-table :columnscolumns :apifetchUserList /里的插槽#status{ row }能自動推斷 row 是用戶類型避免手寫 any。10.4 寫 demo 頁和文檔組件放在項目里幾個月后就會有人提問這個參數(shù)怎么用。與其反復口頭解釋不如在項目里建一個 component-demo 頁面把 BaseTable 的常見用法全部列出來基礎表格、查詢聯(lián)動、批量操作、動態(tài)列、插槽自定義、刷新方法調(diào)用。這個 demo 頁同時也是組件的回歸測試用例改動組件后跑一遍 demo 就能發(fā)現(xiàn)回歸問題。README 文檔不需要很長但必須寫清楚 props 表、插槽表、expose 方法表以及一個最小可運行代碼示例。10.5 不要過度設計剛開始封裝時只要滿足當前業(yè)務的 80% 需求就夠了。不需要一開始就做列拖拽、列顯隱、列寬記憶、導出一體化。這些能力可以后續(xù)通過協(xié)議擴展組件加參數(shù)是增量兼容拆掉一個設計不好的參數(shù)卻要動很多調(diào)用方。比較好的迭代節(jié)奏是第一個月只做數(shù)據(jù)請求、分頁、多選、插槽等團隊用順了再根據(jù)真實需求逐步加能力。總結(jié)與下一步表格組件封裝的本質(zhì)是把業(yè)務列表頁里重復出現(xiàn)的請求數(shù)據(jù)、分頁、loading、選擇、刷新這些橫切邏輯抽出來讓頁面只保留差異化的展示和操作。我建議先從 BaseTable 最小版本開始props 只留 columns、api、queryParams、showPagination、showSelection插槽只做 toolbar 和單元格插槽expose 暴露 refresh 和 reload。拿項目里第一個列表頁做試點跑通之后第二個頁面開始復制粘貼的成本就會降下來。最容易踩的坑有兩個一個是 queryParams 自動刷新和手動 refresh 造成雙請求另一個是返回值字段解析不一致導致列表空白。這兩點提前在 README 里寫清楚團隊就不會反復踩。下一步可以考慮把搜索表單也抽象成 SearchBar 組件和 BaseTable 組合成 SearchPage 頁面容器。但組合時務必保持低耦合搜索表單用 queryParams 和表格通信不要強行合并成一個巨型組件。前端組件封裝的長期價值在于穩(wěn)定和可預測而不是功能大而全這個原則對表格組件尤其適用。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
91色伦综合| 亚洲少妇中文字幕网址| 久草线上视频免费看| 婷色五月| 永久免费发布性爱网| 国内外激情在线| 熟妇亚洲一区二区三区| 韩国一级做A片免费的| 香蕉精品二区二区 | 91欧洲入口| 亚洲成人av色网| 天天狠操| 91精品久久久| 国内偷拍精品一区二区| 丰满人妻一区二区三区免费| 99热一区二区三区四区| 亚洲影视高清三级-草1024榴社区入口-品爱AV| 国产精品视频电影| 日韩欧美麻豆大片| 91狠婷| av天堂5| 浓厚中出中文字幕在线| 人妻另类 专区 欧美 制服| 性91| 天躁夜夜躁2021| 大香蕉色欲AV| 综合大香蕉美。| 香港成人一级视频在线青青草| 一区二区偷拍拍视频| 激情五月天社区| 国内精品嫩模A∨私拍小视频| 欧美日韩亚洲少妇寂寞影院正在播放| 婷婷久草| 中国91AV| 秋霞成人一级在线观看| 日韩黄片视频试看| 91人人臊| 99久久久久| 天天色播亚洲综合网站| 亚洲天堂久久| 五月综合视频| 亚洲欧洲无码一区夜| 秋霞男人网| 精品久久視頻在线| 超碰资源亚洲97| 草草影院在线视频| 情色av电影| 成人老鸭窝人人在线视频| 无码99| 欧美日韩色图片| 欧美成人都市人妻| 高凊专区人人操| AV天天在线观看| 97资源制服丝袜| 色色色综合网| 午夜毛片高清免费不卡| 天天热精品| 女上位精品在线| 色色九区| 国内亚洲高清无码| 不卡啪啪视频| 国产成人精品亚洲日本| 五月天激情小说网| 午夜性| 用力操死我| 欧洲精品在线播放| 亚洲中文sv| 女人天堂av在线播放| 日韩福利综合一区| 久久人妻视频| 91 亚洲情侣偷拍 久久| 草草草视频| 97综合久久| 国产隔壁老王影院在线| 成人电影一区| 屌妞视频久久久久久久| 欧美97se| 日韩中文字幕国产| 久热九九| 日本新免费二区三区| 老司机福利社视频在线观看| 东北女人无套内谢视频| 岛国视频免费在线观看| 91N五十路| 伦理日韩国产久久| 国产精品不卡高清在线观看| 中文字幕一区 二区三四五 区日 日骚| 国产夜夜操| 亚洲性综合| 精品国产乱码久久| 99色视频| 久久9精品网站| 久久av无码| 亚洲精品日韩国产欧美| 人妻一区久久二区三区色播| 大香蕉懂9| 综合久久久久久久久91| 国产成人网站在线观看| 污污污8888| 久久久久久久九九九九| 手机在线看片免费人成视频| 97少妇人妻中文字幕久久 | 国产18精品亚洲精品| 天天干天天日天天射黄色大片| 后入综合久久| 综合操逼| 欧美 日韩 另类 亚洲| 78久久| 一区三区啪啪| 亚洲精品白丝| 久久亚洲欧美中文字幕国语 | 九热中文字幕| 射 色综合| 色欲久久99精品久久| 亚洲精品一区二区精品| 4141514逼喷水三级片| 在线天堂资源亚洲| 91美女丝袜诱惑视频| 性欧美| 日韩国产乱子伦App| 日韩中文字幕熟妇人妻| 色哟哟AⅤ| 日韩草久视频| 免费a v| 尹人大香蕉视频在线| 男人天堂免费| 久草婷婷| 久久成年片色大黄全免费网站| 红杏大香蕉| 午夜精品久久久| 天无日色综合| 免费久久一级毛片大黄| 美国久久一二三四| 999亚洲国产视频| 高清肉丝中文无码| 国产三区免费在线观看| 91久久国产精品| 国产亚洲精品自在线亚洲情侣| 亚洲综人| 日本精品一区三区| 尤物国产一区在线观看| 三及片网站| 97WW精品| 岛国网址国产 | 狠狠爱夜夜干| 午夜男人一级A片7777| 天天操熟妇| 丁香九月激情| 收看日本人日bb| 欧美91在线+|+欧美| 中文字幕人成乱码熟女香港| 四季av一区二区凹凸精品小说| 99热亚洲| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 日韩欧美~中文字| 尹人大香蕉视频在线| 欧美人妻少妇| 肥臀熟女一区二区三区视频| 欧美一二三区四五区| 两女互慰AV高潮喷水在线观看| surenchaopeng| 婷婷色综合| 亚洲成人激情小说视频| 久久久久久久久女黄| 啊…啊…操我用力操我| 日本一区二区三区午夜观看| 日比av无码| 九热大香蕉| 丰满的三级少妇欧美久久久| 国产又黄又粗的视频| 国产中午字一暮区| 江都AV在线| 亚洲最大网站av| 日韩熟女无码| 熟女人妻一区二区三区| 尤物视频偷拍免费| 热久日综合| 久久99亚洲精品久久99果| 日韩在线国产字幕| 97超碰美女| 91n免费处女| 国产怡红院| 精品国产精品一区二区| 精品毛片av一区二区| 欧美日韩在线小说| 亚洲天天影视色综合| 99热这里只有精| 日本黄 R色 成 人网站| 亚洲日韩美国人妻| 日本黄色大片一级视频免费麻豆| 91视频综合网| 色香av| 亚洲男人天堂2| 亚洲国成人情色好看电影| 久久黄黄| 91碰碰碰| 激情五月天婷婷| 久久高清欧美国产| 蜜乳性色无码专日粉嫩骚逼AV| 中文字幕丰满人妻日本| 女色综合| 后入式免费视频| 亚洲图片 欧美电影| 久久精品人妻一区二区三区| 欧洲精品久久| 精品视频久久区| 99热在线不卡| 久久久久久久久久黄色网| 91大胆欧美| 97操操| 婷婷性爱| 殴美牲| 91N欧美| 防屏蔽在线视频| 五月丁香婷婷综合| 成人影 天天操 亚洲| 黑丝少妇在线观看| 91在线视频免费中出| 久久黄黄| 9999伦理视频| 中文字幕熟女人妻丝袜丝| 四虎影视永久在线观看精品免费网站 | 久久精品视| 男人的天堂无码| 青青草久久在线| 天美传媒av在线| 国产精品国产| 99精品九九九九九九| 国产精品农村妇女精品| 亚洲伊人成综合成人网| 青娱乐国产精品| 啪一啪免费视频| 国产激情综合五月久久| 欧美成人9797| 伦在线97| 97久久久久| 黑人综合网| 久久精品欧美一区二区三区不卡| 永久免费发布性爱网| 国产黄色av大片网站| 亚洲国产日韩欧美熟妇在线| 九九精品美女高溯喷水| 激情文学小说一区二区| 九九九色| 在线啊v一区| 91neishe| 色色青青久久| 日韩av性爱在线播放| 国产探花精品在线| 美女尤物福利视频| 校园春色综合香蕉| 中文乱码字字幕在线第5页| 亚洲成aⅴ人片不卡无码| 欧美日韩激情无码专区| 精品夜夜澡人妻无码| 日韩中文字幕av在线播放| 97精品97久久| 久操免费在线| 国产av美女被艹的乱叫| 有码色中文字幕在线观看| 青青草久草AV| 秋霞网无码| 国产 v乱码一区二| 久久综合超碰| 婷婷在线视频在线观看| 亚洲成人网站在线观看| 97bbn| 亚洲在线网站| 亚洲色五月| 亚洲AV色图一区| 亚洲欧美另类激情小说| 六月激情婷婷| 在线五区| 日韩一区二区高清在线观看的| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 搡老熟女国产1000部| 百度百度日本操逼| 日韩三级网址| 免费视频一二三区| 日本三级韩三级99久久| 久久99久久99精品天美传媒棢·纸:. | 国产精选视频| 99久久久久| 嗯嗯啊啊的视频| 国产日韩区| 免费农村成人少妇人妻Aa一区二区视频| 欧美日韩系列| 国产精品免费视频人成| 日韩精品大香蕉伊人在线| 91伊人久| 超碰天天操你比| 84YTCOM性无码| 99久久无色码| 又大又大又大又粗爽高潮观看| 日本综合久久| 色婷婷国产精品一区在线观看| 激情专区综合| 青青草在线视频播放器| 中文啪啪视频| a'v在线资源| 亚洲精品一区二区三区新线路| 欧美啪啪色吧在线| 天天色香欲综合网| 操逼网站网站| 婷婷激情一区二区三区俺也去| 国产精品第一页国产大屁股视频免费区| 自拍偷拍2025在线观看| 色原狠狠天天天| 国产成人精品亚洲日本| 九九热三级片| 宅男午夜在线视频| 日韩免费三级黄片电影| 9久精品视频在线观看| 人人摸.人人色| 9久精品视频在线观看| 凹凸久久人人| 久热最新在线杭州| 91天美传媒精品| 亚洲精美粉嫩嫩泬在线观看| 欧美高清在线| 天天日天天插| 日韩精品一区二区高清| 欧美一品道| 日本欧美国内在线| 一区操逼| 欧美亚洲在线| 日韩AV色图| 91足交| 久久久555| 99re6国产精品99re在线| 中文字幕精品一区二| 日韩欧美资源| 天堂岛av| 日操粉逼逼| 男人的天堂99| 吉川爱美亚洲二区在线 | 日韩图区| 国产av尤物| 92性色国产午夜福利在线661| 欧美色图91p| 996热| 国产美女在线精品免费看| 中出789在线视频| 日韩成人性爱AV| 欧美综合中文| 亚洲成人妻日韩在线| 探花激情视频| 91丨九色丨国产丨人妻在线| 97视频免费在线| 嗯阿好爽好紧| 久久五月天婷婷| TS人妖另类精品视频系列| 蜜桃视频一区二区三区| 大奶啊啊好爽| 无码精品一区二区三区潘金莲| 日韩精品 欧美激情| 亚洲男人天堂网久久| 熟妇乱伦一区二区| 中文字幕人妻丝袜乱一区三区| 久久久亚洲精品电影免费看| 色伊人91| 午夜男女爽爽爽影院视频| 91大香蕉伊人| 亚洲欧洲无码一区夜| 女人的久久久| 亚洲天堂99| 亚洲成人美女无吗| 久久伊人亚洲AV无码网站| 日韩精品亚洲一二三| 人人澡人人弄| 色性荡荡荡荡视频| 亚洲综合五月天| av在线一区二区三区| av影片在线观看不卡| 精品一区二区久久| 99国产精品免费| 欧美性爱97超碰| 日本午夜福利影院| 色色色色电影网| 国产极品99热在线播放69| 蜜臀久久99精品久久久久| 久久国产精品视频| 国产精品粉嫩福利在线| 国产AV线| 久久久久国产精品人妻aⅴ天堂| 天天干一区二区| 少妇超碰在线| 无码99| 一二三区在线| 亚洲AV成人无码一区二区三区在线观看| 亚洲国产精品无码AV久久久| 五月婷婷丁香六月丁香| 麻豆美女丝袜人妻中文| 欧美色91| 日韩欧无码一区二区三区免费不卡| 97鸡把在线视频| 人妻丰满熟妇av无码区蜜桃| 东京热熟女亚洲视频网站| 97精品国产手机| 精品亚州18| 欧美 牲| 少妇三P| 久久久99999久网站| 97色欧州| 91成人久久| 综合大香蕉美。| suv精产一二三区| 五月天婷婷社区| 婷婷人妻激情| 亚洲精品97久久| 日韩成人高清一区二区| 91精品久久久| 图片区小说区| 国产伦精品免编号公布| 天天综合网在线| 美女诱惑在线一区| 99re69| 欧美久久久| 国产三级中文字幕粉嫩| 亚洲男人的天堂va亚洲男人社| 天久久久噜噜噜久久国产精品爽爽 | 久久99深爱久久99精品| 全国男人天堂网| 美女黄页网站| 青青免费在线视频一区| 亚洲一区日韩精品中文字幕 | 91丝袜美女| 亚洲精品国产av天美传媒| 日本三级韩国三级美三级91| 亚洲色图 91| 日本三级精品| 国产无吗在线播放| 自怕偷自怕亚洲精品| 色欲三区| 国产亚洲综合欧美一区| 免费的av网| 欧美成人都市人妻| 强奸乱伦资源| 国产偷拍网站| 综合自拍| 国产成人91一区二区三区| 男人的天堂午夜av| 欧洲天天在线| 亚洲中亚日激情视频| 在线午夜成人无码视频| 国产一级黄色片在线观看| 又黑又大又粗| 亚州,欧美在线| 日躁天天爽爽| 久久99人妖视频国产| 91国产精品熟女| 啊啊啊啊啊啊啊啊要喷了| 日韩97P| 极品尤物女神在线观看| 99爱久久视频频| 亚洲色人阁| 亚洲强奸乱伦影视网| 国产精品乱人伊人网| 亚洲国产精品久久久久婷婷老年 | 中文字幕精品一区欧美| 男人的天堂2018东京热啪啪啪| 九九亚洲精品| 日本一道在线播放高清| 亚洲色综合| 久久华人网| 高清国产成人无码| 白丝AV网站| 少妇一级无码精品| 熟女啪啪视频| 亚洲视频精选| 韩国一级做A片免费的| 10000部十八禁看电影| 欧美天天性| 久久久婷| 亚洲国产日韩精品久久久| 久久精品国产亚洲AV无码电影| 97资源超碰| 亚洲丝袜少妇在线| 久久怡红院| 在线播放欧洲免费av| 人人摸人人添人人操 | 亚洲熟女一区二区| 国产 v乱码一区二| 国产精品久久久午夜夜伦鲁鲁| 国产强奸AV在线| 97免费在线视频在线观看| 天美传媒麻豆一区二区三区国产精| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 无码欧美有限公司| 青娱乐休闲视频在线观看| 九九九九九九九精品视频| 日韩精品三级| 午夜天堂精品久久久久91| 风骚少妇视频中文字幕| 黑人黄片在线免费观看| 人妻精品一区二区三区| 九九在线视频| 香港澳门日本三级网站| 97干天天| 91成人久久| 国产精品3| 亚洲蜜桃V妇女| 亚洲精品97久久中文字幕| 97最新在线播放视频| 日韩三级av片| 色噜噜人妻av 中文字幕| 国产 日韩,欧美 自拍| 啊啊啊啊啊操我视频| 麻豆美女丝袜人妻中文| 女人一区| 亚州AV无码国产精品| 久久东京热成人| 麻豆天美电影一区二区| 成人无遮挡毛片免费看| 欧美日韩美女精品久草一区二区三区| 综合五月婷婷亚洲一区| 日本二区不卡| 欧美最婬乱婬爆婬性视频 | 97视频在线播放| 长长久久免费视频| 久久中文字幕一区不卡| 精品女同一区二区三区| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 国产成人拍国产亚洲精品| 91天美传媒在线| 再深点灬舒服灬太大了好硬好爽| 久久老女人| 性欧美体内射精| 岛国在线一区二区三区| 久操免费观看| 国产精品久久久久久久久久久久久久久 | 神马久久久久久伦理片| 色97干| 天天摸夜夜操视频| 操逼网站视频漫画国产| 沈阳熟女高潮对白视频| 超碰97综合网| 97操在线| 爱射综合| 欧美亚洲日本视频久久久| 97国产伦理| 超碰97玖玖爱| 蜜桃视频精品一区二区| 黄色av片三级三级三级免费看| 日韩性爱小视频| 天天操天天干美女网址导航| 香一区二区三区| 操逼逼福利视频| 色波多| 欧美性性性| 综合色久欲| 精品乱码久久久久| 青青草在线视频人人想人人上| 99操99| 在线国产一区二区av| 色欲Av人妻精品一区二| 九九九九精| 国产精品禁久久久精品| 午夜精品人妻二区三区| 蜜臀久久久国产| 久久色激情一区二区三区| 五月天激情小说| 日本三级A片网站com| 国产一区二区在线看| 激情五月天校园春色网| 九九九九九用不成了| 欧美性暴力猛交XXXX | 超碰一区二区| 素人无码中文字幕| 嗯嗯啊啊好疼| 丝袜喷水在线| www.99热在线只有精品| 超碰人妻久久人妻中文97| 日韩精品国产精品五码一区二区| 久久草草欧美精品| 婷婷香蕉欧美在线一区二区三区| 国产精品麻豆视频网站| 国产精品久久久久久久黄无码| 国产精品亚洲无码| 国产成人超碰在线| 被男人吃奶很爽的毛片| www.久久制服糖| 人妻一区二区三区视频| 欧美日本中字另类在线| 午夜理论片在线观看免费| 日本国产欧美高清在线| 717影院理论午夜伦八戒| 91精品国产高清久久久久久,亚洲成人| 中文字幕亚洲热播人妻| 欧美性爱一级操| 在线播放成人网站| 校园春色 男人天堂| 超91综合网| 亚洲精品蜜桃久久久一区二区三区| 99这里有精品| 久啪| 一本久久久精品| 四方色播| 久久精品人人做人人看| 人摸人人操人| 久久曰曰| 第四色色综合91| 美国三级日本三级久久99| 91亚洲最新在线| 91社区伊人| 91快色色色色色| 激情丁香五月| 欧美在线大香蕉| 91n处女在线观看| 久久在线观看免费视频| 插日本熟女视频| 超碰久久性爱| 中文字幕免费看| 大香蕉一人| 国产黄色在线播放观看| 国产成人综合网| 国产丝袜美腿美女麻豆| 中文字幕熟女人妻丝袜丝| 国产日本一区二区三区蜜臀在线观看| 一区二区三区高清天码| 天天日天天插| 美女黑人91神马| 天天日天天干少妇日| 亚洲一级特黄大片在线播放91| 色优久久| 91爱欧美| 色香欲综合| 免费A V在线播放| 怡红院视频在线| 日韩中文字幕宗合在线| 免费观看成人www精品视频| 美国一区二区免费视频| 色婷婷丁香五月| 91在线/欧洲| 超碰97久久| 亚洲国产av中文字幕久久| 999久久久久久久精| 夜夜做夜夜爽精品视频| a'v在线资源| 五月综合久久| 亚洲免费97免费| 亚洲 中文 欧美 日韩 在线| 国产又黄又粗的视频| 特污免视频| 91操熟女视频 | 亚洲se电影| 国产精品露脸在线观看| 亚洲情色第一页| 久久男人| 欧美黄片视频在线观看免费| 人人爽人人精品乱人伦AV| 天天看夜夜看日日干| 国产女上位好爽在线| 嗯嗯啊啊啊好爽| 韩国一级婬片A片AAAAA| 伊人少妇久久久| 日逼视频日本| 青青草色插素人| 欧美大香蕉久| 欧美日本天堂| 在线观看亚洲成人精品| 91久久精品蜜臀| 超碰97COm中文| 日日夜夜干| 手机在线大香蕉| 天天综合精品| 亚洲欧美不卡线| 日产狠狠干| 欧美少妇色图| 成人综合网 欧美| 国内毛片无遮挡国产| 欧美97日韩| 欧亚成人| 免看60秒涩涩视频| 午夜爽爽爽在线观看永久入口姬片| 北野未奈加勒比av| 亚洲最大无码中文字幕网站 | 欧美性爱第一区| 嗯嗯啊好大| 老熟妇一区二区三区…| 丁香7月婷婷| 91在线无码精品秘 软件| 97精品久久久久中文字幕| 韩日性爱av| 性色高清..……| 天天干天天干天天| 日韩免费a级毛片无码a∨| 亚洲男人天堂2012| 无码WWW免费视频网站| 97在线亚洲| 人人人人人人少妇| 国产无吗在线播放| 中文字幕伊人| 日本色婷婷| 天堂性色| 97精品视频免费| 在线观看综合精品亚洲| 亚洲少妇视频| 麻豆九九九| 亚洲中文字母在线播放| 综合久久2017| 日韩精品三级片长长久久| 婷婷九月色| 精品欧美不卡在线播放| 精品人妻一二三四区视频| 日韩成人网址| 青青免费在线视频一区| 国产区在线| 91丝袜激情在线| 婷婷五月天色色| www亚洲免费| 中国特猛少妇色xxx| 天堂涩涩| 有码人妻系列| 成片免费观看视频大全| 中国zzijzzijzzwww精品| 97碰碰色| 亚洲国产中文字幕| 内射中出日韩在线观看视频| 久久受www免费人成| 久久精品高清无码一区| 无码91| 亚洲欧美日韩夜夜| 51久久夜色精品国产麻豆| 操逼短片| 久久AV无码1区2区3区| 夜夜草网站| 天天操天天干一区二区 | 99久热| 久草免费福利在线播放| 97这里只有精品| 欧洲自拍色图gif在线| 最新日韩黄片| 高清无码在线播放网站| 超碰97护士| 欧洲色综合| 试看福利| 久久一区无码| 欧美精品另类人妖xxxx| 91色婷婷综合久久中文字幕二区| 99国产在线 精品 视频| 9久在线视频只有精品| 超碰97男女| 超碰吊日色| 一区超碰一区| 欲女人妻性色av| 欧美 牲| 西西美女视频网| 中文字幕78| 国模不卡一本二本三电影| 欧美顶级黄片AAAAA在线免费看| 午夜男人av| 性爱视频啪啪啪啪| 老熟妇一区二区三区…| jk白丝没脱就开始啪啪| 免费成人在线观看91| 国产女大学生AV| 久久精品女同亚洲女同13| 国产久久一区二区| 亚洲天堂日本| 精品一区二区三区蜜桃臀www| 99RE在线视频精品,这里只有精品| 精品无码一区二区| 欧洲射精91| 欧美精品第四五页中文字幕在线观看| 亚洲色堂免费视频| 精品无吗久久| 撸撸成人在线视频| 亚欧中文字幕在线视频| 后入式在线免费观看60秒| 性爱AV天堂| 日本免费一区二区不卡| 亚欧操逼片在线观看 | 亚洲啪AⅤ永久无码| 免费观看网黄| 免费又黄又裸乳的视频| 99热这里只有精品地址| 99精品在线| 久草色悠悠在线视频| 99精品伊人| 1区2区3区中文字幕日韩| 91久久堂| 日韩欧美麻豆| 国产辣妈在线视频福利| 亚洲一级性爱视频免费看| 内射小黄片| 久久人人舔人人爽舔人人av片| 免费a级毛片av无码久久精品中文字幕| 欧美激情另类一区二区| 中文字幕一区电影在线观看| 1769精品一区二区三区| 神马福利久草| 大屁股熟女一区二区三区| 久草这里只有精品| 国产在线播放成人免费| 国产精品亚洲一级av第二区| 色官网在线| 久久综合精品一区二区三区| 骚人妻少妇视频| 亚洲天堂男人天堂| ji熟女.com| 午夜福利免费福利视频| 久久久A∨| 亚洲人妖网| 白丝AV| 国产97视频免费观看| JULIA人妻风俗店中出电影| 裸体美女久久久| 96精品久久| 一级黄色性爱A级片| 啊…啊…操我用力操我 | 91性高朝久久久久久久久| 视频国产成人精品日本亚洲18| 色五天伊人| 97超碰色五月| 99少妇内射| 欧美黄色大片在线观看 | 92人人操人人| 色九九九| 日韩有码专区| 欧亚性爱视频免费看| av操操不卡| 国产免费内射视频| 亚洲欧美一区二区三区一猛片| 欧美在线视频99| 色偷综合| 国产福利视频精品视频| 在线 制服丝袜中出 人妻| 丰满人妻一区| 亚洲伊人a线观看视频| 97天天爽| 熟女精品日韩一区二区三区 | 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 亚州色交| 97亚洲色图| 国产做?爰片久久毛片?片美国| 久久草视频污视频| 免费日韩黄片| 殴洲老熟女| 国产无马在线| 日韩伦理久 久久 清纯| 国产乱子伦久久精品综合一区二区三| 少妇久久久久久| 天天爽天天干| 97久久超碰日韩精品| 久久久激情| 欧美性高潮在线| 伊人AAA| 香蕉99秘 一区精品蜜桃臀| 99久久99久久综合| 人妻熟女一区二区在线视频| 久精品无码av一区二免费国产在线观看| 欧美情色男人的天堂| 无码人妻一区二区三区色欲aⅴ | 97爱综合| 玖玖人人爱| 中文字幕99999| 亚洲精品819| 一区二区三区国产在线播放| www.狠狠干.coom| 97免费在线观看| 日本一区三级韩国| 亚洲色狠| 久久99手机免费视频| 欧美一区二区三区四区综合| 麻豆精品A片免费观看| 美女操逼A A| 屌妞视频久久久久久久| 少妇一级婬片免费放一级a性色.| 狠综合网| 九九99精品| 精品999一区二区| 9热9热综合网| 思思热国产在线视频| 一本色道久久综合狠狠操| 亚洲国产激情国产av| 91国产在线精品| 中国探花熟女| 日韩啪啪视频| 伊人 俄罗斯 a v| 天天精品| 亚洲无码精品AV久久久| 淫乱图区 | 青青草久草AV| 久久久成人国产精品无码| 亚洲熟妇A V黑人| 亚洲最大黄网| 亚洲蜜乳av| 天天天干977| 精品久久久久黄少妇| 免费伦费视频在线观看| 99热这里都是精品| 夜夜夜夜夜夜夜夜夜狠狠狠狠狠狠狠| 亚洲精品尤物yw在线影院| 欧美性视频二区三区| av大香蕉| 中文字幕日韩人妻视频| 五月天精品| 岛国小电影| 亚洲无码久久久久久久| 啊啊啊操死我| 亚洲男人综合网| 婷婷五月花| 精品国产一区二区三区在线播出| 激情婷婷丁香网| 欧美 中文字幕 一区| 乱伦Av网| 青春草莓视频在线观看网址| 色婷婷一区二区三区久久午夜 | 国产一区二区在线看| 99热这里都是精品| 天天弄天天操| 91欧美情色| 欧美大片天天看| 亚洲五月婷婷| 26uuu国产免费观看| 乱操乱伦AV| 天天综合网91| 男人天堂久久精品不卡| 欧美伦乱爱| 999久久久久久久精| 超碰国产在线| 搡老熟女免费视频 | 欧美激情色婷婷花野真衣一区二区| 色播五月婷婷| 偷拍自拍在线视频观看| av一区二区三区四区| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 国产欧美日韩女同性恋ww喷水精品| 国产高清成人mv在线观看| 欧美性xxxxx狂欢| 91热| 99re在线视频这里只有精品| 美骚妇av高清在线| 综精品久久久aaaa| 久久久蜜桃一区二区三区| 久久‘黄片视频| 亚洲欧美日韩免费电影| 8x福利精品第一福利视频导航| 啊啊啊好想要| 亚洲中文字幕熟女| 天天做天天爱| 97欧美视频| 欧美天天射| 中国一级αV| 国产精品国产精品国产| 九九九九九精品视频| 啊啊啊慢点| 蜜桃久久一区| 日本免费二区三区| 日韩有码回春沙龙第一页| 色麻豆AV| 欧美亚洲涩涩| 91在线/欧洲| 欧美人人天天网| 麻豆成人av| 欧美论理片| 亚洲伊人久久精品影院| av 模特一区了| 精品无码产区一区二| 久久久精| 亚洲 欧美 日本 国内 首页| 久欲AV| 日韩AV噜噜噜一区二区三区四区| 超碰在线综合97| 日韩射图| 亚洲日韩美女丝袜美腿人妻视频| 欧色网址| 亚洲综合另类| 日本人妻中文字幕精品| 午夜福利免费福利视频| 国产综合操逼高清| 99色悠悠| 欧美亚洲美少妇一区二区| 久久久久无码一妻区| 91精品久久久久久| 欧美激情综合| 久久久96| 日熟女| 国产 热久久久久国产精品| 日本免费专区| 久久五月婷| 国产青视频| 日韩不卡码| 亚洲日精品| 老司机福利青青草| 又粗又长又爽在线观看| 国产一区二区视频在线播放| 国模一区二区三区| 日本 免费 一区二区三区 久久香蕉 | 久久久成人国产精品无码| 国产精品一区二区 尿失禁| 天堂蜜桃无码视频一区二区| 殴美,日韩国产伦精品| 91在线/欧洲| 日本Suv精品一区二区| 亚洲在线网站| 久久久麻豆精品| 中文字幕黑人大片| 久久精9| 国产白丝网站| 金莲网址| 另类图片五月| 亚洲风情综合网| 日本阿v天堂在线观看| 天天草天天干天天日| 久久精品欧美一区蜜桃| 欧美亚洲清纯| 亚洲成人ab| 亚州AV无码国产精品| 国产精品九9| 人人澡人人澡人人| 国产福利一区二| 国产伦乱91| 国产精品久久久蜜臀| 岛国黄色大片网站| 亚洲人妻久久久| 亚洲日韩狠狠撸视频| 8x福利精品第一福利视频导航| 大香蕉乱伦视频网| 日韩精品电影| 国产欧美在线观看免费观看| 国产亚洲综合欧美一区| 天天综合网~91综合网| 少妇久久久久久| 99操99| 狠狠躁天天躁日日躁97| 日韩高清黄片| 在现视频女上位好爽| 91中文字幕制服丝袜免费视频| 视频黄色国产一级| 熟妇最新先锋一二三区| 96久久久久| 免费看日本操逼视频| 色五月激情AV在线| 亚洲一区操| 亚洲天堂另类小说男人| 超碰色97| 亚洲精品日韩国产欧美| 亚洲精品一卡二卡三卡福利视频网站| 国产成人亚洲精品无| 97色婷婷| 日韩成人小视频| 熟女乱伦二区| 日韩黄色小说| 天天草夜夜草高潮片| 熟妇最新先锋一二三区| 97se亚洲综合自| 伊人久久婷婷| 凹凸 69堂 在线播放| 成人a级高清视频在线观看| 96精品在线| 国产精品久久久啊| 精品视频久久久久九九九九9999 | 三及片网站| 凹凸视频特色日本特黄| 欧美人妻制服| 密桃99999| 香蕉欧美| 91夜色chaopeng| AV一起草在线| 日日摸日日碰| 男人高清无码一区二区| av草草在线电影| 日韩欧美经典在线观看| 亚洲图片欧美偷拍| 日韩av不卡在线看| 色老牛| 不卡啪啪视频| 伊人九九| 一区二区三区日韩欧美 | 精品二999| 国产一区二区啪啪视频| 久久97视频| 欧美在线官网| 夜夜操美女| 2019亚洲男人天堂| 曰韩成人免费视频| 青青草大香蕉视频| 伊人五月天青青草婷婷| 国语对白露脸XXXXXX| 欧美大片天天看| 日韩中文字幕在线视频观看| 上床啊啊啊| 国产精品九9| 天天艹天天日| 中国91AV| 91人妻丝袜无码| 99这里只有精品国产| 色偷综合| 99热超碰| 亚洲春色一区二区三区| 校园春色宗合网| 爱我干综合| 日本一道在线播放高清| 欧美暴力猛交| 成人性爱电影网| 日韩视频精品在线观看| 国产精品高潮久久AV| 婷婷五月天成人网| 老熟女综合| 男人的天堂2000| 91色综| 亚洲精美粉嫩嫩泬在线观看| 久久久久久久9| 超碰一区二区| 少妇高潮99p| 国产一区在线免费播放| 亚洲乱妇p22| 久久噜噜噜精品国产亚洲综合| 在线人妻熟女一区二区三区四区五区| 亚洲导航深夜福利| 大香蕉伊人网| 国产二区三区粉嫩在线| 国产成人网址| 九九九九九精品| 天天影视网色欲色香| 诱惑人妻欧美一区在线播放| 美女自卫慰黄网站免费| 色综合V| 国产少妇内射| 青青草在线视频欧美| 亚州色交| 午夜精品久久久久久久99蜜桃一| V A在线| 国产又大又粗又长视频| 日韩精品 资源| 午夜黄色免费在线观看| 岛国1区2区3区在线观看| 天天操妹子| 国产精品久久久999| 九九九网页| 精品久久99| 色久桃花影院在线观看| 久思思热视频在线观看| 九九九九热| 久久久久久久久久久久色网| 天天色怡春院| 97超碰天天| 97色爱| 色妺妺在线视频| 激情婷婷五月天| 色999;丁香五月| 性色av大全| 一级性爱视频免费观看| w w w.久久精品| 亚洲91在线| 97免费在线| 超碰欧美97资源| 高清不卡 中文 人妻| 久久视频,这里只有精品| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 精品久久久av| 夜夜一区二区| 91chinese在线| 亚洲精品日日夜夜52| 日韩av在线免费网站| www黄片免费看com| 国模不卡| 亚洲啪啪视频一区二区|