【问题标题】:“functionName” is not a function while sending function as parameter将函数作为参数发送时,“functionName”不是函数
【发布时间】:2021-06-04 22:39:14
【问题描述】:

我是 React 和 Typescript 的新手,我有一些包含内容的博客,我正在尝试为其添加分页。

我看了this tutorial 并写了那个组件用于分页:

import React from 'react'



export const Pagination = (totalPagesX:any, paginate :any) => {
    const pageNumbers=[];
    

    const size=Math.ceil(totalPagesX.totalPages);
   
    
for (let index = 1; index <=size; index++) {

    pageNumbers.push(index);
}

    return (
        <nav>
            <ul className='pagination'>
                {pageNumbers.map((number)=>(
                    <li key={number} className='page-item'>
                    <Pagination totalPages={+totalPages} paginate={paginate} />
                            {number}
                        </a>
                    </li>
                ))}
            </ul>
        </nav>
    )
}

现在参数 paginate 是我的 App 类中的一个函数:

export class App extends React.PureComponent<{}, AppState> {


    state: AppState = {

        currentPage: 1,
        totalPages:'10',

    }




    async componentDidMount() {
        this.setState({
            totalPages: await api.getTotalPages(),
        });
                }


      paginate=(pageNumber:number)=>{console.log("number",number)};
     

    render() {
        const { currentPage, totalPages } = this.state;
        return (<main>
            <ThemeProvider>
                <Page />

            </ThemeProvider>
            
                <Pagination totalPages={+totalPages} paginate={this.paginate} />
            </footer>
        </main>)
    }}

但每次我尝试转到下一页时都会收到此错误:

> TypeError: paginate is not a function 
19 | <ul className='pagination'>  
> 20 |{pageNumbers.map((number)=>(21 |<li key={number}
> className='page-item'>
> > 22 |<a className='page-link' href='!#' onClick={(number) => paginate(number)}>
>| ^  23 |{number}24 |</a>   25 | </li>

【问题讨论】:

  • 我使用的是 ":any" 类型,因为如果删除它我会得到另一个错误:" 绑定元素 'paginate' 隐式具有 'any' 类型。
  • 我看到你的代码中有很多错误。如果我为您解决所有这些问题,您将不会学到任何东西。你能再试试教程吗?也许您会自己解决其中的一些问题,然后,其余的问题,我们可以帮助您解决。例如。 (totalPagesX:any, paginate :any) 和 &lt;Pagination totalPages={+totalPages} paginate={this.paginate} /&gt; 和 paginate=(pageNumber:number)=&gt;{console.log("number",number)}; 和 &lt;Pagination totalPages={+totalPages} paginate={this.componentDidMount} /&gt; 是错误的。而且我不明白你为什么在Pagination 组件中调用Pagination 组件?
  • 好的,那我再试一次,谢谢!!
  • 您在 Pagination 组件中使用 。不需要这个。您可以使用 li 标签来管理它。
  • @ajeet-shah,再次感谢您。我修复了您告诉我的所有内容,除了(totalPagesX:any,paginate :any),因为那时我收到错误:“隐式绑定元素'分页'有一个“任何”类型。我仍然有同样的错误。

标签: javascript reactjs typescript pagination


【解决方案1】:

这不是接收道具的正确方式:

export const Pagination = (totalPagesX:any, paginate :any) => {
  return <> ... </>
}

当 props 被传递为:

<Pagination totalPagesX={some_number} paginate={some_variable_or_function} />

正确的做法是:

export const Pagination = (props) => {
  const {totalPagesX, paginate} = props // props destructuring
  return <> ... </>
}

或者

export const Pagination = ({totalPagesX, paginate}) => { // props destructuring
  return <> ... </>
}

要修复与打字稿相关的错误/警告,您可以提供正确的打字或使用any:

例子:

interface IProps {
  totalPagesX: number
  paginate: () => void // function
  // or, the below one, if it accepts some parameters
  paginate: (param1: number, param2: string, param3: number) => void // function
}
export const Pagination = ({totalPagesX, paginate}: IProps) => { // props destructuring
  return <> ... </>
}

【讨论】:

    【解决方案2】:

    所以首先你不能在分页功能组件中使用下面的代码。这在 React 中是不正确的。

    &lt;Pagination totalPages={+totalPages} paginate={this.paginate} /&gt;

    尝试仅将 li 标签用于分页。

    import React from 'react';
    
    const Pagination = ({ postsPerPage, totalPosts, paginate }) => {
      const pageNumbers = [];
    
      for (let i = 1; i <= Math.ceil(totalPosts / postsPerPage); i++) {
        pageNumbers.push(i);
      }
    
      return (
        <nav>
          <ul className='pagination'>
            {pageNumbers.map(number => (
              <li key={number} className='page-item'>
                <a onClick={() => paginate(number)} href='!#' className='page-link'>
                  {number}
                </a>
              </li>
            ))}
          </ul>
        </nav>
      );
    };
    
    export default Pagination;

    同时在您的应用组件中进行以下更改。

    export class App extends React.PureComponent<{}, AppState> {
    
    
        state: AppState = {
    
            currentPage: 1,
            totalPages:'10',
    
        }
    
    
    
    
        async componentDidMount() {
            this.setState({
                totalPages: await api.getTotalPages(),
            });
                    }
    
    
         paginate(pageNumber:number) {
           console.log("number",number)
         };
         
    
        render() {
            const { currentPage, totalPages } = this.state;
            return (<main>
                <ThemeProvider>
                    <Page />
    
                </ThemeProvider>
                
                    <Pagination totalPages={+totalPages} paginate={this.paginate} />
                </footer>
            </main>)
        }}

    请参阅下面的 stackblitz URL 以获得相同的内容。

    React Pagination

    【讨论】:

    • 谢谢你,我确实像你说的那样,但我仍然得到同样的错误。我无法更改:const Pagination = ({ postsPerPage, totalPosts, paginate }) ,因为我收到下一个错误:绑定元素“分页”隐含地具有“任何”类型
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 2021-07-07
    • 2015-03-31
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    相关资源
    最近更新 更多