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><inputid="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>)}<MySelectvalue={values.topics}onChange={setFieldValue}onBlur={setFieldTouched}error={errors.topics}touched={touched.topics}/><buttontype="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.topcisthis.props.onChange('topics', value);};handleBlur = () => {// this is going to call setFieldTouched and manually update touched.topcisthis.props.onBlur('topics', true);};render() {return (<div style={{ margin: '1rem 0' }}><label htmlFor="color">Topics (select at least 3){' '}</label><Selectid="color"options={options}isMultionChange={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-partyinput component. The trick is to use Formik's{' '}<code>setFieldValue</code> prop and a custom componentclass whenever you need a custom change handler.{' '}</p><p>To show this off, below is a Formik-enhanced form. Ithas 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就可以了,如下:

        <Selectid="color"options={options}isMultionChange={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 (<SelectcloseMenuOnSelect={false}components={makeAnimated()}defaultValue={[colourOptions[4], colourOptions[5]]}isMultioptions={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

转载于:https://blog.51cto.com/zhuxianzhong/2153433

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

  1. Formik官方应用案例解析( 五)React Native

    Hello React Native 在创建一个入门的Hello React Native工程时遇到一些麻烦,主要原因是Xcode版本太低. 使用create-react-native-app快速创建 ...

  2. IT创业失败案例解析 - 第三篇

    原文标题:RiotVine Post-Mortem(查看原文推荐) 原文作者:Kabir 双语对照 RiotVine网站关闭了(注:RiotVine是一个与朋友分享实时事件消息的社交网站),我真诚地感 ...

  3. 使用Formik轻松开发更高质量的React表单(一)入门

    前言 发现Formik是在我学习redux-form过程中从国外一篇博客上偶然发现的,看到作者的高度肯定后我立即转到github上,正如许多朋友所关注的,Formik的星数达8282,这个数字在git ...

  4. 【许晓笛】 EOS智能合约案例解析(1)

    详解 EOS 智能合约的 hpp 文件 为了帮助大家熟悉 EOS 智能合约,EOS 官方提供了一个代币(资产)智能合约 Demo -- eosio.token.eosio.token 智能合约目前还不 ...

  5. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  6. 【许晓笛】 EOS智能合约案例解析(1) 1

    详解 EOS 智能合约的 hpp 文件 为了帮助大家熟悉 EOS 智能合约,EOS 官方提供了一个代币(资产)智能合约 Demo -- eosio.token.eosio.token 智能合约目前还不 ...

  7. 【许晓笛】EOS智能合约案例解析(1)

    为了帮助大家熟悉 EOS 智能合约,EOS 官方提供了一个代币(资产)智能合约 Demo -- eosio.token.eosio.token 智能合约目前还不是特别完善,个别功能还没有完成.但这个示 ...

  8. UG/NX二次开发Siemens官方NXOPEN实例解析—2.8 DrawingCycle(图纸打印)

    列文章目录 UG/NX二次开发Siemens官方NXOPEN实例解析-2.1 AssemblyViewer(树列表) UG/NX二次开发Siemens官方NXOPEN实例解析-2.2 Selectio ...

  9. UG/NX二次开发Siemens官方NXOPEN实例解析—2.7 DiameterSymbol(标注符号)

    列文章目录 UG/NX二次开发Siemens官方NXOPEN实例解析-2.1 AssemblyViewer(树列表) UG/NX二次开发Siemens官方NXOPEN实例解析-2.2 Selectio ...

  10. UG/NX二次开发Siemens官方NXOPEN实例解析—2.6 CreateNote(注释)

    列文章目录 UG/NX二次开发Siemens官方NXOPEN实例解析-2.1 AssemblyViewer(树列表) UG/NX二次开发Siemens官方NXOPEN实例解析-2.2 Selectio ...

最新文章

  1. MySQL带ALL关键字的子查询
  2. SuperMap产权登记管理平台
  3. x86已安装该产品 剑灵vcredist_MySQL Server v5.7正式版(附安装和配置数据库教程)
  4. linux read recv,read()/ recv()成功,但缓冲区未更改且为空
  5. 二叉树前序遍历python输出_[宜配屋]听图阁 - Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例...
  6. 快乐大本营中测试声音年龄的软件_海天味极鲜酱油极限挑战宝藏行 终极试炼,极限成员们勇登珠峰大本营...
  7. 为什么c语言程序设计书不介绍文件删除,C语言程序设计上机指导书2010.doc
  8. 一篇关于实体链接的小综述
  9. 20155226-虚拟机与Linux之初体验
  10. (附源码)计算机毕业设计ssm大学生网络安全题库系统
  11. 省市定位(省市区三级联动插件Distpicker)
  12. 阿里云ECS安骑士离线修复步骤
  13. 五、pcb文件初始设置
  14. pidgin qq_Pidgin入门:Skype的开源替代品
  15. 用html制作四种九九乘法表,JavaScript制作九九乘法表
  16. 【AR】AR 的几种底层实现方式
  17. SQLServer还原数据库
  18. 四款好用的在线表单工具盘点
  19. MySQL 实现FULL JOIN的几种方式
  20. 计算机专业推荐的一些超级好用的软件

热门文章

  1. hdu-5992 Finding Hotels(kd-tree)
  2. mac os 下安装mysql
  3. ISCROLL4 简述
  4. 用于主题检测的临时日志(861e8353-61d5-43a9-b1b4-e055dac9cf39 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)...
  5. Internet 的50年口述历史七.摩登时代上
  6. iis提示“另一个程序正在使用此文件,进程无法访问”解决办法
  7. 这些超好用的 Mac 系统自带软件,来试试
  8. iOS底层探索之LLVM(二)——自定义Clang插件(上)
  9. 洛谷P4074 [WC2013]糖果公园(莫队)
  10. 今天没白过之《Linux的变量》