我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Formik中如何使用react-select

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Formik中如何使用react-select

这篇文章将为大家详细讲解有关Formik中如何使用react-select,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

react-select简介

React-Select是github上一个极其火的控件库,星数达到13004,它是React开发中几乎是你必需打交道的一个内容。React Select的基本功能实现的是一个表单中的常见的下拉列表框控件,其实它的功能扩展来看远远不止如此,它支持:

  • 多选

  • 样式定制

  • 多级联动选择

  • 异步加载

    等等。
    但是,如果在你的开发中使用的是一个很基础性的下拉列表框,那么你可以直接使用类似于Semantic UI或者是Material React控件库的Select组件,甚至是最基本的HTML5组件中的那个。

值得注意的是,如如今react-select组件从1.0升级到2.0,变化了巨大变化。有关细节请参考官方网站,总起来看越升级越容易使用,功能也越强大。

在Formik中使用react-select组件

Formik官方也提供了一个使用react-select组件的基本例子,但是使用的是react-select组件的Ver 1.x。在1.x版本时期,组件的样式是使用css方案定义的,但是升级到2.0后,样式使用了更为先进且更迎合React开发思想的Emotion这个开源库(使用JSX组件思想——CSS-in-JS——开发样式)。由于Formik官方提供的相关实例极为简单,所以几需要作两处修改即可。
工程名称:formik-09x-react-select-example,主要文件:index.js
修改后完整代码如下:

import './formik-demo.css';
import React from 'react';
import { render } from 'react-dom';
import { withFormik } from 'formik';
//ERROR NOW: import Yup from 'yup';==>changed into the following
import * as Yup from 'yup';

import Select from 'react-select';
//NOT SUPPORTED IN VERSION 2.X.
// Styles are now implemented with css-in-js rather than less / scss stylesheets
//import 'react-select/dist/react-select.css';

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

import SimpleSelect from './SimpleSelect'
import AnimatedMulti from './AnimationMultiSelect'

const formikEnhancer = withFormik({
    mapPropsToValues: props => ({
        email: '',
        topics: []
    }),
    validationSchema: Yup.object().shape({
        email: Yup.string()
            .email('Invalid email address')
            .required('Email is required!'),
        topics: Yup.array()
            .min(3, 'Pick at least 3 tags')
            .of(
                Yup.object().shape({
                    label: Yup.string().required(),
                    value: Yup.string().required(),
                })
            ),
    }),
    handleSubmit: (values, { setSubmitting }) => {
        const payload = {
            ...values,
            topics: values.topics.map(t => t.value),
        };
        setTimeout(() => {
            alert(JSON.stringify(payload, null, 2));
            setSubmitting(false);
        }, 1000);
    },
    displayName: 'MyForm'
});

