React?Suspense前后端IO異步操作處理
簡單介紹Suspense
Suspense主要用來解決網(wǎng)絡(luò)IO問題,它早在2018年的React 16.6.0版本中就已發(fā)布。它的相關(guān)用法有些已經(jīng)比較成熟,有的相對不太穩(wěn)定,甚至經(jīng)歷了重命名、刪除:
- 在render函數(shù)中,我們可以寫入一個(gè)異步請求,請求數(shù)據(jù)
- react會(huì)從我們緩存中讀取這個(gè)緩存
- 如果有緩存了,直接進(jìn)行正常的render
- 如果沒有緩存,那么會(huì)拋出一個(gè)異常,這個(gè)異常是一個(gè)promise
- 當(dāng)這個(gè)promise完成后(請求數(shù)據(jù)完成),react會(huì)繼續(xù)回到原來的render中(實(shí)際上是重新執(zhí)行一遍render),把數(shù)據(jù)render出來
- 完全同步寫法,沒有任何異步callback之類的東西
如果你還沒有明白這是什么意思那我簡單的表述成下面這句話:
調(diào)用render函數(shù)->發(fā)現(xiàn)有異步請求->懸停,等待異步請求結(jié)果->再渲染展示數(shù)據(jù)
看著是非常神奇的,用同步方法寫異步,而且沒有yield/async/await,簡直能把人看傻眼了。這么做的好處自然就是,我們的思維邏輯非常的簡單,清楚,沒有callback,沒有其他任何玩意,不能不說,看似優(yōu)雅了非常多而且牛逼。
Suspense主要用法和場景
在前端開發(fā)中,經(jīng)常會(huì)有這樣的需求,加載某個(gè)界面時(shí),如果界面的資源比較大,前端對數(shù)據(jù)的處理也需要時(shí)間,加載比較慢,這時(shí)候我們需要用一個(gè)加載動(dòng)畫或者提示,使得交互更加友好。
一. React18之前的做法
在React18之前,我們要實(shí)現(xiàn)上面這個(gè)效果,請求數(shù)據(jù)或者加載新的組件的時(shí)機(jī)一般在componentDidMount,在State中需要一個(gè)flag變量來記錄請求數(shù)據(jù)的狀態(tài),后續(xù)手動(dòng)更改這個(gè)狀態(tài),非常的不方便。代碼如下:
class App extends Component { state = { isLoading: false, } componentDidMount() { this.setState({ data: null, isLoading: true, }); axios.get('/api/getData').then((data) => { this.setState({ data, isLoading: false, }); }); } render() { return this.state.loading ? '正在加載中...' : ( <Page data={data} /> ); } }
二. React18之后
1.React.lazy
React.lazy() 允許你定義一個(gè)動(dòng)態(tài)加載的組件。這有助于縮減 bundle 的體積,并延遲加載在初次渲染時(shí)未用到的組件
const SomeComponent = React.lazy(() => import('./SomeComponent'));
渲染 lazy 組件依賴該組件渲染樹上層的 <React.Suspense> 組件。這是指定加載指示器(loading indicator)的方式。
2.React.Suspense
React.Suspense 可以指定加載指示器(loading indicator),以防其組件樹中的某些子組件尚未具備渲染條件:
// 該組件是動(dòng)態(tài)加載的 const OtherComponent = React.lazy(() => import('./OtherComponent')); function MyComponent() { return ( // 顯示 <Spinner> 組件直至 OtherComponent 加載完成 <React.Suspense fallback={<Spinner />}> <div> <OtherComponent /> </div> </React.Suspense> ); }
Suspense配合前端表格組件處理前后端IO異步操作
因?yàn)闆]有后端邏輯,前端表格組件主要用于在前端對 Excel、Grid 表格數(shù)據(jù)在線編輯和展示,而利用Suspense的技術(shù)特點(diǎn),便可以輕松實(shí)現(xiàn)前后端IO異步操作:
const PureSpread = React.lazy(() => import('./components/pureSpread')) const SpreadDesigner = React.lazy(() => import('./components/designer')) const {Content,Header} = Layout const App = () => ( <Layout className="app"> <IndexSider/> <Layout> <Content className="index-content"> <HashRouter> <Switch> <Suspense fallback={<div>loading...</div>}> <Route exact path="/" component={PureSpread}/> <Route exact path="/designer" component={SpreadDesigner}/> </Suspense> </Switch> </HashRouter> </Content> <IndexFooter/> </Layout> </Layout> )
看一下效果:
了解更多在線demo:https://demo.grapecity.com.cn/spreadjs/gc-sjs-samples/index.html
以上就是React Suspense前后端IO異步操作處理的詳細(xì)內(nèi)容,更多關(guān)于React Suspense前后端IO異步的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
react自適應(yīng)布局px轉(zhuǎn)rem實(shí)現(xiàn)示例詳解
這篇文章主要為大家介紹了react自適應(yīng)布局px轉(zhuǎn)rem實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08react 頁面加載完成后自動(dòng)執(zhí)行標(biāo)簽的點(diǎn)擊事件的兩種操作方法
這篇文章主要介紹了react 頁面加載完成后自動(dòng)執(zhí)行標(biāo)簽的點(diǎn)擊事件,本文給大家分享兩種操作方法結(jié)合示例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2022-12-12關(guān)于react-router-dom路由入門教程
這篇文章主要介紹了關(guān)于react-router-dom路由入門教程,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03D3.js(v3)+react 實(shí)現(xiàn)帶坐標(biāo)與比例尺的散點(diǎn)圖 (V3版本)
散點(diǎn)圖(Scatter Chart),通常是一橫一豎兩個(gè)坐標(biāo)軸,數(shù)據(jù)是一組二維坐標(biāo),分別對應(yīng)兩個(gè)坐標(biāo)軸,與坐標(biāo)軸對應(yīng)的地方打上點(diǎn)。由此可以猜到,需要的元素包括circle(圓)和axis(坐標(biāo)軸),接下來通過本文大家分享D3.js(v3)+react 實(shí)現(xiàn)帶坐標(biāo)與比例尺的散點(diǎn)圖 (V3版本) ,一起看看2019-05-05React項(xiàng)目仿小紅書首頁保姆級實(shí)戰(zhàn)教程
React 是一個(gè)用于構(gòu)建用戶界面的 Javascript庫,接下來將通過實(shí)戰(zhàn)小紅書首頁的詳細(xì)介紹其設(shè)計(jì)思路和方法,將讀者帶入到react的開源世界,需要的朋友可以參考下2022-07-07react-redux中connect的裝飾器用法@connect詳解
這篇文章主要介紹了react-redux中connect的裝飾器用法@connect詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01