Eu gostaria que o usuário pudesse classificar uma lista de itens de tarefas. Quando os usuários selecionam um item em uma lista suspensa, ele define o sortKey
que criará uma nova versão do setSortedTodos
e acionará a useEffect
chamada e setSortedTodos
.
O exemplo abaixo funciona exatamente como eu quero, no entanto, o eslint está me pedindo para adicionar todos
à useEffect
matriz de dependência e, se o fizer, causa um loop infinito (como seria de esperar).
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]);
Exemplo ao vivo:
Eu estou pensando que tem que haver uma maneira melhor de fazer isso que mantém o sorriso feliz.
eslint
lançando?
[<>]
botão da barra de ferramentas)? Os snippets de pilha suportam React, incluindo JSX; aqui está como fazer um . Dessa forma, as pessoas podem verificar se as suas soluções propostas não têm o problema de loop infinito ...
todos
à matriz de dependência useEffect
e ver por que não deveria. :-)
sort
retorno de chamada pode ser justo: oreturn a[sortKey].toLowerCase().localeCompare(b[sortKey].toLowerCase());
que também tem a vantagem de comparar o código de idioma se o ambiente tiver informações razoáveis de código de idioma. Se você preferir, também pode desestruturar: pastebin.com/7X4M1XTH