reactjs - useEffect 中的排序方法不会更新我状态下的数组
问题描述
我正在尝试实现一个 Sort 组件,该组件按名称或 ID 对我的项目进行排序。
这是我的代码:
const data = [
{
id: 1,
name: "Gianni",
},
{
id: 2,
name: "Alvaro",
},
{
id: 3,
name: "Zuzzurello",
},
{
id: 4,
name: "Stefanino",
},
{
id: 5,
name: "Bertone",
},
];
function App() {
const [items, setItems] = useState(data);
const [sort, setSort] = useState("");
useEffect(() => {
if (sort === "name") {
const temp = [...items];
temp.sort((a, b) => a.name - b.name);
setItems(temp);
console.log("sort by name!");
} else if (sort === "number") {
const temp = [...items];
temp.sort((a, b) => a.id - b.id);
setItems(temp);
console.log("sort by number!");
}
}, [sort]);
return (
<main>
<form>
<label htmlFor="">sort by</label>
<select name="sort" id="sort" onChange={(e) => setSort(e.target.value)}>
<option value="">do nothing</option>
<option value="name">by name</option>
<option value="number">by number</option>
</select>
</form>
{items.map((item, index) => {
const { id, name } = item;
return (
<article key={index}>
<h2>{name}</h2>
<h4>{id}</h4>
</article>
);
})}
</main>
);
}
选择输入有效:“setSort”在我的状态下发生变化。useEffect 也有效:当排序发生变化时,我会在控制台中收到这些消息。
问题是 useEffect 中的 sort 方法根本不起作用。我的 useEffect 中的 setCollection 不会使用新的排序数组更新状态,也不会触发重新渲染。
当我将“项目”放入依赖项数组时,它会引发一个无限循环。
我没有任何线索。谢谢!
解决方案
我看到的最大问题是你不能通过减去它们来对字符串进行排序:
console.log(
['a', 'd', 'c', 'x', 'b'].sort((a, b) => a - b)
)
你应该改用类似的东西localeCompare
:
console.log(
['a', 'd', 'c', 'x', 'b'].sort((a, b) => a.localeCompare(b))
)
推荐阅读
- python - 将 CSV 文件从 S3 批量加载到 AWS RDS - 使用 python 代码的 MySQL 数据库
- c# - 如何在标有 [BsonExtraElements] 的字典中获取 Decimal 而不是 Decimal128
- java - 使 apache camel 上的 API 为 HTTPS 实现(SSL)的最佳方法是什么?
- google-apps-script - 在云端硬盘的预制文件夹中填充文件
- java - 两个类之间的 java.lang.StackOverflowError
- git - 如何撤消“git add -A”和“git init”,但仍将子文件夹保留在 Git 中?
- javascript - Error: ReferenceError: getUnreadEmails is not defined
- pyspark - 删除具有空值的行
- javascript - 理解 Javascrip 正则表达式 /[a-ce-gi-mo-su-y]/
- mysql - 如何更改 RDS MYSQL DB 上的“被视为字母的字符”列表?