如何在Formik中创建连接/相关选择元素?

杰森

我有两个选择框,一个用于国家,另一个用于区域。当有人选择一个国家时,我需要用不同的值(异步)填充选择的区域。

我知道react-country-region-selectorreact-select,但是对于这样一个简单的任务,这些解决方案似乎有些过分。

在下面的代码中,选择一个国家/地区后,这些区域会正确填充,但是所选国家/地区的值会丢失。另外,我应该在构造函数中设置状态还是Formik应该处理所有状态?

import React from 'react';
import { Formik, Form, Field } from "formik";

class App extends React.Component {
  constructor(props) {
    super(props);

    console.log(`props: ${JSON.stringify(props, null, 2)}`)

    this.state = {
      regions: []
    }

    this.handleSubmit = this.handleSubmit.bind(this);
    this.handleCountryChanged = this.handleCountryChanged.bind(this);
    this.getRegions = this.getRegions.bind(this);
  }

  handleSubmit(values, { setSubmitting }) {
    console.log(JSON.stringify(values), null, 2);
  };

  handleCountryChanged(event) {
    const country = event.target.value;
    this.getRegions(country).then(regions => {
      this.setState({ regions: regions });
      console.log(`regions: ${JSON.stringify(regions, null, 2)}`);
    });
  }

  getRegions(country) {
    // Simulate async call
    return new Promise((resolve, reject) => {
      switch (country) {
        case "United States":
          resolve([
            { value: 'Washington', label: 'Washington' },
            { value: 'California', label: 'California' }
          ]);
          break;
        case "Canada":
          resolve([
            { value: "Alberta", label: "Alberta" },
            { value: "NovaScotia", label: "Nova Scotia" }
          ]);
          break;
        default:
          resolve([]);
      }
    });
  }

  render() {
    return (
      <Formik
        initialValues={{ country: "None", region: "None", regions: [] }}
        onSubmit={this.handleSubmit}
      >
        {({ isSubmitting }) => (
          <Form>
            <label htmlFor="country">Country</label>
            <Field id="country" name="country" as="select"
              onChange={this.handleCountryChanged}>
              <option value="None">Select country</option>
              <option value="United States">United States</option>
              <option value="Canada">Canada</option>
            </Field>
            <label htmlFor="region">Region</label>
            <Field id="region" name="region" as="select">
              <option value="None">Select region</option>
              {this.state.regions.map(r => (<option key={r.value} value={r.value}>{r.label}</option>))}
            </Field>
            <button type="submit" disabled={isSubmitting}>Submit</button>
          </Form>
        )}
      </Formik>);
  }
}

