1 回答
TA贡献1860条经验 获得超8个赞
一旦 React 组件被渲染,就可以假设组件的当前“状态”像快照一样存在。
console.log 中的“myArray”是创建 firePromise 时的“myArray”。所以保留第一个值是正确的。(每次渲染组件时,都会创建一个新的 firePromise。)
有一种方法。第一个是使用 ref,第二个是使用 setState。
第一的
function App() {
const myArray = useRef<Array<number>>([0, 1, 2]);
const sleep = (ms: number) => {
return new Promise((resolve) => setTimeout(resolve, ms));
};
const updateArray = () => {
myArray.current.push(myArray.current.length);
};
const firePromise = () => {
new Promise(async (resolve) => {
const timeStamp = new Date().getTime();
let repeatTime = 0;
while (repeatTime < 12) {
console.log(
"array: ",
myArray.current,
"promiseIdenifier: ",
timeStamp
);
repeatTime += 1;
await sleep(1000);
}
resolve({ timeStamp, myArray: myArray.current });
})
.then((val) => {
console.log("resolved: ", val);
})
.catch((err) => {
console.log("rejected: ", err);
});
};
return (
<div className="App">
<button onClick={firePromise}>new promise</button>
<button onClick={updateArray}>updateArray</button>
</div>
);
}
export default App;
第二
function App() {
const [myArray, setMyArray] = useState([0, 1, 2]);
const sleep = (ms: number) => {
return new Promise((resolve) => setTimeout(resolve, ms));
};
const updateArray = () => {
setMyArray([...myArray, myArray.length]);
};
const firePromise = () => {
new Promise(async (resolve) => {
const timeStamp = new Date().getTime();
let repeatTime = 0;
while (repeatTime < 12) {
setMyArray((prevMyArray) => {
console.log("array: ", prevMyArray, "promiseIdenifier: ", timeStamp);
return prevMyArray;
});
repeatTime += 1;
await sleep(1000);
}
setMyArray((prevMyArray) => {
resolve({ timeStamp, prevMyArray });
return prevMyArray;
});
})
.then((val) => {
console.log("resolved: ", val);
})
.catch((err) => {
console.log("rejected: ", err);
});
};
return (
<div className="App">
<button onClick={firePromise}>new promise</button>
<button onClick={updateArray}>updateArray</button>
</div>
);
}
export default App;
将回调传递给 setState 函数时,当前状态将作为第一个参数传递。这是使用这个的快捷方式。
建议使用当值改变时视图应该改变的值作为状态。更改“myArray”不会影响视图,因此使用 ref 是正确的方法。
添加回答
举报