精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

讓我一起聊聊Hook使用總結(jié)

開發(fā) 前端
自React 16.8支持hook以來,RN也在0.59版本支持了hook,而且官方給出的組件實例也分為了class和hook兩個版本,可以遇見hook是未來的趨勢。恰巧最近重構(gòu)RN項目,把最近遇到的問題和思考記錄一下。

[[423277]]

自React 16.8支持hook以來,RN也在0.59版本支持了hook,而且官方給出的組件實例也分為了class和hook兩個版本,可以遇見hook是未來的趨勢。恰巧最近重構(gòu)RN項目,把最近遇到的問題和思考記錄一下。

今天是總結(jié)課。

重構(gòu)

重構(gòu),我想這個詞可能沒有多少人愿意做,在業(yè)務(wù)迭代頻繁的今天,重構(gòu)意味著資源的消耗,而且承擔著未知的風(fēng)險,那么為什么還要重構(gòu)?

主要有以下思考:

  • 代碼沉郁,不敢刪除舊代碼,舊有的代碼邏輯不熟,關(guān)聯(lián)關(guān)系不清,隨著業(yè)務(wù)的迭代,代碼越來越多。
  • 模塊化不清晰,文件混亂。
  • 規(guī)范不統(tǒng)一,注釋不明確,代碼雜亂。文件查找困難。
  • 工程化不完善,請求不統(tǒng)一,如遇到接口參數(shù)變更,需要修改多處。
  • 組件化不完善,公共組件不統(tǒng)一。

hook化

hook化一個很重要的就是class邏輯的復(fù)用,比如:

  1. // class 
  2. this.setState({ 
  3.     count:0 
  4. },()=>{ 
  5.     // 修改數(shù)據(jù)成功之后 處理的邏輯 
  6. }) 
  7.  
  8. // hook 
  9. useEffect(()=>{ 
  10.     // 監(jiān)控count值的變更 處理邏輯 
  11. },[count]) 

如果我們需要監(jiān)控的值很多,是否需要寫很多useEffect呢?這里會用到另一個概念,細粒度組件。寫hook寫多了,會把一些需要處理的業(yè)務(wù)組件都抽離出來,每個組件只管自己的狀態(tài)。這樣就會極大減少了父組件的業(yè)務(wù)堆積和state堆積。

組件多了就會涉及到組件傳值,這里有三種場景:

  • context包裹子組件
  • memo + context + reducer 組件傳值
  • ref + useImperativeHandle + forwardRef 暴露狀態(tài)給父組件
  • props 組件傳值

