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 ...
随机推荐
- 两个list<Map<String,String>>放入一个list中
// public static void main(String[] args) {// List<Map<String, String>> list2 = new Arra ...
- Spring cloud-Bus (消息总线)
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring ...
- AJAX传值中文乱码
AJAX传值时采用的是UTF-8编码格式,客户端中文字符传输到服务器端时,如果服务器编码格式或者所采用的MVC框架的编码格式不是UTF-8,则很可能会出现中文乱码.解决办法如下: 客户端用js函数en ...
- MariaDB数据库 ----数据库简介,用户管理,数据库创建,数据类型、数据增删改(实例演示)
数据库简介 数据库--即电子文件柜,用户可以对文件中的数据进行增,删,改,查等操作. 数据库分类 关系型数据库 关系型数据库管理系统(Relational Database Management Sy ...
- (15)Linux命令基本格式
1.命令提示符 登录系统后,第一眼看到的内容是: [root@localhost ~]# 这就是 Linux 系统的命令提示符.那么,这个提示符的含义是什么呢? []:这是提示符的分隔符号,没有特殊含 ...
- 翻译:《实用的Python编程》01_01_Python
目录 | 下一节 (1.2 第一个程序) 1.1 Python Python 是什么? Python 是一种解释型(译者注:区别于编译型)的高级语言, 通常被归类为 "脚本语言" ...
- 「SCOI2005」互不侵犯 (状压DP)
题目链接 在\(N\times N\) 的棋盘里面放 \(K\)个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共\(8\) 个格子 ...
- Codeforces Round #673 (Div. 2) B. Two Arrays(数学)
题目链接:https://codeforces.com/contest/1417/problem/B 题意 定义 $f(a)$ 为数组 $a$ 中满足: $i < j$ $a_i + a_j = ...
- HDU5407 CRB and Candies 【LCM递推】
HDU5407 CRB and Candies 题意: 计算\(LCM(C(n,0),C(n,1),C(n,2),\cdots,C(n,n-1),C(n,n))\) \(n\le 10^6\) 题解: ...
- HDU6532 Chessboard (最大费用流)
题意:棋盘上有n个棋子 每个棋子都有收益 现在给定1e5条线 有横着的 竖着的 规定只能在线的一侧选最多ki个棋子 问最大收益 题解:写自闭的一道题 很容易想到是网络流 但是建图有点难 第一道最大费用 ...