繁体   English   中英

如何使用 redux-form 在不同组件(向上一个组件)中显示来自 FieldArray 的字段

[英]How to display fields from FieldArray in a different component (one component up) with redux-form

我使用redux-form中的<FieldArray> (稍旧的版本,react 16.3.0 和 redux-form 7.2.1),如果我像在文档中那样使用它,它就可以工作。 但我希望按钮显示在一个组件中,而字段显示在不同的组件中:

<App>
    <Cmp1/>
    <Cmp2/>
    // this is where I want the fields
</App>

按钮应在<Cmp1/>中,而实际字段应显示在<App/>中。

<App/>

class App extends React.Component{
  constructor(props){
    this.state = {
      fields: []
    }
  } 
 
  onFieldArrayChange(field){
    const {fields} = this.state;
    const newFields = fields.push(field);
    this.setState({...this.state, fields: newFields});
  }

  render(){
     return (
       <div>
           My App 
           <div>{this.state.fields}</div>
           <Cmp1 onFieldArrayChange={this.onFieldArrayChange.bind(this)}
      </div>
     )

  }
}

我尝试了以下<Cmp1/>

class Cmp1 extends React.Component{
  renderMyFieldArray({ fields, meta: { error, submitFailed } }){
    return(
      <button type="button" onClick={() => this.props.onFieldArrayChange(<MyField
                      key={fields.length}
                      name={`myName[${fields.length}]`}
                      index={fields.length})
       >Add Field</button>
    ) 
  }
  
  render(){
    return(
      <FieldArray name="myName" component={this.renderMyFieldArray.bind(this} /> 
    )
  }
}

这行得通,但是,输入真的很慢。 当我尝试输入一个字符串时,它会在每个字母后切断,我必须再次单击该字段。

我还尝试在<Cmp1/>中像这样传递字段:

<button type="button" onClick={() => this.props.onFieldArrayChange(fields)}>
     Add Filter
</button>

<App/>中,我将 state 设置为以下字段:

onFieldArrayChange(field){
  const {fields} = this.state;
  const newFields = fields.push({});
  this.setState({...this.state, fields: newFields});
}

然后在像这样的字段上渲染 function I map:

{this.state.fields.map((name, index)=>{
    return (
        <MyField
           key={index}
           name={name}
           index={index}
        />
    );
})}

在这种情况下,第一个字段不会显示。 我必须单击两次才能显示 1 个字段。

我如何实现这一目标?

我真的找不到解决方案,但我以不同的方式解决了它。

我将<FieldArray name="myName" component={this.myRenderFunc.bind(this)} />放入带有 myRenderFunc 的<App/>中:

myRenderFunc({ fields, meta: { error, submitFailed } }) {
        const handleClick = () => {
            fields.push({});
            this.setState({...this.state, fields});
        }

        return (
            <button type="button" onClick={handleClick.bind(this)}>
                Add Filter
            </button>
        );
    }

我将字段保存在 state 中,然后将它们传递到我的组件中:

<Comp1 fields={this.state.fields}/>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM