将按钮文本传递给状态,但文本在 React 挂钩中的页面刷新期间恢复
Passed the button text to state, but text reverted back during page refresh in React hooks
我有一个带有两个按钮的记录,点击 Accept
按钮应该将数据发送回服务器并将文本显示到 Save
,之后不应更改文本(应该只更改对于点击的按钮)。
在下面的示例中,它在单击期间更改了文本,这很好,但是在刷新页面时它将文本设置回 Accept
。有人可以告诉我如何解决这个问题吗?
import { useState, useEffect } from "react";
import "./styles.css";
export default function App() {
const [acceptPlayer, setAcceptPlayer] = useState("Accept");
const postData = (e) => {
const text = "Save";
setAcceptPlayer(text);
};
return (
<div className="App">
<div>
<button onClick={postData} value="accept">
{acceptPlayer}
</button>
</div>
</div>
);
}
https://codesandbox.io/s/admiring-austin-1w1g38?file=/src/App.js
当然,它会回到 Accept
,因为 React 只在本地存储状态。因此,每次刷新页面时,它都会返回到 initial state
。
因此,如果您想在组件中获取更新状态,则必须从 useEffect
中的数据库中获取最新数据,并将其设置为状态。
这段代码没有任何问题。这是反应的预期行为。 React 或任何其他框架不会在刷新时保持状态这是 BE 的责任。
解决方法:
当你可以得到 API 在页面上显示数据时,在 API 响应中,你可以 return 以下格式的数据:
{
isAccepted: false,
//...something else
}
当您单击接受按钮并调用 API 时,BE 负责在下次调用 API 时更新 isAccepted 标志。您将收到以下回复:
{
isAccepted: true,
//...something else
}
根据 isAccepted 标志,您可以切换按钮文本。
我有一个带有两个按钮的记录,点击 Accept
按钮应该将数据发送回服务器并将文本显示到 Save
,之后不应更改文本(应该只更改对于点击的按钮)。
在下面的示例中,它在单击期间更改了文本,这很好,但是在刷新页面时它将文本设置回 Accept
。有人可以告诉我如何解决这个问题吗?
import { useState, useEffect } from "react";
import "./styles.css";
export default function App() {
const [acceptPlayer, setAcceptPlayer] = useState("Accept");
const postData = (e) => {
const text = "Save";
setAcceptPlayer(text);
};
return (
<div className="App">
<div>
<button onClick={postData} value="accept">
{acceptPlayer}
</button>
</div>
</div>
);
}
https://codesandbox.io/s/admiring-austin-1w1g38?file=/src/App.js
当然,它会回到 Accept
,因为 React 只在本地存储状态。因此,每次刷新页面时,它都会返回到 initial state
。
因此,如果您想在组件中获取更新状态,则必须从 useEffect
中的数据库中获取最新数据,并将其设置为状态。
这段代码没有任何问题。这是反应的预期行为。 React 或任何其他框架不会在刷新时保持状态这是 BE 的责任。
解决方法: 当你可以得到 API 在页面上显示数据时,在 API 响应中,你可以 return 以下格式的数据:
{
isAccepted: false,
//...something else
}
当您单击接受按钮并调用 API 时,BE 负责在下次调用 API 时更新 isAccepted 标志。您将收到以下回复:
{
isAccepted: true,
//...something else
}
根据 isAccepted 标志,您可以切换按钮文本。