Me gustaría que el usuario pueda ordenar una lista de elementos pendientes. Cuando los usuarios seleccionan un elemento de un menú desplegable, establecerán el sortKeyque creará una nueva versión setSortedTodosy, a su vez, activará useEffecty llamará setSortedTodos.
El siguiente ejemplo funciona exactamente como quiero, sin embargo, eslint me está pidiendo que agregue todosal useEffectconjunto de dependencias, y si lo hago, causa un bucle infinito (como era 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]);
Ejemplo en vivo:
Estoy pensando que tiene que haber una mejor manera de hacer esto que mantenga feliz a Eslint.
eslintlanzando?
[<>]botón de la barra de herramientas)? Los fragmentos de pila admiten React, incluido JSX; He aquí cómo hacer uno . De esa manera, las personas pueden verificar que sus soluciones propuestas no tengan el problema del bucle infinito ...
todosa la matriz de dependencias useEffect, y puede ver por qué no debería hacerlo. :-)
sortdevolución de llamada puede ser justa: loreturn a[sortKey].toLowerCase().localeCompare(b[sortKey].toLowerCase());que también tiene la ventaja de hacer una comparación local si el entorno tiene información local razonable. Si lo desea, también puede lanzarle desestructuración: pastebin.com/7X4M1XTH