export default App;```

SAN

我认为您应该处理获取区域并设置formik

这是示例代码(codesanbox):

Formik手柄获取区域

代码在这里:

// Helper styles for demo
import "./helper.css";
import { MoreResources, DisplayFormikState } from "./helper";

import React from "react";
import { render } from "react-dom";
import { Formik, Field } from "formik";
import * as Yup from "yup";

const App = () => {
  const getRegions = country => {
    // Simulate async call
    return new Promise((resolve, reject) => {
      switch (country) {
        case "United States":
          resolve([
            { value: "Washington", label: "Washington" },
            { value: "California", label: "California" }
          ]);
          break;
        case "Canada":
          resolve([
            { value: "Alberta", label: "Alberta" },
            { value: "NovaScotia", label: "Nova Scotia" }
          ]);
          break;
        default:
          resolve([]);
      }
    });
  };

  return (
    <div className="app">
      <h1>
        Basic{" "}
        <a
          href="https://github.com/jaredpalmer/formik"
          target="_blank"
          rel="noopener noreferrer"
        >
          Formik
        </a>{" "}
        Demo
      </h1>

      <Formik
        initialValues={{ country: "None", region: "None", regions: [] }}
        onSubmit={async values => {
          await new Promise(resolve => setTimeout(resolve, 500));
          alert(JSON.stringify(values, null, 2));
        }}
        validationSchema={Yup.object().shape({
          email: Yup.string()
            .email()
            .required("Required")
        })}
      >
        {props => {
          const {
            values,
            dirty,
            isSubmitting,
            handleChange,
            handleSubmit,
            handleReset,
            setFieldValue
          } = props;
          return (
            <form onSubmit={handleSubmit}>
              <label htmlFor="country">Country</label>
              <Field
                id="country"
                name="country"
                as="select"
                value={values.country}
                onChange={async e => {
                  const { value } = e.target;
                  const _regions = await getRegions(value);
                  console.log(_regions);
                  setFieldValue("country", value);
                  setFieldValue("region", "");
                  setFieldValue("regions", _regions);
                }}
              >
                <option value="None">Select country</option>
                <option value="United States">United States</option>
                <option value="Canada">Canada</option>
              </Field>
              <label htmlFor="region">Region</label>
              <Field
                value={values.region}
                id="region"
                name="region"
                as="select"
                onChange={handleChange}
              >
                <option value="None">Select region</option>
                {values.regions &&
                  values.regions.map(r => (
                    <option key={r.value} value={r.value}>
                      {r.label}
                    </option>
                  ))}
              </Field>

              <button
                type="button"
                className="outline"
                onClick={handleReset}
                disabled={!dirty || isSubmitting}
              >
                Reset
              </button>
              <button type="submit" disabled={isSubmitting}>
                Submit
              </button>

              <DisplayFormikState {...props} />
            </form>
          );
        }}
      </Formik>

      <MoreResources />
    </div>
  );
};

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在骨干木偶中创建与DOM相关的元素?

来自分类Dev

如何在jQuery中获取选择的选项元素attr?

来自分类Dev

如何在haskell中创建几种相关的数据类型?

来自分类Dev

如何在文本选择中删除子元素

来自分类Dev

如何在react-bootstrap中获取选择元素的值?

来自分类Dev

如何在jQuery中的div中选择类元素

来自分类Dev

如何在UWP中创建FTP连接?

来自分类Dev

如何在Android库中自动创建与活动相关的资料?

来自分类Dev

如何在Spring Boot中创建Tcp Connection以接受连接?

来自分类Dev

如何在多选列表框中自动选择与表中的值相关的项目?

来自分类Dev

如何在Python 3中从元组中反转并选择元素?

来自分类Dev

如何在选择元素中删除大于选择的选项?

来自分类Dev

如何在Flutter中创建这样的元素?

来自分类Dev

在原始JavaScript中,如何在完全加载页面后选择使用innerHTML属性创建的元素?

来自分类Dev

如何在Cheerio / jQuery中从li元素中选择值?

来自分类Dev

如何在KivyMD中创建选择列表

来自分类Dev

如何在PHP中从两个相关的关联数组中打印元素和值

来自分类Dev

如何在OTRS中创建2个相关的动态字段

来自分类Dev

如何在jQuery中获取选择的选项元素attr?

来自分类Dev

如何在Laravel元素形式中添加HTML选择框

来自分类Dev

如何在__construct()中创建PDO连接?

来自分类Dev

如何在jQuery中按属性选择元素?

来自分类Dev

如何在jQuery中按类选择当前元素?

来自分类Dev

如何在选择中创建if for选项?

来自分类Dev

如何在 JQuery 中连接选择器?

来自分类Dev

如何在 Selenium 和 Python 中通过 xpath 选择元素?

来自分类Dev

如何在 html 中创建新元素?

来自分类Dev

如何在休眠中创建相关子查询

来自分类Dev

如何在 powershell 中从我的 XML 文件中选择元素

Related 相关文章

  1. 1

    如何在骨干木偶中创建与DOM相关的元素?

  2. 2

    如何在jQuery中获取选择的选项元素attr?

  3. 3

    如何在haskell中创建几种相关的数据类型?

  4. 4

    如何在文本选择中删除子元素

  5. 5

    如何在react-bootstrap中获取选择元素的值?

  6. 6

    如何在jQuery中的div中选择类元素

  7. 7

    如何在UWP中创建FTP连接?

  8. 8

    如何在Android库中自动创建与活动相关的资料?

  9. 9

    如何在Spring Boot中创建Tcp Connection以接受连接?

  10. 10

    如何在多选列表框中自动选择与表中的值相关的项目?

  11. 11

    如何在Python 3中从元组中反转并选择元素?

  12. 12

    如何在选择元素中删除大于选择的选项?

  13. 13

    如何在Flutter中创建这样的元素?

  14. 14

    在原始JavaScript中,如何在完全加载页面后选择使用innerHTML属性创建的元素?

  15. 15

    如何在Cheerio / jQuery中从li元素中选择值?

  16. 16

    如何在KivyMD中创建选择列表

  17. 17

    如何在PHP中从两个相关的关联数组中打印元素和值

  18. 18

    如何在OTRS中创建2个相关的动态字段

  19. 19

    如何在jQuery中获取选择的选项元素attr?

  20. 20

    如何在Laravel元素形式中添加HTML选择框

  21. 21

    如何在__construct()中创建PDO连接?

  22. 22

    如何在jQuery中按属性选择元素?

  23. 23

    如何在jQuery中按类选择当前元素?

  24. 24

    如何在选择中创建if for选项?

  25. 25

    如何在 JQuery 中连接选择器?

  26. 26

    如何在 Selenium 和 Python 中通过 xpath 选择元素?

  27. 27

    如何在 html 中创建新元素?

  28. 28

    如何在休眠中创建相关子查询

  29. 29

    如何在 powershell 中从我的 XML 文件中选择元素

热门标签

归档