我是新手React
,我创建了一个最小的测试应用程序来说明这个scope
问题。
import React, { useState, useEffect } from 'react';
import logo from './logo.svg';
import './App.css';
function useCounter(topic, defaultMsg) {
const [message, setMessage] = useState(defaultMsg);
const increment=() =>{
console.log("increment from " + message);
setMessage(message+1);
}
return [message, increment];
}
export default function App() {
const [counter, incrementCounter] = useCounter("anyData", 0);
return (
<div>
<p>you clicked: {counter} times</p>
<button
onClick={() => {
console.log("sending ");
incrementCounter(counter); //works
incrementCounter(counter); //doesn't work because using the old scope
}}
>
Click me
</button>
</div>
);
}
输出
App.js:10 increment from 0
App.js:10 increment from 0 //should be 1
App.js:27 sending
App.js:10 increment from 1
App.js:10 increment from 1 //should be 2
如果按下按钮,则incrementCounter
调用两次。预期的行为:每次单击都会将计数器增加 2。但是,这并不是因为useCounter
钩子似乎使用了 message 的旧值。所以每次点击都会使计数器增加 1。我知道为什么这不起作用,我不知道如何解决这个问题。
你会如何解决这个问题?