reactjs - 如何将 `final-form-calculate` 与 `final-form-array` 结合起来

标签 reactjs final-form react-final-form-arrays

我有一个使用 react-final-form-array 的表单为了有很多“与会者”。我希望每个 Attendee.Email 输入都进行网络查找,然后根据结果设置 Attendee.FirstName 和 Attendee.Surname。

我不确定这应该如何用 final-form-calculate 表达装饰器。具体来说,我不知道如何引用数组中的单个表单项。

这是我的开始:

const MyForm = props => {

  const calculator = createDecorator(
    {
      field: 'Attendees.Email', // <-- this needs to happen for each Email
      updates: {
        // ... do some lookups and set FirstName and Surname based off database query
        Attendees.FirstName: (email, allValues) =>
          someLookup(email).FirstName
      }
    },

  );

  const submit = values => {
    console.log(values);

  };
  return (<Form onSubmit={submit}
                mutators={{
                  ...arrayMutators,
                }}
                decorators={[calculator]}
                render={({handleSubmit, pristine, invalid, mutators: {push, pop}}) => {
                  return (
                    <form onSubmit={handleSubmit}>
                      <fieldset>
                        <legend>Attendees</legend>
                        <div className="fieldset">

                          <p><Button bsStyle="primary" onClick={() => push('Attendees', undefined)}>
                            Add attendee
                          </Button></p>

                          <FieldArray name="Attendees">
                            {({fields}) =>
                              fields.map((name, index) => (
                                <div key={name}>
                                  <label>Attendee #{index + 1} {index > 0 && <span
                                    onClick={() => {
                                      const attendee = fields.remove(index);
                                    }}
                                    style={{cursor: 'pointer'}}
                                    role="img"
                                    aria-label="delete">❌</span>}</label>
                                  <Field
                                    name={`${name}.Email`}
                                    component={TextField}
                                    label="Email address"
                                    validate={required}
                                  />
                                  <Field
                                    name={`${name}.FirstName`}
                                    component={TextField}
                                    label="First name"
                                    validate={required}
                                  />
                                  <Field
                                    name={`${name}.Surname`}
                                    component={TextField}
                                    label="Surname"
                                    validate={required}

                                  />

                                </div>
                              ))}
                          </FieldArray>
                        </div>
                      </fieldset>

                      <Button type="submit" bsStyle="primary"
                              disabled={invalid}>Next</Button>
                    </form>
                  );
                }}
  />);
};

export default MyForm;

最佳答案

我花了点功夫,但其实很简单 - 来自 the website i noticed they have it listed (but not clearly)

所以对于我的情况,我只是选择了名称并更改了文本的最后部分以反射(reflect)我想要修改的对象属性。

下面,我使用正则表达式匹配一个字段,然后替换名称值的最后部分以匹配不同的字段(存储在 fieldName 中),然后返回一个包含我正在更改的新字段和新值的数组。

{
    field: /fields\[\d+\]\.field\.text/, // when a field matching this pattern changes...
    updates: (value, name, allValues) => {
        console.log('Update called', value, name);
        const fieldName = name.replace('.text', '.name');
        return {
            [fieldName]: value.replace(/\W+/gi, '-').toLowerCase()
        };
    }
}

关于reactjs - 如何将 `final-form-calculate` 与 `final-form-array` 结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49714512/

相关文章:

javascript - 如何修复我的 React 上下文以呈现 useEffect 并重新加载表数据

reactjs - 在带有react-router-v4的 Action 创建器中使用history.push?

javascript - 如何在 React Final Form 之外管理状态?

reactjs - 如果 react 最终表单已触及表单之外的状态,有什么方法可以获取

reactjs - 如何在不重置最终表单值的情况下更改组件状态?

javascript - 尝试根据 FieldArray React JS 内部的条件渲染字段

reactjs - 在react组件中拥有自己的属性可以吗?

javascript - 如何在 ExtReact 中显示菜单时停止圆圈单击按钮;

reactjs - 如何使用 React Final Form Field Array 格式化复选框字段的值?

javascript - react 形式 : How to make input data as list objects with same input name?