2

我有一个项目,我使用 Formik 和 react-codemirror2,我想控制 Formik 中的 onChange,但 codemirror2 中的 onChange 没有事件......而且我不知道如何使用......让我更好地解释一下:我有一个formink:

<Formik
   enableReinitialize
   onSubmit={values => 
       {this.submitFormDefinition(values)}}
       initialValues={this.state}
 >
  {({ handleSubmit }) => (
    <div>
      <Form
         onSubmit={handleSubmit}
         autoComplete="off"
         onChange={event => {
            this.handleChange(event)
          }}
      >
          <Field
            component={CustomInputComponent}
                    name="name"
                    id="id"
                    multiline
          />

        </Form>
    </div>
   )}

我有我的函数handleChange:

handleChange = event => {console.log('change') ....}

其中 CustomInputComponent 是我的 codemirror2 组件:

  const CustomInputComponent = ({ field, form, ...props }) => {
  return (
    <CodeMirror
      id={props.id}
      name={props.name}
      value={this.state.value}
      options={{
        mode: 'javascript',
        theme: 'default',
        lineNumbers: true,
      }}
      {...props}
      onBeforeChange={(editor, data, value) => {
        console.log({ value })
        this.setState({ jsonSchema: value })
      }}
      onChange={(editor, data, value) => {
        ?????????????
      }}
    />
  )
}

如果我使用另一个组件作为来自 Materia-UI 的 textField 它可以工作,我不需要在我的 CustomInputComponent 上调用 onChange ,即由 formink 直接调用......因为 textField 的 onChange 也有作为参数事件......但是作为您可以在代码中看到 codeMirror 的 onChange 没有事件...

我需要调用我的handleChange而不是codeMirror的onChange ...我试图做这样的事情:

<CodeMirror
    onChange=form.handleChange

或使用:

<CodeMirror
     onKeyUp={form.handleChange}

或者:

<CodeMirror
     onKeyUp={(editor, event) => {
      form.handleChange(event)
      }}

但没有任何工作我的函数handleChange永远不会调用如何将react-codeMirror2与Formik一起使用?有可能吗?我怎样才能接收到Formink的onChange??????

4

1 回答 1

4

Formik 的handleChange方法需要一个 HTMLInput 更改事件,它会从输入中获取更新的值。不幸的是,如果您使用 CodeMirror,您将无法获得这种便利。但是,CodeMirror 提供了组件 onBeforeChange 的值,Formik 提供了一种setFieldValue方法,可以让您强制将值设置为状态。所以你可以这样做:

<Formik {...whateverPropsYouSet}>
  (formikProps) => (
    <CodeMirror
      value={formikProps.values.yourDataField}
      onBeforeChange={(_editor, _data, value) => {
        formikProps.setFieldValue('yourDataField', value);
      }
    />
  )
</Formik>
于 2019-09-30T18:57:24.983 回答