reactjs - React:如何使用功能性 usestate/useEffect 复制特定的组件类 setstate 回调示例?
问题描述
我正在尝试将带有 this.setstate 回调的简单 React 组件转换为带有 useState/useEffect 的功能组件,但我无法使用后者重现相同的功能。
我正在使用一个简单的警报/通知系统示例来在超时后附加和删除警报。沙箱在这里:
https://codesandbox.io/s/class-and-function-callback-comparison-54tus?file=/src/index.js
比较的相关代码:
const NoticesWithFunctionCallback = () => {
const [state, setState] = useState({
alerts: [],
show: false
});
const addNotice = (e) => {
setState({
alerts: [...state.alerts, ""]
});
};
useEffect(() => {
(async () => {
await timeout(3000);
console.log("timeout occurred");
const newAlerts = tail([...state.alerts]);
setState({
alerts: newAlerts
});
})();
}, [state.alerts]);
return (
<div className="App">
<h3>
Notices using function component with UseState and UseEffect callback
</h3>
<Generator addNotice={addNotice} />
<Container>
{state.alerts.map((item, index) => (
<Alert>some alert here</Alert>
))}
</Container>
</div>
);
};
class NoticesWithClassCallback extends React.Component {
state = {
alerts: [],
show: false
};
addNotice = (e) => {
this.setState(
{
alerts: [...this.state.alerts, ""]
},
async () => {
await timeout(3000);
console.log("timeout occurred");
const newAlerts = tail([...this.state.alerts]);
this.setState({
alerts: newAlerts
});
}
);
};
render() {
return (
<div className="App">
<h3>Notices using class component and setState callback</h3>
<Generator addNotice={this.addNotice} />
<Container>
{this.state.alerts.map((item, index) => (
<Alert>some alert here</Alert>
))}
</Container>
</div>
);
}
}
我希望就如何使用 usestate/useeffect 将功能正确的类组件 setstate 回调组件替换为功能组件提出建议。
欢迎提出任何建议。
解决方案
这里不需要 useEffect 。每次更改警报数组时都会触发 useEffect :通过向其中添加项目以及删除。它也在初始化后立即触发,因此事情变得一团糟。相反,您应该使用前一个修改 addNotice 函数并更新状态,如下所示:
const NoticesWithFunctionCallback = () => {
const [state, setState] = useState({
alerts: [],
show: false
});
const addNotice = (e) => {
setState({
...state,
alerts: [...state.alerts, '']
});
(async () => {
await timeout(3000);
setState(prevState => {
return {
...prevState,
alerts: [...tail([...prevState.alerts])]
}
});
})()
};
return (
<div className="App">
<h3>
Notices using function component with UseState and UseEffect callback
</h3>
<p>I want this to replicate the class component but its broken...</p>
<Generator addNotice={addNotice} />
<Container>
{state.alerts.map((item, index) => (
<Alert key={index}>Alert</Alert>
))}
</Container>
</div>
);
};
推荐阅读
- blazor - 更新引导工具提示的 Blazor 问题
- node.js - Discord.js — 如何读取语音频道中的所有用户并向每个用户发送包含随机角色的私人消息
- jenkins - 客户端错误:找到 HTTP 302,Jenkins 连接到 Gitlab
- reactjs - 通用组件中的“A可分配给B类型的约束,但B可以用不同的子类型实例化”
- android - 约束布局高度占用可用空间
- python - AttributeError:“DataFrame”对象没有属性“列”
- php - Composer 自动加载器似乎没有正确包含
- android - 在 PlayStore 中不使用 WiFi 下载和安装的应用程序 (APK) 的最大大小是多少?
- sql - 我如何选择每个医生有多少病人?
- javascript - 我可以让 Vue.js 跨站点保持活跃吗?