分派 Redux 操作是否被认为是昂贵的?

IT技术 reactjs redux react-redux
2021-05-11 23:23:13

我一直在使用 React - Redux - Typescript 堆栈一段时间,到目前为止我很喜欢它。但是,由于我对 Redux 还很陌生,因此我一直对这个特定主题感到疑惑。分派 Redux 操作(和 thunk)是否被认为是昂贵的操作,应该谨慎使用,还是应该像使用 setState 一样使用它?

假设 Redux 状态有一个管理用户信息的 reducer:

const initialState = {
  firstName: '',
  lastName: ''
}

而要改变这些领域,我们说我们有这样的行为setFirstNamesetLastName等等...只是为了简单起见。

让我们说在视图中我有一个输入元素render()

<input onChange={this.firstNameInputChangeListener} placeholder="First Name"/>

考虑setFirstName已映射到组件:

export default connect(state => state, { setFirstName })(ThisComponent);

每次输入发生变化时调度一个动作是否最佳:

public firstNameInputChangeListener = (event) => {
  this.props.setFirstName(event.target.value);
}

或者最好创建本地组件状态,将状态绑定到更改监听器并仅在提交表单时调度操作:

public state = {
  firstName: this.props.firstName;
}

public firstNameInputChangeListener = (event) => {
  this.setState({ firstName: event.target.value });
}

public submitButtonListener = (event) => {
  this.props.setFirstName(this.state.firstName);
}

你们有什么感想?

1个回答

实际调度一个动作的成本是:

  • 通过每个中间件传递动作
  • 执行 root reducer 函数,如果你正在使用,它可能会被分成几个切片 reducer combineReducers()
  • 调用所有商店订阅回调

通常,中间件和 reducer 逻辑不是瓶颈——它更新 UI 可能很昂贵。使用 React-Redux,每个连接的组件实例都是一个单独的订阅者。如果您有一个包含 10000 个连接 ListItems 的连接列表,那就是 10001 个订阅者。

Redux FAQ 中的条目讨论了应用程序性能和可伸缩性,以及减少订阅者通知的方法

特别是对于表单,应用程序的其余部分不太可能在表单中的每次击键时都需要更新。为此,对调度进行去抖动是非常合理的。我的博客文章实用 Redux,第 7 部分:表单更改处理和数据编辑展示了一个可重用的组件,它可以包装输入或表单以在 UI 中实现快速更新,同时还可以消除 Redux 操作的分派。