代码之家  ›  专栏  ›  技术社区  ›  Amol Borkar

React不会删除列表中的旧组件

  •  0
  • Amol Borkar  · 技术社区  · 3 年前

    我正在尝试使用钩子在React中创建一个简单的分页组件。以下是分页器组件的代码:

    import { ChevronLeftIcon, ChevronRightIcon } from "@chakra-ui/icons";
    import { Center, ButtonGroup, Button, IconButton } from "@chakra-ui/react";
    import { useState, useEffect } from "react";
    
    function range(start, end) {
      return Array.apply(0, Array(end)).map((element, index) => index + start);
    }
    
    export default function Paginator({
      curPage,
      pageCnt,
      incPage,
      setPage,
      decPage,
    }) {
      const [offset, setOffset] = useState(5);
    
      if (pageCnt >= 2) {
        return (
          <Center mt="2">
            <ButtonGroup size="sm" variant="outline" isAttached>
              <IconButton
                icon={<ChevronLeftIcon boxSize={5} />}
                onClick={() => {
                  decPage();
                  window.scrollTo(0, 0);
                }}
              />
              {console.log(offset, curPage)}
              {range(offset - 5, offset).map((p, idx) => (
                <Button
                  key={idx}
                  onClick={() => {
                    setPage(p + 1);
                    window.scrollTo(0, 0);
                  }}
                >
                  {p + 1}
                </Button>
              ))}
              <IconButton
                icon={<ChevronRightIcon boxSize={5} />}
                onClick={() => {
                  incPage();
                  if (offset - curPage < 2) setOffset((o) => o + 5);
                  window.scrollTo(0, 0);
                }}
              />
            </ButtonGroup>
          </Center>
        );
      }
    }
    

    最初,我只想显示从1到5的按钮。一旦 curPage 达到5,我想将偏移量移动5,以便按钮更新并显示范围5到10。但是,当偏移量更新5个新按钮添加到列表中时,我看到了5-15个按钮,我做错了什么?请帮忙!

    1 回复  |  直到 3 年前
        1
  •  1
  •   kind user Faly    3 年前

    你的 range 函数有一些缺陷,因为它不返回所提供数字之间的范围,而是返回的元素数量与 end ,起始时间 index 作为的值 start 。你可以使用 Array#from 函数。

    const range = (start, end) => 
       Array.from({ length: end - start }, (_, idx) => start + idx);
       
    console.log(range(5, 10));

    或者使用 lodash 调用了函数 范围 :

    import { range } from 'lodash';
    
    {range(offset - 5, offset) && (...)
    

    https://lodash.com/docs/4.17.15#range