【问题标题】:React - Error: Rendered more hooks than during the previous renderReact - 错误:渲染的钩子比上一次渲染时更多
【发布时间】:2021-02-09 21:26:00
【问题描述】:

为什么我在 React 中会出现上述错误? - 如果我在 Person.js 中取出 'count2' 的 useState,它工作得很好 - 但这肯定会工作吗?

我有两个文件:呈现 Person.js 列表的 Persons.js。 'people' 数组传入

import React, { useEffect, useRef, useContext, useState } from 'react';
import Person from './Person/Person';

const Persons = (props) => {

    const [count, setCount] = useState(0);
    const [people, setPeople] = useState([]);

    useEffect(() => {
        setPeople(props.people);
    },
        []      // this to ensure a one-off!
    ); 

    let increaseMe = () => {
        setCount(count + 1);
    }

    let clickA = (event ) => {
        let newPeople = [...people];
        newPeople.push({ name: 'Tom', age: 16 })
        setPeople(newPeople);
    }

    let list = people.map(p => Person({name: p.name, 'age': p.age}));

    return (
        <React.Fragment>
            <div>Hello Persons - { props.message } </div>
            <button className='btnStyle' onClick={increaseMe}>IncreaseMe</button> { count }
            <button onClick={clickA}>click A</button>
            { list }
        </React.Fragment>
    )
}

export default Persons;
import React, { useState } from 'react';

const Person = props => {

    const [count2, setCount2] = useState(0);

    return (
        <div key={props.name}>
            { props.name } - { props.age} - { count2 }
        </div>
    )
}

export default Person;

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    错误来自这一行:

    let list = people.map(p => Person({name: p.name, 'age': p.age}));
    

    这不是你在 React 中渲染组件的方式,你所做的是调用一个名为 Person 的函数,你想调用 React.createElement 代替(渲染一个函数组件),这只是一个 JSX:

    let list = people.map(p => <Person key={p.id} name={p.name} age={p.age} />);
    

    当然,如果你想调用一个返回 JSX 的函数,你不能在其中使用钩子,因为钩子用于函数组件(阅读关于钩子的规则)。

    【讨论】:

      【解决方案2】:

      试试这个:

      let list = people.map(p => <Person key={p.name} name={p.name} age={p.age} );
      

      而且您的 Person 组件上不需要密钥。

      【讨论】:

      • 谢谢你的帮助——我只能接受一个答案——我明白了
      猜你喜欢
      • 2021-10-12
      • 2020-05-26
      • 2023-02-13
      • 2021-12-01
      • 2020-07-10
      • 2021-05-31
      • 1970-01-01
      • 2019-12-24
      • 2020-11-26
      相关资源
      最近更新 更多