當我領會到 寫程序的重點在於處理好輸入與輸出以後 再來寫一個搜索組件的時候我關於 loading 的思考以下html
何時顯示 loading ?vue
怎麼控制視圖在這段時間內顯示 loading ?java
那這個變量屬於輸入嗎?git
searchText
這個輸出的相關的 input、 transform 怎麼樣的?github
怎麼實現這樣的一個 transform?api
這個 transform 須要當即的返回狀態,沒有狀態頁面上沒法肯定 loading 怎麼顯示promise
這個 transform 須要持續的返回新狀態。loading 一開始必然是顯示,若是以後不返回新狀態就沒辦法關閉了異步
這個 transform 還須要返回異步請求的結果。.net
而後就是在 vue 中實現這樣的一個思路
/讀書筆記/vue/vue異步數據呈現方案.html
import { defineComponent, ref } from "vue"; import { usePromiseComputed } from "./lib/vue.composition.api"; export default defineComponent({ setup(props, ctx) { const searchText = ref(""); const searchResults = usePromiseComputed({ defaultData: [] as string[], getter() { return searchApi(searchText.value); }, }); return { searchText, searchResults }; }, });
這裏的 usePromiseComputed
就是以前思考的 transform ,他返回了一個 ref(object)
而後當 searchText
發生變化時會從新執行查詢請求 searchApi(searchText.value);
, 當查詢請求結束的時候他會修改以前返回的 ref(object)
<template> <input placeholder="請輸入你要搜索的關鍵字" v-model="searchText" /> <div v-if="searchResults.pending">正在查詢中</div> <div v-else-if="searchResults.rejected"> 查詢失敗 {{ searchResults.error }} </div> <div v-else-if="searchResults.fulfilled"> <div v-for="(item, index) in searchResults.data" :key="index"> {{ item }} </div> </div> </template>
在這裏能夠看出來 usePromiseComputed
返回的結果其中的五個字段,三個狀態字段也就是 前文中提到的控制loading的那個變量 兩個 結果字段
就上面的代碼而言是一個極簡 input -> tranform -> out 結構。這裏不須要手動的聲明一個狀態變量,而後在不一樣的階段在去修改這個變量,這樣的操做封裝在了 usePromiseComputed
裏面。
關於 usePromiseComputed
的實現能夠去這裏查看 https://github.com/2234839/vue-demo/blob/master/src/components/promise-loading/lib/vue.composition.api.ts
實際上針對業務還加入了兩個可選參數 deps 和 dataMergeFun
利用 deps 能夠顯式的聲明哪些變量變化的時候從新請求
利用 dataMergeFun 能夠很是簡單的在上面的代碼基礎上加入請求結果翻頁功能
by 崮生 from 崮生 • 一些隨筆 🎨,歡迎 贊助本文o")
本文歡迎分享與聚合,全文轉載未經受權( 聯繫我)不準可。