如何使用formik react js在handlesubmit函数中接收选择值?

Posted

技术标签:

【中文标题】如何使用formik react js在handlesubmit函数中接收选择值?【英文标题】:How to receive select value in handlesubmit function with formik react js? 【发布时间】:2018-10-24 21:59:29 【问题描述】:

我正在使用 formik 插件 plugin link 在 reactjs 中开发一个表单。当我提交表单时,我得到了文本字段值,但下拉值是空的......

这是我的下拉选择

<div className="form-group">                  
                <Field component="select" id="category" name="category" value=this.state.value className="form-control" onChange= this.handleChange >
                   <option value="lokaler">Lokaler</option>
                   <option value="jobb">Jobb</option>
                   <option value="saker-ting">Saker & ting</option>
                   <option value="evenemang">Evenemang</option>
                </Field>
                  </div>

处理提交功能

export default withFormik(
  enableReinitialize: true,
  mapPropsToValues( category ) 
    return       
      category: category || ''
    
  ,
    handleSubmit(values,  setStatus, setErrors )
      console.log("data is this: "); 
      console.log(values); //here i am getting all form fields values except select value returning empty value
      console.log("category: "+values.category);// here i always get empty value but not getting selected value

      

我在句柄提交函数中获取所有文本字段值,但我无法获取下拉选择值....请告诉我如何在句柄提交函数中获取下拉选择值?

【问题讨论】:

【参考方案1】:

在使用 Formik 时处理选择组件的一种更强大的方法是同时使用 Jed Watsons react-select 组件。两者可以很好地协同工作,并抽象出您通常需要实现的大量样板,以使组件与 Formik 无缝工作。

我从Jared Palmer's react-select / Formik example 在代码和框上分叉了一个简单的示例,并对其进行了调整以反映您上面的代码。

import "./formik-demo.css";
import React from "react";
import  render  from "react-dom";
import  withFormik  from "formik";
import Select from "react-select";
import "react-select/dist/react-select.css";

const options = [
   value: "lokaler", label: "Lokaler" ,
   value: "jobb", label: "Jobb" ,
   value: "saker-ting", label: "Saker & ting" ,
   value: "evenemang", label: "Evenemang" 
];

const MyForm = props => 
  const 
    values,
    handleChange,
    handleBlur,
    handleSubmit,
    setFieldValue
   = props;
  return (
    <form onSubmit=handleSubmit>
      <label htmlFor="myText" style= display: "block" >
        My Text Field
      </label>
      <input
        id="myText"
        placeholder="Enter some text"
        value=values.myText
        onChange=handleChange
        onBlur=handleBlur
      />
      <MySelect value=values.option onChange=setFieldValue />
      <button type="submit">Submit</button>
    </form>
  );
;

class MySelect extends React.Component 
  handleChange = value => 
    // this is going to call setFieldValue and manually update values.topcis
    this.props.onChange("option", value);
  ;
  render() 
    return (
      <div style= margin: "1rem 0" >
        <label htmlFor="color">Select an Option </label>
        <Select
          id="color"
          options=options
          onChange=this.handleChange
          value=this.props.value
        />
      </div>
    );
  


const MyEnhancedForm = withFormik(
  mapPropsToValues: props => (
    myText: "",
    option: 
  ),
  handleSubmit: (values,  setSubmitting ) => 
    console.log(values);
  
)(MyForm);

const App = () => <MyEnhancedForm />;
render(<App />, document.getElementById("root"));

有一些问题,你必须包含 react select css 组件才能正确显示

import "react-select/dist/react-select.css";

函数 mapPropsToValues 选项字段应该初始化为一个对象

 mapPropsToValues: props => (
    myText: "",
    option: 

最后是codeandbox示例的链接

【讨论】:

为了澄清,我将您的类别字段重命名为选项。因此,当您在我的示例中看到选项时,它实际上是指您的类别字段。 为什么这是一种更健壮的方式? react-select 非常固执己见(有很多样式),所以这不是这个问题的真正答案。【参考方案2】:

我昨天也遇到了这个问题。我的问题是提交包含 ant design 下拉列表的表单。我终于在几个小时后让它工作了:

重访Formik Docs 再次观看 Andrew Mead 的视频Better React Form with Formik。 还查看 Jared Palmer 的 Working with 3rd-party inputs #1: react-select

文档说你需要将 onChangeonBlur 事件分别设置为 setFieldValuesetFieldTouched 属性,如 3rd -party输入示例:

<MySelect
    value=values.topics
    onChange=setFieldValue
    onBlur=setFieldTouched
    error=errors.topics
    touched=touched.topics
/>

所以对于我的问题,我需要改变一下:

<Select
  ...field
  onChange=(value) => setFieldValue('fruitName', value)
  onBlur=()=> setFieldTouched('fruitName', true)
  value=values.fruitName
  ...
>
...
</Select>

希望这会有所帮助。

这是我的CodeSandbox

【讨论】:

以上是关于如何使用formik react js在handlesubmit函数中接收选择值?的主要内容,如果未能解决你的问题,请参考以下文章

React JS:Yup & Formik 错误消息在提交时显示多次

如何在 react-apollo-hooks 和 formik 中使用突变?

如何结合 Formik 使用 React NumberFormat 包?

如何使用 Formik 在 react-datepicker 中设置初始日期?

使用 Formik 的 React-Native 选择器

如何将 react-intl-tel-input 与 formik 集成?