Как передать функции компонентам? - PullRequest
0 голосов
/ 06 августа 2020

Я делаю реализацию разбиения на страницы списка с помощью настраиваемой ловушки. Функция handleSetCurrentPage() получает правильный number, она использует setCurrentPage(number). Consolelog setCurrentPage(number) показал undefined. если вы делаете один и тот же код только в одном файле (помещаете все в ListOfItems), он работает нормально.

Hook:

export const usePagination = (users = [], defaultPage = 1, amountPerPage = 10) => {
    const [currentPage, setCurrentPage] = useState(defaultPage);
    const [currentUsers, setCurrentUsers] = useState([]);
    const [amountOfPages, setAmountOfPages] = useState(0);

    useEffect(() => {
        updateUsers();
        updateAmountOfPages();
    }, []);

    const updateUsers = () => {
        const indexOfLastPost = currentPage * amountPerPage;
        const indexOfFirstPost = indexOfLastPost - amountPerPage;
        const updatedUsers = users.slice(indexOfFirstPost, indexOfLastPost);
        setCurrentUsers(updatedUsers);
    };

    const updateAmountOfPages = () => {
        const updatedAmount = Math.ceil(users.length / amountPerPage);
        setAmountOfPages(updatedAmount);
    };

    return {
        setCurrentPage,
        amountOfPages,
        currentUsers,
    };
};

список элементов:

export function ListOfItems() {
    const users = useSelector(state => state);
    const { setCurrentPage, currentUsers, amountOfPages } = usePagination(users);
    let {url} = useRouteMatch();

    let items = currentUsers.map(function (value, index) {
        return (
            <form key={index}>
                <div className="input-group">
                    <div className="input-group-prepend">
                        <Link className="input-group-text" to={`${url}/${index}`}>
                            {value.name}, {index}
                        </Link>
                    </div>
                </div>
            </form>
        )
    });

    return (
        <div>
            {/*<form className="card">*/}
            {/*    <Search setSearch={setSearch} />*/}
            {/*</form>*/}
            <div>{items}</div>
            <div>
                <Pagination amountOfPages={amountOfPages} setCurrentPage={setCurrentPage}/>
            </div>
        </div>
    )
}

компонент разбивки на страницы:

const Pagination = ({amountOfPages, setCurrentPage}) => {
    const [pageNumbers, setPageNumbers] = useState([]);

    useEffect(() => {
        calculatePageNumbers();
    }, [amountOfPages]);

    function calculatePageNumbers() {
        const updatedPageNumbers = [];
        for (let i = 1; i <= amountOfPages; i++) {
            updatedPageNumbers.push(i);
        }
        setPageNumbers(updatedPageNumbers);
    }

    function handleSetCurrentPage(number) {
        console.log(number);
        return console.log(setCurrentPage(number));
    }

    return (
        <nav>
            <ul className="pagination">
                {pageNumbers.map(number => (
                    <li key={number} className="page-item">
                        <button
                            onClick={() => handleSetCurrentPage(number)}
                            type="button"
                            className="page-link"
                        >
                            {number}
                        </button>
                    </li>
                ))}
            </ul>
        </nav>
    );
};

export default Pagination;

1 Ответ

0 голосов
/ 06 августа 2020
 useEffect(() => {
        updateUsers();
        updateAmountOfPages();
    }, [currentPage]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...