useState 使用很簡單,可是爲了不過多的 re-render, 儘量的少的定義 useState. 在開發的時候,能使用 useRef 代替的儘可能使用 useRef 代替。因此規則是:react
const page = () => {
// 假如咱們的頁面裏面有不少的 select
const [selectList1, setSelectList1] = useState([])
const [selectList2, setSelectList2] = useState([])
const [selectList3, setSelectList3] = useState([])
const getSelectData = async () => {
const res = awiat request({
url: 'your_path',
options: {
methods: 'get',
params: {count, pageSize: count}
}
})
setSelectList1(res.result.data1) // re-render 1
setSelectList2(res.result.data2) // re-render 2
setSelectList3(res.result.data3) // re-render 3
}
useEffect(() => {
getSelectData()
}. [])
return (
<div> {selectList1.map((item) => { return item.name})} {selectList2.map((item) => { return item.title})} {selectList3.map((item) => { return item.age})} </div>
)
}
複製代碼
不要定義過多的 stateapi
state 是在試圖展現的更新用的,有些不須要到試圖的,放在內存裏面就能夠了,推薦使用 useRef 保存服務器
異步的 setState 的問題,使用異步函數來解決markdown
const page = () => {
const [count, setCount] = useState<number>(1)
return (
<div> <button onClick={async () => { await setCount(count + 1); const res = awiat request({ url: 'your_path', options: { methods: 'get', params: {count, pageSize: count} } }) // other }}>+1</button> </div>
)
}
複製代碼
全部說 async/await 可能更加般配歐dom
import React from 'react'
const TestClone = (props) => {
const [visiable, setVisiable] = react.useState<boolean>(false);
const {trigger, children} = props;
return (
<div> {visiable ? <div> {children} </div> : null} {React.cloneElement(trigger, {trigger.props, onClick: () => { setVisiable(!visiable) })} </div>
)
}
export default TestClone;
複製代碼
說明:異步
這樣作的好處,一個節點暴露給外部,狀態在內部維護。async
總結:cloneElement 是一個很靈活的 API, 得益於第二參數能夠用來組合不一樣的 props。生成一個新的節點。若是你須要對當前的節點 props 進行增刪改查操做。使用 cloneElement 是一個很不錯的選擇。函數
場景:咱們以偶一個上傳組件的封,在上傳以前,須要獲取 token,其實咱們並不關心 token, 只是關心上傳以後,服務器返回的數據,這些數據也不須要須要響應到頁面。因此可能並不須要使用 useState 定義響應數據url
useImperativeHandle 鉤子函數,須要與 React.forward 來進行配合使用。useImperativeHandle 鉤子函數接受兩個參數,第一個就是傳入子組件的 ref, 第二參數是 函數,此函數返回的是咱們能在父組件中訪問的數據。spa
使用:
import React, {useState, useImperativeHandle } from 'react';
const ChildComponent = React.forwardRef((props, ref) => {
const [data1, setData1] = useState(1)
const onClick = () => {
// your code
}
useImperativeHandle(ref, () => ({
data: data1,
dom1: ref.current,
event1: onClick
}))
return (
<div ref={ref} onClick={onClick}> react- component - children- data - get methods </div>
)
})
複製代碼
方便的從組件中拿到,咱們想要的數據,而不須要定於多餘的 state, setState。
其實若是咱們想讓一個頁面刷新,其實就是在 useEffect 中只執行一次的,要它強制更新一次。