我希望用户能够对待办事项列表进行排序。当用户从下拉列表中选择一项时,它将设置,sortKey
这将创建的新版本setSortedTodos
,并依次触发useEffect
and调用setSortedTodos
。
下面的示例完全按照我想要的方式工作,但是eslint提示我将其添加todos
到useEffect
依赖项数组,如果执行此操作,则会导致无限循环(正如您期望的那样)。
const [todos, setTodos] = useState([]);
const [sortKey, setSortKey] = useState('title');
const setSortedTodos = useCallback((data) => {
const cloned = data.slice(0);
const sorted = cloned.sort((a, b) => {
const v1 = a[sortKey].toLowerCase();
const v2 = b[sortKey].toLowerCase();
if (v1 < v2) {
return -1;
}
if (v1 > v2) {
return 1;
}
return 0;
});
setTodos(sorted);
}, [sortKey]);
useEffect(() => {
setSortedTodos(todos);
}, [setSortedTodos]);
现场示例:
我认为必须有一种更好的方法来使eslint感到高兴。
eslint
抛出什么错误?
您能否使用Stack Snippets(工具栏按钮)更新问题以提供可运行的最小重现性示例
—
TJ Crowder
[<>]
?堆栈片段支持React,包括JSX;这是一种方法。这样,人们可以检查他们提出的解决方案是否没有无限循环问题……
这是一个非常有趣的方法,一个非常有趣的问题。如您所说,您可以理解为什么ESLint认为您需要添加
—
TJ Crowder
todos
到上的依赖项数组useEffect
,并且可以了解为什么不应该这样做。:-)
我为您添加了实时示例。真的很想看到这个答案。
—
TJ Crowder
sort
回调可以是:return a[sortKey].toLowerCase().localeCompare(b[sortKey].toLowerCase());
如果环境具有合理的语言环境信息,则它还具有进行语言环境比较的优势。如果您愿意,也可以对其进行破坏性处理:pastebin.com/7X4M1XTH