Formik官方应用案例解析(三)使用react-select

2023-05-16

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">
    <h1>
      Using{' '}
      <a href="https://github.com/jaredpalmer/formik">
        Formik
      </a>{' '}
      with 3rd-party input components
    </h1>
    <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}
        />
    );
}

引用

1,https://react-select.com/home#getting-started
2,https://blog.csdn.net/Tony1590112/article/details/78296345
3,https://github.com/emotion-js/emotion
4,https://github.com/jaredpalmer/formik

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Formik官方应用案例解析(三)使用react-select 的相关文章

随机推荐

  • 分享一下我在东方时尚学车的经历

    楼主是4月26日报的名 xff0c 7月22日拿的本 xff0c 不算快的 xff0c 不过也不算慢的 和大多数简子们一样 xff0c 楼主也是个苦比的白领一族 xff0c 白天上班 xff0c 大多数都是晚上去学车 xff0c 每一次请个
  • Linux Kernel Development有关内存管理

    1 Pages Page的概念来源为处理器Processor的部件MMU Memory Management Unit xff0c MMU通过设置好的页表 通过设置CR3寄存器 xff0c 指向页目录所在的物理内存 对内存进行管理 xff0
  • 控件权限管理思路

    1 编写判断用户角色相关的类及方法 protected bool ShowButtonBasedOnRole string RoleOfInterest return User IsInRole RoleOfInterest 2 通过调用相
  • 华为交换机LACP模式链路聚合配置

    交换机A和交换机B之间通过3条GE以太网连接 xff0c 活动链路为2 xff0c 配置如下 xff1a SwitchA配置 lt HUAWEI gt system view HUAWEI sysname SwitchA SwitchA i
  • 检查HTTP 的 Digest 认证代码示例-JSP

    检查HTTP 的 Digest 认证 since http1 1 代码如下所示 xff1a 此代码还不完善 RFC2617算法未实现 lt 64 page pageEncoding 61 34 UTF 8 34 contentType 61
  • 每天一个linux命令(4):mkdir命令

    linux mkdir 命令用来 创建指定的 名称的 目录 xff0c 要求创建目录的用户在当前目录中具有写权限 xff0c 并且指定的目录名不能是当前目录中已有的目录 1 xff0e 命令格式 xff1a mkdir 选项 目录 2 xf
  • 历史上消失的十天--儒略日(Julian Days)的来历

    儒略日是由法国学者 Joseph Justus Scaliger xff08 1540 1609 xff09 发明的 xff0c 名称可能是取自 Scaliger 的父亲 xff0c 意大利学者Julius Caesar Scaliger
  • “ -bash:sudo:未找到命令”对于Linux,Debian,CentOS的错误和解决方案

    sudo command is used to execute command as another user This is generally used to run command as root In some cases we c
  • 球机和云台的差别 以及他们的组成

    说的 球机 和 云台 的差别那不得不介绍球机和云台的概念了 xff0c 球机全称为球型 摄像机 xff0c 是现代电视监控发展的代表 xff0c 她集成彩色一体化摄像机 云台 解码器 防护罩等多功能与一体 xff0c 安装方便 使用简单但功
  • [Shell学习笔记] 命令行下的高级网络工具cURL命令

    原文 xff1a http www 1987 name 365 html Linux curl命令是一个利用URL规则在命令行下工作的文件传输工具 它支持文件的上传和下载 xff0c 所以是综合传输工具 xff0c 但按传统 xff0c 习
  • 74系列的型号

    74系列TTL数字逻辑集成电路系国际上通用的标准电路 其品种共分为六大类即 74xx 标准 74LSxx 低功耗肖特基 74Sxx 肖特基 74ALSxx 先进低功耗肖特基 74ASxx 先进肖特基 74Fxx 高速 只要序列号相同 xff
  • 【C#】使用fo-dicom完成BMP,JPG,PNG图片转换为DICOM文件

    最近研究了一下DICOM和BMP文件转换的问题 xff0c 也是很头大 度娘了很久 xff0c 也在CSDN等论坛看到一些断断续续的文件 xff0c 最主要的是代码只是片断 xff0c 不是完整的实现 头大了 首先 xff0c 了解一下BM
  • Atomix getting start 浓浓的机翻

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 概观 Atomix 2 1是用于构建容错分布式系统的全功能框架 Atomix将ZooKeeper的一致性与Hazelcast的可用性和性能相结合 xff0c 使用一组定制通
  • Formik与antd-mobile的移动端的表单实践(下)

    大家好 xff0c 工作闲暇之余又来续写一下Formik这个库的文章了 xff0c 这次文章主要内容为如下 xff1a 更多表单组件的封装示例 单选 多选按钮选择器时间选择器文本输入框提交按钮Formik的表单验证Formik的表单提交处理
  • nginx与tomcat组合使用时获取客户端真实IP

    为什么80 的码农都做不了架构师 xff1f gt gt gt Nginx 43 Tomcat做反向代理在Tomcat中无法获取用户的真实IP解决步骤 xff1a 1 在Nginx配置文件中配置传递到Tomcat的IP变量名 xff1a 一
  • 记一次创建云硬盘失败的解决过程

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 背景 登录dashboard xff0c 点击创建云硬盘失败 xff0c 而且是点击完就直接报error错误 二 解决经过 思路一 xff1a 新上传的image镜像
  • linux samba 配置

    1 所需要软件包 samba common软件包中提供了samba服务器和客户中都必须使用的公共文件 samba软件包中包括了samba服务器程序的所有文件 samba client软件包中提供了Samabe客户机器的所有文件 system
  • tightvnc 远程开机_如何在Linux中安装和访问TightVNC远程桌面?

    tightvnc 远程开机 TightVNC is a very handy remote desktop application which is based on VNC protocol TightVNC is mostly used
  • linux grub命令行,引导工具GRUB详解

    导读 引导程序是驻留在硬盘第一个扇区 MBR 主引导记录 的程序 GRUB是一个功能强大的多系统引导程序 xff0c 专门处理Linux与其它操作系统共存的问题 下面就由我介绍一下grub conf文件里的具体内容及其含义 使用一下命令可以
  • Formik官方应用案例解析(三)使用react-select

    react select简介 React Select是github上一个极其火的控件库 xff0c 星数达到13004 xff0c 它是React开发中几乎是你必需打交道的一个内容 React Select的基本功能实现的是一个表单中的常