React + Redux:将PureComponent连接到Redux是否可以?

J. *_*ers 9 reactjs react-native redux react-redux react-component

我想知道这是否可以:

import React, { PureComponent } from "react";
import { Text, TouchableOpacity } from "react-native";
import { connect } from "react-redux";
import PropTypes from "prop-types";

class ListItem extends PureComponent {
  render() {
    return (
      <TouchableOpacity>
        <Text style={{ color: "red" }}>Some Text</Text>
        <TouchableOpacity />
      </TouchableOpacity>
    );
  }
}

export default connect()(ListItem);
Run Code Online (Sandbox Code Playgroud)

而且可能会添加mapStateToProps().或者这是反模式?我听说PureComponents会降低性能......

Ale*_*exM 10

实际上connect()function 默认情况下使包装的组件成为纯的(请参阅docs)。也就是说,只有当属性发生变化(状态或自己的道具)时,包装的组件才会被重新渲染。所以从 PureComponent 继承是没有意义的,因为shouldComponentUpdate逻辑已经在由connect().

我听说 PureComponents 会降低性能...

PureComponent 执行的浅层 props 比较是相对廉价的操作。我不认为这会成为一个问题。

  • 你错了,因为 HOC 不比较组件的状态,但 PureComponent 会。因此,如果组件有自己的状态,那么使用 PureComponent 是有意义的。 (2认同)

Syl*_*ain 5

使用 connect 和 PureComponent 没有问题。如果 props 发生变化,PureComponent 会渲染connect()并将 redux 状态映射到 props。请参见redux 团队的这个示例。我已经用 Purecomponent 替换了 TodoList 组件:

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

/*
const TodoList = ({ todos, toggleTodo }) => (
  <ul>
    {todos.map(todo =>
      <Todo
        key={todo.id}
        {...todo}
        onClick={() => toggleTodo(todo.id)}
      />
    )}
  </ul>
)
*/
Run Code Online (Sandbox Code Playgroud)

它的工作原理是一样的。

  • 真的。但是,如果您在 redux 项目中使用“不可变”(我推荐),则出现此类错误的可能性非常低。根据我的经验,这个问题通常是相反的。组件渲染过于频繁,因为 `mapStateToProps` 总是返回新对象。 (3认同)