1 回答

TA貢獻(xiàn)1886條經(jīng)驗(yàn) 獲得超2個(gè)贊
根據(jù)當(dāng)前狀態(tài)更新?tīng)顟B(tài)時(shí),您應(yīng)該始終使用setState
. 有關(guān)詳細(xì)信息,請(qǐng)參閱為什么 setState 給了我錯(cuò)誤的值。
如果您不使用回調(diào)版本,setState
對(duì)依賴于當(dāng)前狀態(tài)的連續(xù)調(diào)用將相互覆蓋,如果它們被 react 批處理,可能會(huì)導(dǎo)致不正確的狀態(tài)。
function changeData(index, value) {
logData()
setData(current => {
// current is the current state including all previous calls to setState in this batch
const new_data = Array.from(current);
new_data[index] = value;
return new_data;
});
}
更新示例:
function Parent() {
const [data, setData] = React.useState([])
function changeData(index, value) {
logData()
setData(current => {
const new_data = Array.from(current);
new_data[index] = value;
return new_data;
});
}
function logData() {
console.log(data)
}
let children = Array(4).fill(null).map((item, index) => {
return <Child id={index} changeData={changeData} />
})
return (
<div>
{children}
<button onClick={logData}>Log data</button>
</div>
)
}
function Child(props) {
const ref = React.useRef(null)
React.useEffect(() => {
props.changeData(ref.current.id, ref.current.id)
}, [])
function onClickHandler(e) {
let element_id = e.target.id
props.changeData(element_id, element_id)
}
return (
<button ref={ref} id={props.id} onClick={onClickHandler}>Child</button>
)
}
ReactDOM.render(<Parent />, document.getElementById('root'))
<!DOCTYPE html>
<html>
<body>
<head>
<script src="https://unpkg.com/react@^16/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@16.13.0/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/babel-standalone@6.26.0/babel.js"></script>
</head>
<div id="root"></div>
</body>
</html>
編輯useEffect
:我創(chuàng)建了一個(gè)帶有可能解決方案的沙箱,您的孩子不需要:
添加回答
舉報(bào)