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 sortKey
que creará una nueva versión setSortedTodos
y, a su vez, activará useEffect
y llamará setSortedTodos
.
El siguiente ejemplo funciona exactamente como quiero, sin embargo, eslint me está pidiendo que agregue todos
al useEffect
conjunto 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.
eslint
lanzando?
[<>]
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 ...
todos
a la matriz de dependencias useEffect
, y puede ver por qué no debería hacerlo. :-)
sort
devolució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