【问题标题】:Custom change handlers with inputs inside Formik带有 Formik 内部输入的自定义更改处理程序
【发布时间】:2019-10-27 10:23:05
【问题描述】:

我正在将我使用SUIR 制作的一些表单移植到Formik 实现中。我有需要自定义更改处理程序来执行操作的输入组件。如何将我的更改处理程序传递给 onChange 属性,以便 formik 跟踪这些值?

我尝试过这样的事情,但没有运气。

onChange={e => setFieldValue(dataSchemaName, e)}

在另一篇帖子here中提到。

还提到了here,但我无法让我的自定义更改处理程序很好地与 Formik 挂钩。

我的更改处理程序如下所示

handleSchemaChange = (e, { value }) => {
  this.setState({ dataSchemaName: value }, () => {
     console.log("Chosen dataSchema ---> ", this.state.dataSchemaName);
     //also send a request the selfUri of the selected dataSchema
  });
  const schema = this.state.dataschemas.find(schema => schema.name === value);
if (schema) {
  axios
    .get(schema.selfUri)
    .then(response => {
      console.log(response);
      this.setState({
        fields: response.data.data.fields,
      });
      console.log(this.state.fields);
    })
    .catch(error => console.log(error.response));
  }
};

这是我使用下拉列表的表单字段之一的示例

<Form.Field>
  <label style={{ display: "block" }}>
    Select a Schema
  </label>
  <Dropdown
    id="dataSchemaName"
    multiple={false}
    options={dataschemas.map(schema => {
      return {
        key: schema.id,
        text: schema.name,
        value: schema.name
      };
    })}
    value={dataSchemaName}
    onChange={this.handleSchemaChange}
  />
</Form.Field>

我有一个sandbox 有这个问题

【问题讨论】:

  • 所以你想在特定输入发生变化时采取一些行动,对吧?
  • 我只想像使用普通表单输入组件一样使用更改处理程序
  • 你不能通过 formik 做到这一点。最好不要使用 formik。
  • 我不相信这是完全正确的。

标签: reactjs formik


【解决方案1】:

您可以将setFieldValue 函数传递给您的函数handleSchemaChange,然后在内部使用它。

所以,而不是 onChange={this.handleSchemaChange} 让它 onChange={(e, val) =&gt; this.handleSchemaChange(e, val, setFieldValue)}.

在您的 handleSchemaChange 函数中:

handleSchemaChange = (e, { value }, setFieldValue) => {
    setFieldValue('dataSchemaName', value);
    ... the rest of your implementation
}

这是一个实施了解决方案的沙盒: https://codesandbox.io/s/formik-create-query-schema-uq35f

【讨论】:

  • 非常感谢,这是在文档中可以链接的地方吗?
  • 除了这个 jaredpalmer.com/formik/docs/api/… ,我不这么认为。这里的解决方案:stackoverflow.com/questions/52271766/… 是正确的,但在您的情况下,它需要此调整 onChange={(e, val) =&gt; setFieldValue('dataSchemaName', val.value)} 因为第一个参数是事件对象,第二个参数是从 Semantic-UI Dropdown 组件返回的对象,其中包含您需要设置的值.
猜你喜欢
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 2019-05-31
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多