寫react也有一段時間了,以前是vue,去年轉成react,剛開始確實有點不習慣,經歷了一些項目的錘鍊,如今開始慢慢喜歡上了react。同時,也在不斷的實踐中,開始總結一些好的方法,固然是我的認爲的一些好習慣,每一個人都有每一個人的見解,歡迎交流。vue
若是能夠的話,儘量使用function組件,減小使用class組件,加上如今hook的大流行,基本上大部分場景均可以使用function搞定,忘記class的生命週期,constructor吧。
好比之前都是這樣寫
react
而如今,你能夠這樣寫
redux
是否是很是簡潔明瞭,寫更少的代碼,完成相同的事情。ide
這樣能夠增長代碼可讀性,也方便在debug的時候排查錯誤。spa
// bad case export default () => <div>...</div> // good case export default function User() { return <div>...</div> }
若是你的function組件須要用到一些好比處理數據、日期的方法,請將其放到function組件外面,一方面保持function的簡潔,一方面能夠便於在別的地方重用這些方法。固然這些方法也能夠統一放到utils裏面去,決定權在你。debug
// bad case function Calendar({ date }) { function parseDate(date) { ... } return <div>Today is {parseDate(date)}</div> } // good case function parseDate(date) { ... } function Calendar({ date }) { return <div>Today is {parseDate(date)}</div> }
好比須要展現一我的的興趣愛好列表,並進行相關操做等code
// bad case function Filters({ onFilterClick }) { return ( <> <ul> <li> <div onClick={() => onFilterClick('travel')}>旅遊</div> </li> <li> <div onClick={() => onFilterClick('music')}> 聽音樂 </div> </li> <li> <div onClick={() => onFilterClick('movies')}>看電影</div> </li> </ul> </> ) } // good case const List = [ { identifier: 'travel', name: '旅遊', }, { identifier: 'music', name: '聽音樂', }, { identifier: 'movies', name: '看電影', } ] function Filters({ onFilterClick }) { return ( <> <ul> {List.map(item => ( <li> <div onClick={() => onFilterClick(item.identifier)}> {genre.name} </div> </li> ))} </ul> </> ) }
儘量保持單個組件代碼行數控制在必定範圍內,單個組件完成單個組件的任務,不要柔和在一塊兒,寫一個幾千行的組件,固然這是我的看法,這個仁者見仁,最好不要太多,太多的話說明拆分粒度不夠,也不方便別人code review代碼。對象
// bad case function Input(props) { return <input value={props.value} onChange={props.onChange} /> } // good case function Input({value,onChange}) { return <input value={value} onChange={onChange} /> }
// bad case <User name={user.name} email={user.email} age={user.age} sex={user.sex} phone={user.phone} /> // good case <User user={user} />
// bad case isSubscribed ? ( <Comp1 /> ) : isRegistered ? ( <Comp2 /> ) : ( <Comp3 /> ) // good case function Login({ subscribed, registered }) { if (subscribed) { return <Comp1 /> } if (registered) { return <Comp2 /> } return <Comp3 /> } function Component() { return ( <Login subscribed={subscribed} registered={registered} /> ) }
在function中須要管理較多的state的時候,能夠考慮使用useReducer,相似redux進行統一管理。blog
// bad case function Component() { conse [name,setName]=useState('') const [phone, setPhone] = useState('') const [email, setEmail] = useState('') const [error, setError] = useSatte(null) return ( ... ) } // good case const initialState = { name:'', phone: '', email: '', error: null } const reducer = (state, action) => { switch (action.type) { ... default: return state } } function Component() { const [state, dispatch] = useReducer(reducer, initialState) return ( ... ) }
暫時先總結了這部分,固然一些常見的習慣沒有寫,在掘金許多大佬已經總結過了,從此須要在不斷的實踐中總結提高。生命週期