props傳值,通過標簽屬性傳遞。

  1. // props 通過標簽傳值 
  2. <CenterMenu style={style} list={list}  /> 
  3.  
  4. //  
  5. export default CenterMenu(props){ 
  6.     const { style, list } = props; 
  7.     //. ... 

context包裹的話,就會把所有狀態(tài)都放在了父組件,就會造成context很臃腫。

  1. <PerfectInfoContext.Provider 
  2.     value={{ 
  3.         serviceBill, 
  4.         patientInfo, 
  5.         batchList, 
  6.         navigation, 
  7.         ...params 
  8. }}> 
  9.     // ...View 
  10.     <Footer  /> 
  11. </PerfectInfoContext.Provider> 
  12.  
  13. // 
  14. const Footer = () => { 
  15.     const  data  =  useContext(PerfectInfoContext); 
  16.     // ... 
  17. export default Footer; 

用context包裹一個Reducer,再用memo緩存,我們就可以在其他函數(shù)組件中去觸發(fā)狀態(tài)變更。

  1. const initState={ 
  2.  isLoading: true
  3.  isSignOut: false
  4.  userToken: null
  5.  routes 
  6. const reducer=(prevState, action)=>{ // switch} 
  7. const [state, dispatch] = useReducer(reducer, initState); 
  8.  
  9. const authContextProps=(dispatch)=>{ 
  10.     return { 
  11.     signIn:async()=>{ // dispatch }, 
  12.     signOut:async()=>{ // dispatch} 
  13.     } 
  14. const authContextData = useMemo(authContextProps(dispatch), []); 
  15. return ( 
  16.   <AuthContext.Provider  value={authContextData}> 
  17.     // view 
  18.    </AuthContext.Provider> 
  19. ); 
  20.  
  21. // 其他函數(shù)組件 
  22. const { signOut } =  useContext(AuthContext); 

細粒度的話,ref應(yīng)該是一個很好的選擇,拿輸入框組件舉例:

  1. function FancyInput(props, ref) { 
  2.     const inputRef = useRef(null); 
  3.     // 暴露給父組件使用 
  4.     useImperativeHandle(ref, () => ({ 
  5.     focus: () => { 
  6.         inputRef.current.focus(); 
  7.     } 
  8.     // 其他方法也可以或者state 
  9.     })); 
  10.     return <input ref={inputRef} ... />; 
  11. export default forwardRef(FancyInput); 
  12.  
  13. // 父組件 
  14. const fancyRef = useRef(null); 
  15. // useEffect、 onPress中使用 
  16. const onPress=()=>{ 
  17.     fancyRef.current?.focus() 
  18.  
  19. <FancyInput ref={ fancyRef }></FancyInput> 

路由

靈活的路由配置也是我們重構(gòu)要考慮的一部分,怎么在RN中實現(xiàn)vue項目的路由配置呢?這需要借助React Navigation 5.x以上版本的Stack。比較可惜的是4.x的 NavigationEvents組件被移除。

  1. // 4.x可使用 4.x之后被移除 
  2. <View
  3.     <NavigationEvents 
  4.         onWillFocus={payload => console.log('will focus', payload)} 
  5.         onDidFocus={payload => console.log('did focus', payload)} 
  6.         onWillBlur={payload => console.log('will blur', payload)} 
  7.         onDidBlur={payload => console.log('did blur', payload)} 
  8.     /> 
  9.     {/* Your view code  */} 
  10. </View

 

5.x版本有點倉促,已不在維護,變更較大,核心代碼分為native、stack等,可以單獨使用。現(xiàn)在的版本6.x大部分api都做了變更,不推薦單獨升級。

  1. // 屏幕事件focus、blur、beforeRemove、state 
  2. React.useEffect(()  =>  { 
  3.     const unsubscribe = navigation.addListener('focus',  ()  =>  { 
  4.         // do something 
  5.     }); 
  6.     return unsubscribe; 
  7. },  [navigation]); 

回到路由配置上,我們可以通過routes來控制路由變化:

  1. // 路由配置 
  2. export const routes = [ 
  3.     ...roleRouters, 
  4.     { 
  5.         name'Home'
  6.         screen: HomeScreen, 
  7.         hidden: false
  8.         options: {}, 
  9.     }, 
  10.     ...personRouters, 
  11.     ...ordersRouters, 
  12.     ...goodsRouters, 
  13.     ...customerRouters, 
  14.     ...taskRouters, 
  15.     ...otherRouters, 
  16. ]; 
  17.  
  18. <NavigationContainer> 
  19.     <Stack.Navigator> 
  20.         {state.userToken ==  null  ? (<Stack.Screen 
  21.             name='Login' 
  22.             component={LoginScreen}/>) :  
  23.             (state.routes.map((e, i) => { 
  24.                 if (!e.hidden) { 
  25.                     return ( 
  26.                         <Stack.Screen 
  27.                             key={i.toString()} 
  28.                             name={e.name
  29.                             params={e.params} 
  30.                 component={e.screen}/> 
  31.             ); 
  32.         }}) 
  33.         )} 
  34.  
  35.     {/* 公共路由 無論是否登錄都可以訪問 */} 
  36.     {commonRoutes.map((e, i) => <Stack.Screen  {...e.props}  />)} 
  37.     </Stack.Navigator> 
  38. </NavigationContainer> 

 

 

如果你覺得import導(dǎo)入太多的話,navigation也提供了支持,你也可以動態(tài)導(dǎo)入:

  1. // 動態(tài)導(dǎo)入 
  2. export const routes = [ 
  3.     { 
  4.         name'Home'
  5.     getComponent: () =>  require('@/pages/other/cmsWeb').default
  6.     options: { header: () => {} }, 
  7.     }, 
  8. ]; 
  9.  
  10. <NavigationContainer> 
  11.     <Stack.Navigator> 
  12.         state.routes.map( 
  13.             (e, i) => <Stack.Screen  key={i.toString()}  {...e}/>; 
  14.         ) 
  15.     </Stack.Navigator> 
  16. </NavigationContainer> 

 

 

navigation提供了一個輔助效果,回到頂部:

  1. import  *  as  React  from  'react'
  2. import  {  ScrollView  }  from  'react-native'
  3. import  { useScrollToTop }  from  '@react-navigation/native'
  4. function  Albums()  { 
  5.     const ref =  React.useRef(null); 
  6.     useScrollToTop(ref); // ScrollView或者FlatList 
  7.     return  <ScrollView ref={ref}>{/* content */}</ScrollView>; 

工程化配置

除了babel、eslint配置外,就是模塊化的管理,路由模塊化、頁面模塊化、api模塊化。工具方法、共用組件、公共hook、公共資源、本地常量,以及屏幕適配方案,剩下就是規(guī)范統(tǒng)一,這樣一個小中項目基本就可以hold住了。

hook之前都停留著概念上,這次的落地能發(fā)現(xiàn)一些問題,也能跟貼切與class對比,目前還是粗淺使用,更加復(fù)雜的場景還待處理。

補充一點就是,在RN中require的本地圖片返回的是一個id,那么我們有集中處理必要了。

 

責(zé)任編輯:武曉燕 來源: 驚天碼盜
相關(guān)推薦

2021-04-12 18:03:39

Nginx架構(gòu)負載

2021-07-02 20:46:06

Go接口動態(tài)

2022-06-27 08:00:49

hook工具庫函數(shù)

2024-02-20 21:34:16

循環(huán)GolangGo

2022-12-07 09:01:14

布局容器VStack?

2021-08-27 07:06:10

IOJava抽象

2023-06-30 08:18:51

敏捷開發(fā)模式

2023-08-10 08:28:46

網(wǎng)絡(luò)編程通信

2023-08-04 08:20:56

DockerfileDocker工具

2022-05-24 08:21:16

數(shù)據(jù)安全API

2023-09-21 08:16:56

JDK 21向量計算計算

2023-09-10 21:42:31

2021-07-12 11:35:13

Go協(xié)程Goroutine

2024-07-18 08:54:49

2018-08-24 15:24:10

AndroidiOS蘋果

2023-07-27 07:46:51

SAFe團隊測試

2022-07-29 08:17:46

Java對象內(nèi)存

2022-06-26 09:40:55

Django框架服務(wù)

2023-12-28 09:55:08

隊列數(shù)據(jù)結(jié)構(gòu)存儲

2022-10-28 07:27:17

Netty異步Future
點贊
收藏

51CTO技術(shù)棧公眾號

国产亚洲xxx| 人妻视频一区二区三区| 成全电影播放在线观看国语| 精品国产亚洲一区二区三区在线 | 第四色在线视频| 黄色小视频在线免费观看| 午夜欧美理论片| 欧美午夜不卡在线观看免费| 国产一区二区三区无遮挡| 夜夜春很很躁夜夜躁| 17videosex性欧美| 国产一本一道久久香蕉| 中文日韩在线视频| 已婚少妇美妙人妻系列| 天天干天天摸天天操| 影视一区二区| 欧美日韩一区二区在线观看| 欧美一区二区三区在线免费观看| 久久久久久欧美精品se一二三四| 精品视频一区二区三区在线观看| 五月婷婷欧美视频| 国产精品久久精品视| 久草综合在线视频| 亚洲人体在线| 亚洲欧洲色图综合| 国产精品入口日韩视频大尺度| 中国美女乱淫免费看视频| 91禁在线看| 国产精品久久久久久久午夜片| 国产精品久久久久久久午夜| 久久免费公开视频| 区一区二视频| 欧美久久一二区| 伊人狠狠色丁香综合尤物| 在线观看中文字幕av| 日本成人小视频| 日韩av影视在线| 日日橹狠狠爱欧美超碰| 日韩欧美电影在线观看| 国产精品五区| 亚洲图片欧美午夜| 国产国语老龄妇女a片| www亚洲人| 99精品久久99久久久久| 91po在线观看91精品国产性色| 黄色污在线观看| 精品一区二区三区中文字幕| 欧美吞精做爰啪啪高潮| 97xxxxx| 国产小视频在线| 国产亚洲在线| 欧美激情伊人电影| 一本色道综合久久欧美日韩精品| 国产乱码精品一区二三赶尸艳谈| 91视频www| 国产精品视频免费在线观看| 色一情一乱一伦| 不卡一区2区| 亚洲人成电影在线| 日本高清一区二区视频| 久久一卡二卡| 国产午夜精品久久久久久免费视| 国产欧美一区二区三区在线看| 91成人福利视频| 日日狠狠久久偷偷综合色| 欧美三级日韩在线| 欧美午夜性生活| 国产激情小视频在线| 成人午夜电影小说| 国产精品福利久久久| 国产传媒免费在线观看| 欧美成人基地| 69堂成人精品免费视频| 国产一区二区在线视频播放| av免费不卡国产观看| 性久久久久久久久久久久| www.射射射| 日本视频在线播放| 97超碰欧美中文字幕| 国产一区再线| 天堂中文在线视频| 国产精品综合一区二区三区| 日韩免费高清在线观看| 在线免费日韩av| 国内精品福利| 日韩中文字幕在线精品| 大尺度做爰床戏呻吟舒畅| 四虎在线精品| 91福利视频网站| 欧美黑人在线观看| 亚洲乱亚洲乱妇| 亚洲欧美激情插| 日产精品久久久一区二区| www国产在线| 免费在线观看视频一区| 51久久精品夜色国产麻豆| 色婷婷在线视频观看| 伊人精品成人久久综合软件| 久久综合九色九九| 日本一卡二卡在线播放| 一区二区三区四区在线看| 亚洲成色777777女色窝| av在线免费观看不卡| 九九九精品视频| 在线免费观看不卡av| 91视频最新入口| gogo高清午夜人体在线| 色综合天天综合在线视频| 波多野结衣综合网| 欧美人与动牲性行为| 色综合久久天天综合网| 国产探花在线观看视频| 精品国产乱码久久久久久樱花| 亚洲国产毛片完整版| 成人做爰69片免费| 日本亚洲视频| 欧美va天堂va视频va在线| 91丨porny丨九色| avtt久久| 亚洲男人第一网站| 成人片黄网站色大片免费毛片| 久久97精品| 亚洲国产精品999| 久久视频一区二区三区| 91亚洲国产高清| 久久精品国产v日韩v亚洲 | 欧美国产禁国产网站cc| 欧美一区二区三区四区夜夜大片| 黄色片网站在线| 亚洲精品国久久99热| 欧美大黑帍在线播放| 成人免费网站www网站高清| 欧洲中文字幕精品| 亚洲精品乱码久久久久久蜜桃欧美| 日韩免费特黄一二三区| 久久九九有精品国产23| www.com亚洲| 美女一区二区视频| 欧美另类一区| 亚洲欧美视频一区二区| 欧美性xxxx在线播放| 蜜桃免费在线视频| 精品国产亚洲一区二区三区大结局| 亚洲性xxxx| 毛片毛片女人毛片毛片| 人人爽香蕉精品| 亚洲最大的成人网| 国产乱淫a∨片免费观看| 国产在线一区观看| 亚洲黄色一区二区三区| 麻豆网站在线| 亚洲成a人片综合在线| 国产日产欧美视频| 国产精品毛片视频| 伊人久久免费视频| 久久久久久久久毛片| 经典三级在线一区| 国产综合精品一区二区三区| 免费在线观看av电影| 日韩午夜电影在线观看| 国产伦精品一区二区三区妓女| 亚洲先锋成人| 国产精品国产精品| 成人超碰在线| 欧美日韩国产免费一区二区 | av动漫免费观看| 青春草在线免费视频| 日韩欧美国产综合| 精品无人区无码乱码毛片国产| 国产精品久久久久一区二区三区厕所| 久久久久久久成人| 日本韩国在线观看| 精品日韩中文字幕| 超碰在线免费av| 欧美一区二区| 国产伦精品一区二区三区高清版| 嗯啊主人调教在线播放视频 | 91.xxx.高清在线| 亚洲一级二级三级| 久久国产激情视频| 一道在线中文一区二区三区| 国产va免费精品高清在线| 99精品在线视频观看| 久久婷婷色综合| 久久香蕉视频网站| 欧美黄页在线免费观看| 久久亚洲电影天堂| 高潮毛片7777777毛片| 中文字幕一区二区三区av| 免费av观看网址| 啄木系列成人av电影| 91精品国产综合久久久久久久久 | 亚洲欧美在线观看| 亚洲国产精品第一页| 美女精品在线| 国产精品自拍首页| 欧美xx视频| 亚洲精品狠狠操| 波多野结衣一二区| 久久一日本道色综合| 国产三级三级看三级| 亚洲婷婷在线| 色一情一乱一伦一区二区三欧美| 美女搞黄视频在线观看| 日韩欧美亚洲国产另类| 六月丁香激情综合| 亚洲天堂免费在线观看视频| 在线免费观看av的网站| 你懂的一区二区| 欧美日韩一区二区视频在线观看| 国产精品va视频| 久久精品国产v日韩v亚洲| 色婷婷在线视频| 欧美久久久久久久久| 久久精品一二区| 91在线一区二区三区| 中日韩av在线播放| 欧美激情欧美| 欧美xxxx黑人又粗又长精品| 伊伊综合在线| 国产亚洲精品成人av久久ww| 国产黄色一级大片| 亚洲一二三区视频在线观看| 日本高清黄色片| 91丝袜呻吟高潮美腿白嫩在线观看| 亚洲一二区在线观看| 久久久久免费| 97在线国产视频| 色婷婷综合久久久久久| 亚洲综合成人婷婷小说| 成人国产精品一区二区免费麻豆| 色阁综合伊人av| 国产精品久久久久精| 欧美色另类天堂2015| 日本一级黄色录像| 久久综合久久99| 97精品人人妻人人| 国产美女av一区二区三区| 黑森林精品导航| 玖玖玖国产精品| 一区二区三区欧美成人| 免费一级欧美片在线观看网站| 国产精品高清网站| 少妇一区视频| 日本精品久久久| 色欧美激情视频在线| 国产亚洲日本欧美韩国| 精品电影在线| 在线精品国产成人综合| 成在在线免费视频| 亚洲日本aⅴ片在线观看香蕉| 亚洲 欧美 精品| 欧美丰满美乳xxx高潮www| 波多野结衣午夜| 欧美影视一区在线| 国产情侣小视频| 欧美性受xxxx| 在线观看中文字幕2021| 欧美丰满少妇xxxxx高潮对白 | av色在线观看| 高清在线视频日韩欧美| 国产在线网站| 伊人激情综合网| 老司机精品视频在线观看6| 久久精品中文字幕一区| 亚洲七七久久综合桃花剧情介绍| 亚洲欧洲在线看| 日本aaa在线观看| 亚洲视频在线播放| 成人高清免费在线播放| 日韩在线观看你懂的| 国产激情视频在线观看| 欧美激情精品在线| 日本三级视频在线观看| 日韩在线国产精品| 在线观看小视频| 中文字幕在线日韩| 麻豆影视在线观看_| 九九热视频这里只有精品| 成人免费在线视频网| 日韩一区二区三区xxxx| 日本孕妇大胆孕交无码| 7m第一福利500精品视频| 粉嫩一区二区三区| 亚洲aⅴ日韩av电影在线观看 | 日本在线视频网址| 欧美在线精品免播放器视频| 欧美v亚洲v综合v国产v仙踪林| 91精品国产99久久久久久红楼| 欧美尿孔扩张虐视频| 日韩理论片在线观看| 中国成人一区| 欧美视频第一区| 精品在线观看视频| 精品久久久噜噜噜噜久久图片| 亚洲天堂黄色| 久久久久国产精品熟女影院| 极品美女销魂一区二区三区 | 欧美国产乱子伦| 美女视频黄免费| 中文字幕欧美一| 国产中文字字幕乱码无限| 亚洲美女视频一区| av中文在线播放| 欧美日韩高清影院| 色综合888| 欧美成在线视频| 性爱视频在线播放| 日本视频久久久| 日韩最新av| 日韩videos| 一区三区视频| 三级av免费观看| 久久综合色婷婷| 久久久无码一区二区三区| 欧美性猛交xxxx乱大交退制版| 亚洲精品视频网| 精品国产99国产精品| 国产小视频免费观看| 自拍偷拍亚洲区| 色多多在线观看| 成人自拍偷拍| 精品国产乱子伦一区二区| 亚洲欧洲日韩精品| 丝袜美腿成人在线| 亚洲色图欧美日韩| 亚洲免费观看高清| 中文字幕自拍偷拍| 91麻豆精品91久久久久久清纯| 污污的视频网站在线观看| 欧美精品免费播放| 亚洲ww精品| 亚洲精品一区二| 日韩精品视频网| 午夜剧场在线免费观看| 久久综合网色—综合色88| 日韩成人免费在线观看| 日韩美女一区二区三区| 成视频免费观看在线看| 国产一区二区丝袜| 日本a级不卡| 五月天av在线播放| 国产精品私人影院| 亚洲精品一区二区二区| 91精品婷婷国产综合久久| yiren22综合网成人| 国产成人精品一区二区在线 | 先锋在线资源一区二区三区| 久久精品123| 级毛片内射视频| 91久久人澡人人添人人爽欧美| 日韩a在线观看| 欧美有码在线观看视频| 亚州综合一区| 成人黄色片视频| 国产日韩综合av| 一级一级黄色片| 在线日韩欧美视频| 欧美成人一二区| 干日本少妇视频| 亚洲欧美日本国产专区一区| 亚洲欧美日韩精品一区| 一区精品在线播放| 国产美女精品视频国产| 久久成人免费视频| 中文在线综合| 亚洲成人一区二区三区| 日韩精品色哟哟| 久久久久麻豆v国产| 精品欧美激情精品一区| 青青青草原在线| 国产精品99一区| 日韩成人影院| 亚洲高清av一区二区三区| 亚洲一二三四区不卡| 日韩二区三区| 国产精品青草久久久久福利99| 天天综合网网欲色| 女性生殖扒开酷刑vk| 日韩欧美中文第一页| 成人在线观看一区| 亚洲直播在线一区| 日韩视频一区| 久久久久亚洲av无码麻豆| 亚洲最新视频在线播放| 国产精品一区二区av白丝下载| 欧美日韩成人在线播放| 美国成人xxx| 亚洲国产高清av| 亚洲影院久久精品| 激情福利在线| 亚洲一区二区久久久久久久| 亚洲另类视频| 国内精品免费视频| 色婷婷一区二区| 午夜av在线播放| 日本免费高清不卡| 国产成人啪午夜精品网站男同| 一级免费黄色录像| 亚洲精品电影在线|