zoukankan      html  css  js  c++  java
  • xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!

    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={{  200 }}
            placeholder="Select a person"
            onChange={onChange}
          >
            {
              optionsGenerator(optionsA)
            }
          </Select>
          <Select
            style={{  200 }}
            placeholder="Select a person"
            onChange={onChangeB}
          >
            {
              optionsGenerator(optionsB)
            }
          </Select>
          <Select
            style={{  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={{  200 }}
            placeholder="Select a person"
            onChange={onChange}
            onSearch={onSearch}
            allowClear
          >
            {
              optionsGenerator(optionsA)
            }
          </Select>
          <Select
            style={{  200 }}
            placeholder="Select a person"
            onChange={onChangeB}
            allowClear
          >
            {
              optionsGenerator(optionsB)
            }
          </Select>
          <Select
            style={{  200 }}
            placeholder="Select a person"
            onChange={onChangeC}
            allowClear
          >
            {
              optionsGenerator(optionsC)
            }
          </Select>
        </>
      );
    };
    
    export {
      MultiSelects,
    };
    
    export default MultiSelects;
    
    
    

  • 相关阅读:
    计算数组的逆序对个数
    处理类型(typedef,uisng,auto,decltype)
    constexpr与常量表达式(c++11标准)
    const的限定
    void*类型的指针
    linux终端拖动鼠标总是产生ctrl+c
    Linux hrtimer分析(2)
    Linux hrtimer分析(一)
    Alarm(硬件时钟) init
    第十一章 Android 内核驱动——Alarm
  • 原文地址:https://www.cnblogs.com/xgqfrms/p/11775676.html
Copyright © 2011-2022 走看看