Просмотр исходного кода

Fix minor sorting bug and add debounce custom hook for filtering the items

paging-sorting-filtering
mladen.dubovac 4 лет назад
Родитель
Сommit
5addfe3489

+ 26
- 17
src/components/MUI/Examples/PagingSortingFilteringExample.js Просмотреть файл

import React, { useEffect } from 'react';
import React, { useEffect, useState } from 'react';
import { import {
Paper, Paper,
Box, Box,
} from '@mui/material'; } from '@mui/material';
// import { useTranslation } from 'react-i18next'; // import { useTranslation } from 'react-i18next';
import { useDispatch, useSelector, batch } from 'react-redux'; import { useDispatch, useSelector, batch } from 'react-redux';
import useDebounce from '../../../hooks/useDebounceHook';
import { import {
itemsSelector, itemsSelector,
pageSelector, pageSelector,
itemsPerPageSelector, itemsPerPageSelector,
countSelector, countSelector,
filterSelector,
sortSelector, sortSelector,
} from '../../../store/selectors/randomDataSelectors'; } from '../../../store/selectors/randomDataSelectors';
import { import {
} from '../../../store/actions/randomData/randomDataActions'; } from '../../../store/actions/randomData/randomDataActions';


const PagingSortingFilteringExample = () => { const PagingSortingFilteringExample = () => {
const [filterText, setFilterText] = useState('');

const dispatch = useDispatch(); const dispatch = useDispatch();
// const { t } = useTranslation(); // const { t } = useTranslation();
const items = useSelector(itemsSelector); const items = useSelector(itemsSelector);
const currentPage = useSelector(pageSelector); const currentPage = useSelector(pageSelector);
const itemsPerPage = useSelector(itemsPerPageSelector); const itemsPerPage = useSelector(itemsPerPageSelector);
const totalCount = useSelector(countSelector); const totalCount = useSelector(countSelector);
const filter = useSelector(filterSelector);
const sort = useSelector(sortSelector) || 'name-asc'; const sort = useSelector(sortSelector) || 'name-asc';


// Use debounce to prevent too many rerenders
const debouncedFilterText = useDebounce(filterText, 500);

useEffect(() => { useEffect(() => {
dispatch(loadData(30)); dispatch(loadData(30));
dispatch(updateSort(sort)); dispatch(updateSort(sort));
}, []); }, []);


useEffect(() => {
batch(() => {
dispatch(updateFilter(filterText));
currentPage > 0 && dispatch(updatePage(0));
});
}, [debouncedFilterText]);

const handleFilterTextChange = (event) => {
const filterText = event.target.value;
setFilterText(filterText);
};

const handleSortChange = (event) => {
const sort = event.target.value;
dispatch(updateSort(sort));
};

const handlePageChange = (event, newPage) => { const handlePageChange = (event, newPage) => {
dispatch(updatePage(newPage)); dispatch(updatePage(newPage));
}; };
}); });
}; };


const handleFilterChange = (event) => {
const filter = event.target.value;
batch(() => {
dispatch(updateFilter(filter));
currentPage > 0 && dispatch(updatePage(0));
});
};

const handleSortChange = (event) => {
const sort = event.target.value;
dispatch(updateSort(sort));
};


return ( return (
<Paper <Paper
variant="outlined" variant="outlined"
label="Filter" label="Filter"
placeholder="Filter" placeholder="Filter"
value={filter}
onChange={handleFilterChange}
value={filterText}
onChange={handleFilterTextChange}
/> />
</Box> </Box>
</Box> </Box>

+ 17
- 0
src/hooks/useDebounceHook.js Просмотреть файл

import { useEffect, useState } from 'react';

const useDebounce = (value, delay) => {
const [debouncedValue, setDebouncedValue] = useState(value);

useEffect(() => {
const timer = setTimeout(() => setDebouncedValue(value), delay || 500);

return () => {
clearTimeout(timer);
};
}, [value, delay]);

return debouncedValue;
};

export default useDebounce;

+ 1
- 2
src/store/reducers/randomData/randomDataReducer.js Просмотреть файл

if (b[field] > a[field]) { if (b[field] > a[field]) {
return sortDirection * -1; return sortDirection * -1;
} }
return 0;
}); });


const items = state.items.length ? sorted : state.items;
const filteredItems = state.filteredItems.length const filteredItems = state.filteredItems.length
? sorted ? sorted
: state.filteredItems; : state.filteredItems;
return { return {
...state, ...state,
sort, sort,
items,
filteredItems, filteredItems,
}; };
} }

Загрузка…
Отмена
Сохранить