【问题标题】:How to receive select value in handlesubmit function with formik react js?如何使用formik react js在handlesubmit函数中接收选择值?
【发布时间】:2023-03-10 12:30:01
【问题描述】:

我正在使用 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

      }

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

【问题讨论】:

    标签: javascript html forms reactjs formik


    【解决方案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 下拉列表的表单。我终于在几个小时后让它工作了:

    文档说你需要将 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

    【讨论】:

      猜你喜欢
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多