javascript - React Pure Component 从子组件传递参数

标签 javascript reactjs

我有一个 TodosList 组件,它呈现 Todo 组件列表。

这是 Todo 组件:

export class Todo extends React.PureComponent {
  render() {
    return (
      <li onClick={this.props.onClick}>
        {this.props.title}
      </li>
    );
  }
}

这是 TodoList 组件:

export class TodoList extends React.PureComponent {
  toggleTodo = id => this.props.toggleTodo(id);

  constructor(props) {
    super(props);
  }

  render() {
    return (
      <ul>
        {this.props.todos.map(todo => (
          <Todo
            key={todo.id}
            {...todo}
            onClick={this.toggleTodo.bind(null, todo.id)}
          />
        ))}
      </ul>
    );
  }
}

代码的问题在于,bind 创建了一个新函数,即使没有任何更改,该函数也会导致纯组件重新渲染。

我该如何解决这个问题?

解决方案可以是这样的:

export class Todo extends React.PureComponent {
  render() {
    return (
      <li onClick={this.props.onClick.bind(null, this.props.id)}>
        {this.props.title}
      </li>
    );
  }
}

但我想知道这是否是一个好的解决方案。

最佳答案

您应该仅将函数的引用传递给项目组件,并在那里调用它。

export class TodoList extends React.PureComponent {
  render() {
   return (
    <ul>
      {this.props.todos.map(todo => (
      <Todo
        key={todo.id}
        {...todo}
        handleClick={this.props.toggleTodo}
      />
    ))}
  </ul>
  );
 }
}

为此,您不需要有状态组件。

const todo = ({id, title, handleClick} => (
     <li onClick={() => handleClick(id)}>
       {title}
     </li>
   );
export default todo

关于javascript - React Pure Component 从子组件传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52690563/

相关文章:

javascript - 拆分 vendor bundle

javascript - 动态生成 jQuery 工具提示不显示

javascript - 向 Chrome 扩展程序授权 YouTube API

javascript - 需要帮助查找未终止的 JSX 内容

reactjs - 无法代理来自本地主机的请求/推送器/身份验证 :3000 to http://localhost:5000 (ECONNREFUSED)

babeljs - 为什么jsx在这段代码中需要三个点?

javascript - 如何将页面状态和CSS保存到服务器? (绘图应用程序)

javascript - 根据不起作用的选项隐藏/显示 DIV

javascript - 如何从异步调用返回响应?

javascript - highcharts-react-官方 React 状态渲染问题