精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

超碰中文在线| 一本色道久久综合亚洲| 日本精品影院| 欧美性xxxxxxxx| 欧美a级黄色大片| 无码精品人妻一区二区| 美女任你摸久久| 欧美高清在线观看| 中文字幕免费在线看线人动作大片| 青青在线精品| 黑人巨大精品欧美一区二区一视频| 亚洲高清123| 蜜臀av免费在线观看| 美国欧美日韩国产在线播放| 欧美极品欧美精品欧美视频| 我不卡一区二区| 涩涩屋成人免费视频软件| 色婷婷精品久久二区二区蜜臂av | 555www成人网| 成人精品一二三区| 亚洲春色h网| 精品乱人伦小说| 亚洲一级片网站| 在线看的毛片| 亚洲午夜激情av| 波多野结衣三级在线| 欧美日韩在线精品一区二区三区激情综| 久久成人麻豆午夜电影| 日韩女优在线播放| 可以在线观看av的网站| 午夜日韩电影| 色哟哟亚洲精品一区二区| 国产xxxxxxxxx| 日韩三级av高清片| 欧美精品一卡二卡| 亚洲精品怡红院| 亚洲淫成人影院| 亚洲va国产va欧美va观看| 裸体大乳女做爰69| 蜜芽在线免费观看| 中文乱码免费一区二区| 欧美高清视频一区二区三区在线观看| 亚洲黄色在线观看视频| 国产一区二区三区四区五区入口 | 91av在线免费观看视频| 亚洲国产成人精品综合99| 国产精品成人一区二区不卡| 中文字幕日韩欧美精品在线观看| 中文字幕高清视频| 偷拍视屏一区| 亚洲欧美一区二区激情| 受虐m奴xxx在线观看| 亚洲福利天堂| 精品在线欧美视频| 一本色道综合久久欧美日韩精品| 精品福利一区| 亚洲精品美女免费| 中国极品少妇videossexhd| 成人线上播放| 亚洲精品国产精品国自产在线| 国产精品日日摸夜夜爽| 国产精品对白| 日韩精品视频免费专区在线播放| 亚洲天堂资源在线| 蜜桃tv一区二区三区| 亚洲性夜色噜噜噜7777| 我想看黄色大片| 99久久综合| 欧美成人午夜免费视在线看片| 欧美黄色免费在线观看| 亚洲黄色视屏| 欧美在线不卡区| 无码久久精品国产亚洲av影片| 欧美a一区二区| 成人免费xxxxx在线观看| 精品国产va久久久久久久| 国产91精品免费| 国产日韩欧美一区二区| 神马精品久久| 亚洲国产精华液网站w| 福利网在线观看| 成人在线高清免费| 91国产视频在线观看| 五月婷婷之婷婷| 亚洲精品观看| 亚洲欧美综合v| 免费看特级毛片| 99av国产精品欲麻豆| 国产精品国产亚洲伊人久久| 国产女人18毛片18精品| 9久草视频在线视频精品| 国产原创一区二区| 国产69精品久久久久99| 天堂网中文字幕| 精品制服美女久久| 国产三区二区一区久久| 1024免费在线视频| 亚洲高清一区二区三区| 日韩av片网站| 菁菁伊人国产精品| 久久精品国产亚洲精品2020| 日韩激情在线播放| 精品一区二区三区在线播放视频| 精品视频在线观看| 日韩免费网站| 懂色av中文一区二区三区天美| 日本77777| 亚洲综合小说图片| 久久久久www| 中文字幕69页| 高清成人免费视频| 一区精品视频| 日本电影欧美片| 精品国产91洋老外米糕| 国产黄色录像片| 久久精品导航| 国产精品白丝jk白祙| 五月天婷婷在线视频| 欧美视频专区一二在线观看| 成人三级做爰av| 日韩综合在线| 国产精品福利无圣光在线一区| 手机看片1024日韩| 亚洲欧美电影一区二区| 天天干天天爽天天射| 日韩三区视频| 久久久免费精品视频| 97久久人国产精品婷婷| 国产人成一区二区三区影院| 国产精品333| 成人线上播放| 欧美高清视频免费观看| 国产精品高潮呻吟久久久| 国产午夜精品美女毛片视频| www.中文字幕在线| 国产精品tv| 97精品视频在线观看| 黄色三级网站在线观看| 亚洲综合色成人| 粗大的内捧猛烈进出视频| 97国产成人高清在线观看| 国产精品青草久久久久福利99| 男人的天堂在线视频| 色综合天天综合色综合av| 亚洲制服丝袜在线播放| 亚洲国产一区二区精品专区| 不卡视频一区二区三区| 在线视频中文字幕第一页| 欧美一区二区在线视频| 国产67194| 韩国三级中文字幕hd久久精品| 亚洲欧洲久久| 国模大尺度视频一区二区| 久久这里有精品| 国产麻豆免费观看| 亚洲精品免费播放| 在线播放av网址| 一本色道久久综合亚洲精品不卡 | 亚洲美女精品一区| 超碰91在线播放| 欧美日韩hd| 国产精品永久入口久久久| 阿v视频在线观看| 日韩精品一区二区三区第95| 69国产精品视频免费观看| 国产日产欧美一区| 激情黄色小视频| 欧美日一区二区在线观看 | 午夜性福利视频| 亚洲高清资源| 免费影院在线观看一区| 免费在线观看一区| 久热精品视频在线| 亚洲精品18p| 狠狠干狠狠久久| 奇米网一区二区| 国产精品资源网| 99视频在线免费播放| 精品国产视频| 91手机视频在线观看| av2020不卡| 国产亚洲欧美视频| 国产欧美熟妇另类久久久| 午夜伦欧美伦电影理论片| 国产三级av在线播放| 激情五月播播久久久精品| 欧美这里只有精品| 色综合综合色| 91黄在线观看| 久久r热视频| 九九视频直播综合网| 青青草免费在线| 制服.丝袜.亚洲.中文.综合| 国产污视频在线看| 国产精品视频免费| 国产综合内射日韩久| 免费成人在线视频观看| 隔壁人妻偷人bd中字| 国产不卡一区| 99久久伊人精品影院| 97久久网站| 韩国三级日本三级少妇99| 色综合久久影院| 精品调教chinesegay| av在线资源观看| 日韩欧美第一页| 欧美一级高潮片| 亚洲欧美中日韩| 亚洲天堂久久新| 懂色av中文字幕一区二区三区 | 国产成人无码一区二区三区在线| 国产精品久久久久aaaa樱花| 亚洲调教欧美在线| 国产乱对白刺激视频不卡| 一级特黄性色生活片| 激情亚洲网站| 国产资源第一页| 欧美成人激情| 日韩av在线电影观看| 欧美成人基地| 高清一区二区三区视频| 高清一区二区| 国产欧美va欧美va香蕉在| 另类图片综合电影| 久久久久国产精品一区| 成人看av片| 精品国产欧美成人夜夜嗨| 国产黄色片在线播放| 精品视频久久久久久| 日韩一级片免费在线观看| 日韩免费视频一区二区| 7777久久亚洲中文字幕| 欧美中文字幕一区二区三区| www.国产一区二区| 精品日本美女福利在线观看| 国产一级二级毛片| 亚洲综合图片区| 国产污片在线观看| 亚洲成av人片在线| 久久久久99精品| 偷窥国产亚洲免费视频| 日韩精品一区二区在线播放 | 国产精品综合在线| 欧美人妖巨大在线| 中文字幕自拍偷拍| 欧美日韩久久一区| 一级全黄裸体免费视频| 欧美日韩夫妻久久| 中文字幕日本人妻久久久免费 | 亚洲经典一区二区三区| 精品国产一区久久| 天堂网在线资源| 日韩av中文字幕在线| 人人九九精品| 亚洲图片欧美午夜| 日本在线观看网站| 久久成人在线视频| 啦啦啦中文在线观看日本| 久久久久亚洲精品国产| 国产激情视频在线看| 国产91成人video| 91tv亚洲精品香蕉国产一区| 国产精品嫩草视频| 91精品网站在线观看| 1区1区3区4区产品乱码芒果精品| 色妞ww精品视频7777| 精品视频一区二区三区四区| 精品久久成人| 国产日韩第一页| 欧美午夜影院| 成人综合视频在线| 久久99精品国产麻豆婷婷洗澡| 色一情一区二区三区| 粉嫩一区二区三区性色av| 丝袜美腿中文字幕| 中文字幕av一区二区三区免费看 | 精品免费在线视频| 日批视频免费观看| 日韩一卡二卡三卡国产欧美| 日韩在线视频第一页| 亚洲人成亚洲人成在线观看| 老司机午夜在线视频| 久久全国免费视频| 精品裸体bbb| 国产精品乱码| 欧洲美女日日| www.成年人视频| 日日夜夜精品视频免费| 污污视频网站在线| 久久综合九色综合欧美就去吻| 青青青手机在线视频| 午夜一区二区三区在线观看| 一级一片免费看| 日韩一级片网址| 国产原创av在线| 久久久久久一区二区三区 | 欧美日韩国产乱码电影| 黄色aaa毛片| 色偷偷88888欧美精品久久久| а√天堂资源官网在线资源| 成人黄色生活片| 在线成人动漫av| 欧美在线观看视频免费| 美女mm1313爽爽久久久蜜臀| 中文字幕在线永久| 亚洲人成网站影音先锋播放| 三级网站在线播放| 精品噜噜噜噜久久久久久久久试看| 91精品国产91久久久久游泳池| 97久久久免费福利网址| 精品国产乱码久久久久久樱花| 日韩av电影免费观看| 在线不卡视频| 亚洲男人天堂2021| 国产精品午夜久久| 五月天婷婷激情| 亚洲福利在线播放| 二区三区四区高清视频在线观看| 国产成人精品视频| 欧美一级三级| 999一区二区三区| 韩国理伦片一区二区三区在线播放| 中文字幕成人动漫| 精品久久久一区二区| 亚洲国产中文字幕在线| 久久久国产视频| 欧美日韩免费电影| 日韩视频在线观看国产| av在线app| 日本久久电影网| 国产老妇伦国产熟女老妇视频| 亚洲最新av网址| 中老年在线免费视频| 精品人伦一区二区三区| 亚洲区欧美区| 精品久久久久久无码人妻| 一区二区三区四区不卡视频| 国产精品污视频| 久久影视免费观看| 亚洲a成人v| 日本一本草久p| 国产一区二区在线免费观看| 99热在线观看精品| 欧美久久久影院| 国产美女av在线| 亚洲aa在线观看| 欧美久久视频| 伊人影院在线观看视频| 亚洲人精品一区| а√中文在线资源库| 欧美福利视频网站| 超碰成人97| 玩弄中年熟妇正在播放| 久久―日本道色综合久久| 国产午夜麻豆影院在线观看| 亚洲性生活视频| 亚洲电影二区| 日本香蕉视频在线观看| 成人app下载| 亚洲免费黄色网址| 亚洲最新中文字幕| 欧美视频免费看| 欧美美女黄色网| 成人黄色网址在线观看| 四虎成人永久免费视频| 在线丨暗呦小u女国产精品| 91精品福利观看| 霍思燕三级露全乳照| 久久久蜜桃精品| 一级黄色片在线看| 久久久视频精品| 欧美男同视频网| 亚洲妇熟xx妇色黄蜜桃| 亚洲成人动漫av| 国产永久免费高清在线观看| 91欧美激情另类亚洲| 亚洲精品看片| 刘亦菲国产毛片bd| 亚洲精品一区二区三区四区高清| 在线手机中文字幕| 亚洲一区二区三区免费观看| 国产成人免费视频精品含羞草妖精| 国产免费一区二区三区视频| 99精品欧美一区二区三区小说 | 一本色道久久综合亚洲精品图片| 日韩欧美在线国产| 国产在线1区| 噜噜噜噜噜久久久久久91| 蜜桃av一区二区三区| 九九九免费视频| 亚洲网站在线播放| 中文字幕一区二区三区日韩精品| 国产一区二区三区精彩视频 | 日本在线观看视频网站| 亚洲天堂男人天堂| 涩爱av色老久久精品偷偷鲁| 国产性生交xxxxx免费| 亚洲制服丝袜一区| av资源种子在线观看| 精品视频一区二区三区四区|