const MyForm = props => {
  const {
    values,
    touched,
    dirty,
    errors,
    handleChange,
    handleBlur,
    handleSubmit,
    handleReset,
    setFieldValue,
    setFieldTouched,
    isSubmitting,
  } = props;
  return (
    <form onSubmit={handleSubmit}>
      <label htmlFor="email" style={{ display: 'block' }}>
        Email
      </label>
      <input
        id="email"
        placeholder="Enter your email"
        type="email"
        value={values.email}
        onChange={handleChange}
        onBlur={handleBlur}
      />
      {errors.email &&
      touched.email && (
        <div style={{ color: 'red', marginTop: '.5rem' }}>
          {errors.email}
        </div>
      )}
      <MySelect
        value={values.topics}
        onChange={setFieldValue}
        onBlur={setFieldTouched}
        error={errors.topics}
        touched={touched.topics}
      />
      <button
        type="button"
        className="outline"
        onClick={handleReset}
        disabled={!dirty || isSubmitting}
      >
        Reset
      </button>
      <button type="submit" disabled={isSubmitting}>
        Submit
      </button>

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

const options = [
  { value: 'Food', label: 'Food' },
  { value: 'Being Fabulous', label: 'Being Fabulous' },
  { value: 'Ken Wheeler', label: 'Ken Wheeler' },
  { value: 'ReasonML', label: 'ReasonML' },
  { value: 'Unicorns', label: 'Unicorns' },
  { value: 'Kittens', label: 'Kittens' },
];

class MySelect extends React.Component {
  handleChange = value => {
    // this is going to call setFieldValue and manually update values.topcis
    this.props.onChange('topics', value);
  };

  handleBlur = () => {
    // this is going to call setFieldTouched and manually update touched.topcis
    this.props.onBlur('topics', true);
  };

  render() {
    return (
      <div style={{ margin: '1rem 0' }}>
        <label htmlFor="color">
          Topics (select at least 3){' '}
        </label>
        <Select
          id="color"
          options={options}
          isMulti
          onChange={this.handleChange}
          onBlur={this.handleBlur}
          value={this.props.value}
        />
        {!!this.props.error &&
        this.props.touched && (
          <div style={{ color: 'red', marginTop: '.5rem' }}>
            {this.props.error}
          </div>
        )}
      </div>
    );
  }
}

const MyEnhancedForm = formikEnhancer(MyForm);

const App = () => (
  <div className="app">
    <h2>
      Using{' '}
      <a href="https://github.com/jaredpalmer/formik">
        Formik
      </a>{' '}
      with 3rd-party input components
    </h2>
    <p>
      This example shows to use Formik with a 3rd-party
      input component. The trick is to use Formik's{' '}
      <code>setFieldValue</code> prop and a custom component
      class whenever you need a custom change handler.{' '}
    </p>
    <p>
      To show this off, below is a Formik-enhanced form. It
      has a "vanilla" Formik input for <code>email</code>{' '}
      and a custom select component for <code>topics</code>{' '}
      that uses Jed Watson's {' '}
      <a href="https://github.com/JedWatson/react-select">
        react-select
      </a>{' '}
      library.
    </p>
    <MyEnhancedForm />
      <hr/>
      <SimpleSelect/>
      <hr/>
      <AnimatedMulti/>
      <hr/>
    <MoreResources />
  </div>
);

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

第一处修改是屏蔽css文件的导入引用,如下:
//import 'react-select/dist/react-select.css';
第二处更为简单,只需要把<Select/>组件中的属性表达方式修改一下,即把multi={true}修改为isMulti就可以了,如下:

        <Select
          id="color"
          options={options}
          isMulti
          onChange={this.handleChange}
          onBlur={this.handleBlur}
          value={this.props.value}
        />

另外还添加了两个我自己加入的react-select组件,分别是SimpleSelect和AnimationMultiSelect,它们各自的源码如下,请参考:

//SimpleSelect.js

import React,{Component} from 'react'
import Select from 'react-select'

const options=[
    {value:'liu',label:'刘备'},
    {value:'guan',label:'关羽'},
    {value:'zhang',label:'张飞'}
]
const SimpleSelect=()=>(
    <Select options={options}/>
)
export default SimpleSelect

//AnimationMultiSelect

import React from 'react';

import Select from 'react-select';
import makeAnimated from 'react-select/lib/animated';
// import { colourOptions } from '../data';
const colourOptions=[
    {value:'c1',label:'刘备'},
    {value:'c2',label:'关羽1'},
    {value:'c3',label:'关羽2'},
    {value:'c4',label:'关羽3'},
    {value:'c5',label:'张飞'}
]

export default function AnimatedMulti() {
    return (
        <Select
            closeMenuOnSelect={false}
            components={makeAnimated()}
            defaultValue={[colourOptions[4], colourOptions[5]]}
            isMulti
            options={colourOptions}
        />
    );
}

关于“Formik中如何使用react-select”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Formik中如何使用react-select

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

go中如何使用select

这篇文章主要为大家展示了“go中如何使用select”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“go中如何使用select”这篇文章吧。golang中的select语句格式如下select {
2023-06-26

react如何在React html中使用

本篇文章为大家展示了react如何在React html中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。基本使用
2023-06-14

Shell中select命令如何使用

Shell中select命令如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。select格式如下: select $var in ${list[@]}
2023-06-09

ADO.NET 中Select方法如何使用

本篇文章为大家展示了ADO.NET 中Select方法如何使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。ADO.NET Select方法返回一个带有所有相匹配的DataRow对象的数组。RowF
2023-06-17

React中如何使用Redux

这篇文章主要讲解了“React中如何使用Redux”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“React中如何使用Redux”吧!Redux 是一种状态容器 JS 库,提供可预测的状态管理
2023-07-02

React中如何使用scss

这篇文章主要介绍“React中如何使用scss”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“React中如何使用scss”文章能帮助大家解决问题。React中使用scss首先导入node-sass
2023-07-05

Linq如何使用Select

这篇文章给大家分享的是有关Linq如何使用Select的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。首先让大家了解下Linq To Sql查询数据库,然后全面介绍Linq使用Select。下面通过一些例子来说明怎
2023-06-17

hook如何在react中使用

今天就跟大家聊聊有关hook如何在react中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、什么是hook?react hook是react 16.8推出的方法,能够让函数式
2023-06-14

setState如何在react 中使用

setState如何在react 中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。setState是同步还是异步自定义合成事件和react钩子函数中异步更新state以
2023-06-14

react中的mobx如何使用

这篇文章主要介绍“react中的mobx如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“react中的mobx如何使用”文章能帮助大家解决问题。1.新建一个mobx.jsx文件import {
2023-07-06

React中的css如何使用

这篇文章主要介绍了React中的css如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇React中的css如何使用文章都会有所收获,下面我们一起来看看吧。一、行内样式使用import React from
2023-06-27

React Hook中如何使用State Hook

今天小编给大家分享一下React Hook中如何使用State Hook的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Hoo
2023-06-29

如何在SQL中的SELECT语句中使用REPLACE

在SQL中,可以使用REPLACE函数来替换SELECT语句中的特定字符或字符串。语法如下:SELECT REPLACE(column_name, old_value, new_value)FROM table_name;其中,column
2023-09-26

编程热搜

目录