自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

這6個React技巧讓你獲得愉悅工作體驗

開發(fā) 前端
俗話說,熟能生巧,大多數(shù)時候筆者都在使用React工作。時間久了,一些小技巧也不請自來,它們著實讓人獲得了意外之喜。

  俗話說,熟能生巧,大多數(shù)時候筆者都在使用React工作。時間久了,一些小技巧也不請自來,它們著實讓人獲得了意外之喜。

[[321338]]

并不是每個人都發(fā)現(xiàn)了這些技巧,筆者的很多同事就還沒有發(fā)現(xiàn)。但它們確實簡單好用,讓人心情愉悅。一起來看看吧!

以下所有例子均圍繞功能性組件(components)和鉤子(hooks)展開。

 

React 帶鍵的片段

有時,需要在列表內(nèi)渲染多種組件。如果不需要容器,就可以使用React 片段。示例如下:

 

  1. const pokemons = ['Charizard''Mr. Mime''Jynx'
  2.             pokemons.map(pokemon => ( 
  3.              <> 
  4.                <strong>Name: </strong> 
  5.                <span>{pokemon}</span> 
  6.              </> 
  7.             )) 

上述代碼沒有問題,但React會對鍵進行提示:

 

  1. Warning: Each child in a listshould have a unique "key" prop. 

程序猿一般會認(rèn)為這沒什么大不了,用div替換片段就好啦。

這么做當(dāng)然沒有問題,但如果改可以使用帶鍵的React片段,即使用 改變語法,這樣一切都迎刃而解:

 

  1. pokemons.map(pokemon => ( 
  2.                      <React.Fragmentkey={pokemon}> 
  3.                        <strong>Name: </strong> 
  4.                        <span>{pokemon}</span> 
  5.                      </React.Fragment> 
  6.                    )) 

向setState傳遞函數(shù)

useState和useEffect恐怕是比較常使用的鉤子了。程序員需要向useEffect傳遞依賴項,否則就會出錯或會出現(xiàn)意外結(jié)果。然而,如果依賴項僅僅是和相關(guān) setState連用的狀態(tài),或許就無需對其進行傳遞了。

先來看個不太完美的版本:

 

  1. const [count, setCount] =useState(0) 
  2.           useEffect(() => { 
  3.            const id =setInterval(() => { 
  4.              setCount(count +1); 
  5.            }, 1000); 
  6.           return () =>clearInterval(id); 
  7.           }, [count]); 

更新之后是什么樣呢:

 

  1. const [count, setCount] =useState(0) 
  2.           useEffect(() => { 
  3.            const id =setInterval(() => { 
  4.              setCount(c => c +1); 
  5.            }, 1000); 
  6.            return () =>clearInterval(id); 
  7.           }, []); 

 

用useReducer實現(xiàn)useState

這是筆者在推特上發(fā)現(xiàn)的,盡管沒有實際作用,但可以了解 useReducer的能力。

如果直接從useReducer進行返回操作,那么它將和useState起到幾乎同樣的作用。有人可能會說使用useState沒有必要。那篇推文是這樣講的:

 

這6個React技巧讓你獲得愉悅工作體驗

 

代碼如下,可自行拷貝嘗試:

 

  1. const [name, setName] =useReducer((_, value) => value, 'James');<input value={name} onChange={e =>setName(e.target.value)} /> 

將字符串值作為HTML元素

有時,程序員希望創(chuàng)建一個能夠成為靈活HTML元素的組件?;蛟S讀者見過來自CSS-in-JS庫的as prop,比如emotion。

假設(shè)要創(chuàng)建一個能夠渲染為button或 a 的<Button> 組件,有哪些選擇呢?可以用它提取樣式,創(chuàng)建兩個不同的組件;也可以只創(chuàng)建一個組件,一起使用 React.createElement 和 as prop:

  1. constButton= ({ as ='button', ...props }) => React.createElement(as, props) 
  2.                                                    <Button>A Button</Button> // Renders a button element 
  3.                       <Buttonas="a">A Link</Button> // Renders an anchor element 

 

對于簡單的組件來說,這已經(jīng)很不錯了,但有沒有更好的方法呢?看看這個::

 

  1. constButton= ({ Component ='button', ...props }) => <Component {...props} /> 
  2.                                               <Button>A Button</Button> // Renders a button element 
  3.                     <ButtonComponent="a">A Link</Button> // Renders an anchor element 

沒錯,可以在JSX中把字符串作為組件——保證字符串組件的名稱以大寫字母打頭即可。

 

手動對組件進行重新渲染

你一定有過需要手動對組件進行重新渲染的經(jīng)歷吧?比如,需要重新渲染組件的時候,手頭沒有任何狀態(tài)或可用的物件。

假設(shè)處于某些特殊原因,需要在點擊按鈕時進行此項操作,可以這么做:

 

  1. const [, rerender] =useState()rerender({}) 

代碼中用到了useState,但不需要狀態(tài)本身。需要的只是 setState函數(shù)或rerender 函數(shù),以達(dá)到重新渲染的目的。Bingo!

需要注意的是,每次運行時,都需要傳遞一個新的值,比如一個空白對象或數(shù)組。

 

若無直接可用的prop或狀態(tài)依賴項,可將對象或函數(shù)從組件中移除

這是很常見的錯誤,首來看代碼:

 

  1. constPokemon= ({ type, name }) => { 
  2.           const cardProps = { 
  3.            fire: { primaryColor:'red', secondaryColor:'yellow' }, 
  4.            ice: { primaryColor:'blue', secondaryColor:'white' } 
  5.          } 
  6.           return <Card {...cardProps[type]}>Name: {name}</Card> 
  7.         } 

想法不錯——比使用if/else或 switch語法好多了。但還是有問題。該組件每次都會重新渲染一個新創(chuàng)建的cardProps對象。即使沒有任何改變,對所有依賴組件的重新渲染還是會發(fā)生。

使用useMemo 能夠解決這一問題:

 

  1. constPokemon= ({ type, name }) => { 
  2.           const cardProps =useMemo(() => ({ 
  3.            fire: { primaryColor:'red', secondaryColor:'yellow' }, 
  4.            ice: { primaryColor:'blue', secondaryColor:'white' } 
  5.          }), []) 
  6.           return <Card {...cardProps[type]}>Name: {name}</Card> 
  7.         } 

但這樣做要付出代價。仔細(xì)觀察代碼就不難發(fā)現(xiàn),把cardProps對象放到組件里沒有必要。所以把 useMemo 放上去也沒必要,因為對象在props或狀態(tài)上沒有直接的依賴項。即使來自外部,還是可以使用...cardProps[types]。

 

  1. const cardProps = { 
  2.           fire: { primaryColor:'red', secondaryColor:'yellow' }, 
  3.           ice: { primaryColor:'blue', secondaryColor:'white' } 
  4.         } 
  5.         constPokemon= ({ type, name }) => <Card{...cardProps[type]}>Name: {name}</Card> 

看到了吧,無需任何鉤子。如果不需要,就移除它們——函數(shù)也是同理。

學(xué)無止境,值得探索的東西還很多,這些技巧你學(xué)會了嘛~

責(zé)任編輯:華軒 來源: 今日頭條
相關(guān)推薦

2019-12-25 14:19:21

Python編程語言Java

2021-06-25 10:20:07

Linux技巧命令

2017-09-08 08:43:39

iOS 11SafariPDF

2019-09-10 11:31:16

Python數(shù)據(jù)分析表達(dá)式

2014-08-11 12:54:27

構(gòu)建模塊代碼審查編程

2016-10-09 20:07:43

2021-04-06 11:30:50

疫情IT架構(gòu)CIO

2021-02-16 00:17:39

電腦技巧系統(tǒng)

2025-02-17 08:50:00

CSS代碼JavaScript

2020-03-31 09:47:04

Vue開發(fā)代碼

2022-11-07 16:25:07

JavaScript技巧

2020-05-27 10:38:16

開發(fā)代碼技巧

2013-04-08 10:16:40

產(chǎn)品產(chǎn)品體驗

2020-07-28 09:30:12

開發(fā)技能代碼

2018-05-18 16:36:20

數(shù)據(jù)庫MySQL優(yōu)化技巧

2024-01-26 06:15:44

PythonCPython技巧

2020-11-18 13:54:27

IDEAJava開發(fā)

2016-08-24 22:00:58

CSSWeb設(shè)計

2018-09-30 15:30:44

CPU漲價主機

2019-04-29 08:31:25

PythonPandas數(shù)據(jù)
點贊
收藏

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