redux-form 的动态表单名称

Dynamic Form Name for redux-form

有什么方法可以为 redux-form 设置动态表单名称吗?

reduxForm({
  form: `${dynamicFormNameHere}`,
})(Component)

Note: Container = Smart Component, Component = Dumb Component

目前我有一个容器(例如 FilterContainer)用字段包装一个组件,我在多个组件中使用该容器。示例:

// UserComponent.jsx
...
render() {
  ...
  <FilterContainer dynamicName="UserFilterForm" { ... } />
}

// ProductComponent.jsx
...
render() {
  ...
  <FilterContainer dynamicName="ProductFilterForm" { ... } />
}

和里面FilterContainer

mapStateToProps() { ... }
mapDispatchToProps() { ... }

let FilterContainer = connect(
  mapStateToProps,
  mapDispatchToProps,
)(reduxForm({
  form: `${dynamicName from props}`
}}(FilterComponent))

dynamicName from props是我想要达到的。

为了实现这一点,您需要引入一个包装 reduxForm 高阶组件 (HOC) 的新组件。类似于:

class DynamicFilterComponent extends React.Component {
  componentWillMount() {
    this.Filter = reduxForm({
      form: this.props.dynamicName
    })(FilterComponent)
  }

  render() {
    const Filter = this.Filter
    return <Filter {...this.props} />
  }
}

然后将其包装在 connect:

mapStateToProps() { ... }
mapDispatchToProps() { ... }

let FilterContainer = connect(
  mapStateToProps,
  mapDispatchToProps
)(DynamicFilterComponent)

注意: 在处理 HOC 时,动态创建它们时必须小心。我在 componentWillMount 中创建了 reduxForm HOC,因此它是用于每个渲染调用的同一个实例。 This is important for React's diffing algorithm.