【问题标题】:How do I rewrite this using React Hooks?如何使用 React Hooks 重写它?
【发布时间】:2019-08-17 08:48:18
【问题描述】:

你会如何使用 React Hooks 重写它?

class UsersList extends Component {
  componentDidMount() {
    this.props.fetchUsers();
  }

  renderUsers() {
    return this.props.users.map(user => {
      return <li key={user.id}>{user.name}</li>;
    });
  }

  render() {
    return (
      <div>
        Here's a big list of users:
        <ul>{this.renderUsers()}</ul>
      </div>
    );
  }
}

我尝试使用 React Hooks 重写,但由于某种原因,我没有返回任何呈现在屏幕上的用户。

我试过了:

const UsersList = ({ users }) => {
  useEffect(() => {
    fetchUsers();
  }, [users]);

  const renderUsers = () => {
    console.log(users);
    return (
      <ul>
        {users.map(user => (
          <li key={user.id}> {user.name} </li>
        ))}
      </ul>
    );
  };

  return <div> {renderUsers()}</div>;

但我没有在屏幕上呈现任何内容。 请指出我的明显错误是什么?

【问题讨论】:

  • 如果 fetchUsers() 导致 users-prop 更新,那么您可能会出现无限循环。也许效果依赖项应该是 fetchUsers 或空数组而不是用户。在您的类组件中, fetchUsers 也是一个道具。在函数组件中,它的起源是不可见的。
  • 我与用户重新渲染的次数太多,我添加了 fetchUsers 作为依赖项。

标签: reactjs react-hooks


【解决方案1】:

你说得几乎是正确的。简单的经验法则是 useEffect 与空数组 []componentDidMount/componentWillUnmount 相同,因为在空数组中不会发生任何变化,因此该函数只调用一次。此外,您必须将fetchUsers 添加到函数定义的属性列表中才能访问它。

const UsersList = ({ users, fetchUsers }) => {
  useEffect(() => {
    fetchUsers();
  }, []);

  const renderUsers = () => {
    console.log(users);
    return (
      <ul>
        {users.map(user => (
          <li key={user.id}> {user.name} </li>
        ))}
      </ul>
    );
  };

  return <div> {renderUsers()}</div>;
}

【讨论】:

  • 好的,谢谢!这是我一直在寻找的答案。我会投票,但由于我的声誉地位低,我不能投票。
【解决方案2】:

React Hooks 与我们的功能组件相关联。钩子是一个函数,可让您利用诸如状态或生命周期方法之类的反应功能。 您必须在要渲染的功能组件中实现 useEffect() 。获取数据后,您必须更改状态。

const renderUsers = () => {
    const [users,setUsers]=useState([]) // initially set to empty array
    useEffect(()=>{
          const fetchedUsers=fetchUsers()
          if(fetchedUsers){
             setUsers(fetchedUsers)}          
},[]) //[] here means fire this func only once
  //now your state set to fetched data
    return (
      <ul>
        {users.map(user => (
          <li key={user.id}> {user.name} </li>
        ))}
      </ul>
    );
  };

  return <div> {renderUsers()}</div>;
}

【讨论】:

  • 我认为这比必须要复杂的多......还有你为什么要引入useState?上面基于 React 类的组件中没有 useState 或 this.state
  • @Aquasar react 钩子仅在功能组件中使用。使用钩子的重点是能够在功能组件内使用生命周期方法和状态。 react 团队宣布 react 的未来将是 hooks。我建议你要特别注意钩子
  • 好的,但在这种情况下,我不想将用户存储在任何状态,我只想将其呈现到屏幕上。
猜你喜欢
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 2020-02-07
  • 1970-01-01
  • 2023-02-18
  • 2023-02-24
相关资源
最近更新 更多