javascript - 更新子组件内部状态时如何重新渲染子组件
问题描述
我只是在学习反应并尝试创建一个简单的项目,我有一个按钮,当单击它时,它会根据用户年龄对来自 API 的数据进行排序,当我控制台记录状态时,数据可能被排序为我想要的唯一问题是组件在更新状态后不会重新渲染。
如果代码中还有其他错误,也请告诉我,您的帮助非常适合。
const Test = () => {
const [state, setState] = useState([]);
useEffect(() => {
const fetchApi = async () => {
setState(await fetchUsersData())
}
fetchApi()
},[setState])
const info = state.map((data, i) => {
return (<div key={i}>
<p >{data.users}</p>
<p >{data.ages}</p>
</div>)
})
const sortByAge = () => state.sort((a, b) => {
return a.age < b.age ? 1: -1
})
const handleClick = () => {
setState(sortByAge())
}
return (
<div>
<button onClick={handleClick}>Sort by Age</button>
{info}
</div>
);
}
export default Test;
解决方案
您的问题是您在进行排序时正在改变状态。应用排序时尝试做一个浅拷贝:
const sortByAge = () => [...state].sort((a, b) => {
return a.age < b.age ? 1: -1
})
推荐阅读
- perl - 在 5.26 中使用 Perl 对邮件标题行进行 Mime 编码
- sql-server - MS SQL 插入问号而不是非延迟符号
- amazon-web-services - 如何在 Athena 中使用多种文件格式
- three.js - 如何在 Three.js 中克隆包含多个网格的 Collada 对象
- c# - 用于属性表达式的 C# 聚合返回 AmbiguousMatchException
- windows - 批处理脚本在输出 conda 环境后停止
- ios - 自动签名无法解决“项目”目标权利的问题
- unreal-engine4 - 当游戏属性通过网络同步时会复制什么?
- java - 了解部分 log4j2 配置文件
- javascript - 您如何以编程方式在 DataTables 中打开多行