es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Intentando hacer que los filtros persistan al cambiar de página (lado del servidor)

Estoy llamando a un punto final que filtra los resultados con paginación en un evento onPressEnter que está dentro de la etiqueta Input, pero estoy intentando paginar los resultados filtrados y actualmente estoy obteniendo todos los resultados filtrados. Sin embargo, cuando hago clic en la siguiente página para ver los siguientes resultados filtrados, la tabla muestra otros resultados, porque la paginación también se está llamando en otro punto final que obtiene todos los datos (sin filtros). El código se ve así:

const ParentComponent = () => {
const [values, setValues] = useState([]);
const [pageCount, setPageCount] = useState([]);
const [page, setPage] = useState(1);
const [pageSize, setPageSize] = useState(7);

useEffect(() => {
const getValues = () => {
const limit = pageSize * (page – 1)
setLoading(true);
axios
.get(`http://localhost:3000/api/v1/elements?skip=${limit}&&take=${pageSize}`)
.then((res) => {
console.log(‘firstRender’, res.data.data);
setValues(res.data.data);
setPageCount(res.data.count);
})
.catch(errorHandling)
.finally(() => {
setLoading(false);
});
};
getValues();
}, [page]);
}

const handlePageSize = (value: number) => {
setPageSize(value);
};

const handlePageCount = (value) => {
setPageCount(value);
};

const handleCurrentPage = (value: number) => {
setPage(value);
};

const handleValue = (value: SetStateAction<never[]>) => {
setValues(value);
};

const ChildComponent = (props) => {
const {allthepropsfromtheParentComponent} = props
return (
(this is the column where im searching) const columns = [
{
title: ‘dealership’,
width: 125,
dataIndex: ‘Dealership’,
key: ‘Dealership’,
fixed: ‘left’,
filterDropdown: ({ setSelectedKeys, selectedKeys, confirm,clearFilters }) => {

{
setSelectedKeys(e.target.value ? [e.target.value] : []);
}}
onPressEnter={async () => {
const limit = pageSize * (page – 1)
confirm(
await axios.get(`http://localhost:3000/api/v1/elements?name=${selectedKeys}&&skip=${limit}&&take=${pageSize}`)
.then(res => {
return setSelectedKeys(res.data),
handleValue(res.data.data),
handlePageCount(res.data.count)}).catch(err => console.log(err)))
}}
/>

}
}
return (
<>

{
handlePageSize(pageSize);
const apiURL = `http://localhost:3000/api/v1/elements?skip=${page}&&take=${pageSize}`;
axios.get(apiURL).then((response) => {
console.log(response.data), handleValue(response.data.data), handlePageCount(response.data.count + 1), handleCurrentPage(page);
});
}
}}
size=”middle”
/>

)}

La paginación de todos los elementos se está recuperando correctamente cuando hago clic, pero ahora que intento recuperar los nombres filtrados onPressEnter, puedo obtener todos los valores correspondientes, pero quiero que el filtro persista cuando cambio de página (por ejemplo, si obtengo 10 elementos por página, obtenerlos filtrados en cada clic de página si el filtro está seleccionado), que ahora, cada vez que hago clic en la siguiente página, me trae todos los datos nuevamente. Espero estar explicando bien mi situación.
Cualquier ayuda será muy apreciada.

</never[]>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para hacer que el filtro persista al cambiar de página, debe modificar la función onChange de paginación en el ChildComponent. En lugar de volver a obtener todos los datos, debe obtener los datos filtrados con los parámetros de filtro y valores de paginación seleccionados (página y tamaño de página).

    Puede almacenar los parámetros de filtro en el estado de ParentComponent y pasárselos a ChildComponent como props. Aquí hay un fragmento de código actualizado con las modificaciones:
    “ `
    const ParentComponent = () => {
    const [values, setValues] = useState([]);
    const [pageCount, setPageCount] = useState([]);
    const [page, setPage] = useState(1);
    const [pageSize, setPageSize] = useState(7);
    const [filterParams, setFilterParams] = useState({});

    useEffect(() => {
    const getValues = () => {
    const limit = pageSize * (page – 1);
    setLoading(true);
    const filterString = Object.keys(filterParams)
    .map((key) => ${key}=${filterParams[key]})
    .join(‘&’);
    const apiURL = `http://localhost:3000/api/v1/elements?skip=${limit}&take=${pageSize}&${filterString}`;
    axios
    .get(apiURL)
    .then((res) => {
    console.log(‘firstRender’, res.data.data);
    setValues(res.data.data);
    setPageCount(res.data.count);
    })
    .catch(errorHandling)
    .finally(() => {
    setLoading(false);
    });
    };
    getValues();
    }, [page, filterParams, pageSize]);

    const handleFilterParams = (newParams) => {
    setPage(1); // reset page to the first page when filter params change
    setFilterParams(newParams);
    };

    // otros funciones y código JSX
    };

    const ChildComponent = (props) => {
    const {
    allthepropsfromtheParentComponent,
    filterParams,
    handlePageSize,
    handlePageCount,
    handleCurrentPage,
    handleValue,
    page,
    pageSize,
    pageCount,
    } = props;

    const handleTableChange = (pagination, _, sorter) => {
    const { current, pageSize } = pagination;
    handlePageSize(pageSize);
    handleCurrentPage(current);
    if (sorter?.field) {
    const sortOrder = sorter.order === ‘ascend’ ? ‘asc’ : ‘desc’;
    handleSort(${sorter.field} ${sortOrder});
    }
    };

    const columns = [/* table columns */];

    return (
    <>

    {
    const newParams = { …filterParams, skip: (currentPage – 1) * pageSize, take: pageSize };
    axios
    .get(‘http://localhost:3000/api/v1/elements’, { params: newParams })
    .then((res) => {
    handlePageCount(res.data.count);
    handleCurrentPage(currentPage);
    handleValue(res.data.data);
    })
    .catch((err) => console.log(err));
    },
    }}
    size=”middle”
    onChange={handleTableChange}
    />

    );
    };
    “ `

    En ParentComponent, se agregó una nueva variable de estado filterParams para almacenar los parámetros de filtro. También se modificó la función de devolución de llamada useEffect para obtener los datos utilizando los parámetros de filtro en la cadena de consulta de URL. La función handleFilterParams se pasa a ChildComponent para actualizar los parámetros de filtro cuando se envía la entrada de filtro en la etiqueta Input.

    En ChildComponent, se agregó un parámetro filterParams a la lista de props y se pasó a la función axios.get para obtener datos filtrados. Se modificó la función onChange en el objeto de paginación para usar los parámetros de filtro y los valores de paginación para obtener solo los datos filtrados. También se agregó una nueva función handleTableChange para manejar los cambios en las columnas de la tabla (ordenamiento, etc.) y se agregó al componente Table como la prop onChange.

Comments are closed.