multi selects & mutually exclusive
multi selects & mutually exclusive
互斥 selects

import React, {
useState,
// useEffect,
// useRef,
} from 'react';
// import ReactDOM from 'react-dom';
// import 'antd/dist/antd.css';
import {
Select,
} from "antd";
const { Option } = Select;
const optionsInit = [
{
value: "jack",
},
{
value: "lucy",
},
{
value: "tom",
}
];
const optionsGenerator = (datas = []) => {
return datas.map((item, i) => {
// console.log(`item`, item);
return <Option key={item.value} value={item.value}>{item.value}</Option>;
// return <Option key={item.value} value={item.value}>ABC</Option>;
});
};
const MultiSelects = () => {
const [optionsA, setOptionsA] = useState(optionsInit);
const [optionsB, setOptionsB] = useState(optionsInit);
const [optionsC, setOptionsC] = useState(optionsInit);
const [selectedOptions, setSelectedOptions] = useState([]);
// let optionsA = optionsInit || [];
// let optionsB = optionsInit || [];
function onChange(value) {
// console.log(`selected A=`, value);
let arr = selectedOptions || [];
arr.push(value);
setSelectedOptions(arr);
console.log(`arr A`, arr);
// let options = optionsInit.filter(obj => !arr.includes(obj.value) ? obj : null);
let options = optionsInit.filter(obj => !arr.includes(obj.value));
// let options = optionsInit.filter(obj => obj.value !== value);
setOptionsB(options);
setOptionsC(options);
}
function onChangeB(value) {
// console.log(`selected B=`, value);
let arr = selectedOptions || [];
arr.push(value);
setSelectedOptions(arr);
console.log(`arr B`, arr);
let options = optionsInit.filter(obj => !arr.includes(obj.value));
// let options = optionsInit.filter(obj => obj.value !== value);
setOptionsA(options);
setOptionsC(options);
}
function onChangeC(value) {
// console.log(`selected C=`, value);
let arr = selectedOptions || [];
arr.push(value);
setSelectedOptions(arr);
console.log(`arr C`, arr);
let options = optionsInit.filter(obj => !arr.includes(obj.value));
// let options = optionsInit.filter(obj => obj.value !== value);
setOptionsA(options);
setOptionsB(options);
}
return(
<>
<Select
style={{ width: 200 }}
placeholder="Select a person"
onChange={onChange}
>
{
optionsGenerator(optionsA)
}
</Select>
<Select
style={{ width: 200 }}
placeholder="Select a person"
onChange={onChangeB}
>
{
optionsGenerator(optionsB)
}
</Select>
<Select
style={{ width: 200 }}
placeholder="Select a person"
onChange={onChangeC}
>
{
optionsGenerator(optionsC)
}
</Select>
</>
);
};
export {
MultiSelects,
};
export default MultiSelects;
https://codesandbox.io/s/multi-antd-selects-dduwm
app.js
app-ok.js
import React, {
useState,
// useEffect,
// useRef,
} from 'react';
// import ReactDOM from 'react-dom';
// import 'antd/dist/antd.css';
import {
Select,
} from "antd";
const { Option } = Select;
const optionsInit = [
{
value: "jack",
},
{
value: "lucy",
},
{
value: "tom",
}
];
const optionsGenerator = (datas = []) => {
return datas.map((item, i) => {
// console.log(`item`, item);
return <Option key={item.value} value={item.value}>{item.value}</Option>;
// return <Option key={item.value} value={item.value}>ABC</Option>;
});
};
const MultiSelects = () => {
const [selectedA, setSelectedA] = useState(null);
const [selectedB, setSelectedB] = useState(null);
const [selectedC, setSelectedC] = useState(null);
const [optionsA, setOptionsA] = useState(optionsInit);
const [optionsB, setOptionsB] = useState(optionsInit);
const [optionsC, setOptionsC] = useState(optionsInit);
const [selectedOptions, setSelectedOptions] = useState([]);
// let optionsA = optionsInit || [];
// let optionsB = optionsInit || [];
function onSearch(value) {
console.log(`search A=`, value);
}
function onChange(value) {
// console.log(`selected A=`, value);
let arr = selectedOptions || [];
if(value){
arr.push(value);
setSelectedA(value);
} else{
// console.log(`optionsA =`, optionsA);
// console.log(`selectedA =`, selectedA, typeof(selectedA));
// console.log(`arr =`, arr);
// ["jack", "lucy", "tom"]
arr = arr.filter(key => key !== selectedA);
// console.log(`arr =`, arr);
const options = optionsInit.filter(obj => !arr.includes(obj.value));
setOptionsA(options);
}
const setArr = new Set(arr);
setSelectedOptions([...setArr]);
console.log(`arr A`, arr);
// let options = optionsInit.filter(obj => !arr.includes(obj.value) ? obj : null);
const options = optionsInit.filter(obj => !arr.includes(obj.value));
// let options = optionsInit.filter(obj => obj.value !== value);
setOptionsB(options);
setOptionsC(options);
}
function onChangeB(value) {
// console.log(`selected B=`, value);
let arr = selectedOptions || [];
if(value){
arr.push(value);
setSelectedB(value);
} else {
arr = arr.filter(key => key !== selectedB);
// console.log(`arr =`, arr);
const options = optionsInit.filter(obj => !arr.includes(obj.value));
setOptionsB(options);
}
const setArr = new Set(arr);
setSelectedOptions([...setArr]);
console.log(`arr B`, arr);
const options = optionsInit.filter(obj => !arr.includes(obj.value));
// let options = optionsInit.filter(obj => obj.value !== value);
setOptionsA(options);
setOptionsC(options);
}
function onChangeC(value) {
// console.log(`selected C=`, value);
let arr = selectedOptions || [];
if(value){
arr.push(value);
setSelectedC(value);
} else {
arr = arr.filter(key => key !== selectedC);
// console.log(`arr =`, arr);
const options = optionsInit.filter(obj => !arr.includes(obj.value));
setOptionsC(options);
}
const setArr = new Set(arr);
setSelectedOptions([...setArr]);
console.log(`arr C`, arr);
const options = optionsInit.filter(obj => !arr.includes(obj.value));
// let options = optionsInit.filter(obj => obj.value !== value);
setOptionsA(options);
setOptionsB(options);
}
return(
<>
<Select
style={{ width: 200 }}
placeholder="Select a person"
onChange={onChange}
onSearch={onSearch}
allowClear
>
{
optionsGenerator(optionsA)
}
</Select>
<Select
style={{ width: 200 }}
placeholder="Select a person"
onChange={onChangeB}
allowClear
>
{
optionsGenerator(optionsB)
}
</Select>
<Select
style={{ width: 200 }}
placeholder="Select a person"
onChange={onChangeC}
allowClear
>
{
optionsGenerator(optionsC)
}
</Select>
</>
);
};
export {
MultiSelects,
};
export default MultiSelects;
multi selects & mutually exclusive的更多相关文章
- weblogic补丁安装失败(Patch B25A is mutually exclusive and cannot coexist with patch(es): UIAL)
由于曝出漏洞(CVE-2017-3248)需要将weblogic补丁更新至B25A,但是出现报错.如下: Conflict(s) detected - resolve conflict conditi ...
- MECE分析法(Mutually Exclusive Collectively Exhaustive)
什么是MECE分析法? MECE,是Mutually Exclusive Collectively Exhaustive,中文意思是“相互独立,完全穷尽”. 也就是对于一个重大的议题,能够做到不重叠. ...
- 金字塔原理——MECE(Mutually Exclusive Collectively Exhaustive)
一.金字塔原理 它的样子: 一个中心思想,分出下面2到N个思想支撑,每个分论点下面又有2到N个思想(事实或数据)支撑,以此类推,形状如金字塔.原则是以终为始(先结果后原因),以上统下,归纳分组,逻辑递 ...
- Events|sample space|mutually exclusive events
5.2Events The collection of all 52 cards—the possible outcomes—is called the sample space for this e ...
- Oracle Database 11g express edition
commands : show sys connect sys as sysdba or connect system as sysdba logout or disc clear screen or ...
- 大规模视觉识别挑战赛ILSVRC2015各团队结果和方法 Large Scale Visual Recognition Challenge 2015
Large Scale Visual Recognition Challenge 2015 (ILSVRC2015) Legend: Yellow background = winner in thi ...
- Automake
Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...
- Sphinx 2.2.11-release reference manual
1. Introduction 1.1. About 1.2. Sphinx features 1.3. Where to get Sphinx 1.4. License 1.5. Credits 1 ...
- PostGIS导入导出SHP文件常用命令
SHP导入POSTGIS数据库 引用 直接导入数据库 shp2pgsql -I -s 2437 -W GBK shop_point.shp public.ntable | psql -U postg ...
随机推荐
- High Performance Networking in Google Chrome 进程间通讯(IPC) 多进程资源加载
小结: 1. 小文件存储于一个文件中: 在内部,磁盘缓存(disk cache)实现了它自己的一组数据结构, 它们被存储在一个单独的缓存目录里.其中有索引文件(在浏览器启动时加载到内存中),数据文件( ...
- 扒一扒ELF文件
ELF文件(Executable Linkable Format)是一种文件存储格式.Linux下的目标文件和可执行文件都按照该格式进行存储,有必要做个总结. 目录 1. 链接举例 2. ELF文件类 ...
- LOJ10090
题目描述 原题来自:USACO 2005 Dec. Gold FJ 有 n 头奶牛(2<=n<=1000) ,编号为1..n .奶牛们将按照编号顺序排成一列队伍(可能有多头奶牛在同一位置上 ...
- HTTPS是怎么保证数据安全传输的?
前言 关于HTTPS的连接过程,也是老生常谈的话题了. 其中涉及到的数字证书.电子签名.SSL/TLS.对称加密.非对称加密的问题总是让人摸不清头脑,不知道怎么回答. 今天就和大家再熟悉熟悉这其中千丝 ...
- Poem 01(转)
Dear Sunshine The way you glow through my blinds in the morning. It makes me feel like you missed me ...
- Aruba无线控制器常用操作
初始配置 1.console到初始化的无线控制器上 Enter System name [Aruba7005]: Enter VLAN 1 interface IP address [172.16.0 ...
- 使用xshell连不上ubuntu14.04
判断Ubuntu是否安装了ssh服务: 输入:#ps -e | grep ssh 如果服务已经启动,则可以看到"sshd",否则表示没有安装服务,或没有开机启动,如果不是下图情况, ...
- CF 1326 D. Prefix-Suffix Palindrome
D. Prefix-Suffix Palindrome 题意 给一个字符串 s,求一个字符串 t,t 由 s 的某个前缀以及某个后缀拼接而成,且 t 是回文串,长度不能超过 s.输出最长的 t 分析 ...
- 【uva 1349】Optimal Bus Route Design(图论--网络流 二分图的最小权完美匹配)
题意:有一个N个点的有向带权图,要求找若干个有向圈,使得每个点恰好属于一个圈.请输出满足以上条件的最小权和. 解法:有向圈?也就是每个点有唯一的后继.这是一个可逆命题,同样地,只要每个点都有唯一的后继 ...
- 【noi 2.6_4978】宠物小精灵之收服(DP)
题意:小智有N个精灵球,皮卡丘有M的初始体力,有K个野生小精灵.要收服尽可能多的野生小精灵,并使皮卡丘的剩余体力最大. 解法:01背包问题,增多一维来存第二个条件.f[i][j][k]表示抓前i个野生 ...