ユーザーがToDoアイテムのリストを並べ替えられるようにしたい。ユーザーがドロップダウンリストから項目を選択すると、それが設定されますsortKey
の新しいバージョンを作成するであろうsetSortedTodos
、とターントリガーでuseEffect
、コールを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
か?
[<>]
か?スタックスニペットは、JSXを含むReactをサポートしています。これを行う方法は次のとおりです。そうすれば、提案されたソリューションに無限ループの問題がないことを人々が確認できます...
todos
の依存関係配列に追加する必要があると考える理由を理解でき、そうしない理由を理解useEffect
できます。:-)
sort
コールバックは次のようにすることができます。return a[sortKey].toLowerCase().localeCompare(b[sortKey].toLowerCase());
これには、環境に適切なロケール情報がある場合にロケール比較を実行できるという利点もあります。必要に応じ