reactjs - 根据选择的另一个 SELECT 删除 SELECT 选项
问题描述
const initData = [
{
"id":1,
"name":"Type A",
"description":"Description Type A"
},
{
"id":2,
"name":"Type B",
"description":"Description Type B"
},
{
"id":3,
"name":"Type C",
"description":"Description Type C"
}
]
const [listOption, setListOption] = useState(initData);
我有两个 select dropdown exampleA
,exampleB
像这样。
<CSelect
custom
name="exampleA" // exampleB
id="exampleA" // exampleB
onChange={(e) => {
//someFunctionToCheck(e, i);
}}
>
{listOption &&
listOption.map((x) => {
return (
<option
value={x.id}
key={"key" + x.id}
>
{x.name}
</option>
);
})}
</CSelect>
我想要这样当用户选择"name":"Type A"
inexampleA
时,exampleB
用户只能选择"name":"Type B"
, "name":"Type C"
。
或者如果用户选择"name":"Type B"
in exampleA
, onexampleB
用户只能选择"name":"Type A"
, "name":"Type C"
。
我怎样才能做到这一点?
解决方案
您可以根据您选择的值过滤状态:
const someFunctionToCheck = (e) => {
e.preventDefault()
setListOption(initData.filter(entry => entry.id !== parseInt(e.target.value)))
}
但是,如果您希望根据任一选择的值过滤您的选择,这将起作用。如果您只想过滤其他元素的选择,只需使用两种不同的状态(请参阅下面的完整代码或此处https://codesandbox.io/s/hopeful-snowflake-wf6w6?file=/src/App.js:0-第1572章)
请注意,过滤器位于 initData 上,以便将未选择的值放回原处。
完整的工作代码:
import React, { useState } from "react";
import "./styles.css";
export default function App() {
const initData = [
{
id: 1,
name: "Type A",
description: "Description Type A"
},
{
id: 2,
name: "Type B",
description: "Description Type B"
},
{
id: 3,
name: "Type C",
description: "Description Type C"
}
];
const [listOption, setListOption] = useState(initData);
const [listOption2, setListOption2] = useState(initData);
const someFunctionToCheck = (e, i) => {
e.preventDefault();
if (i === 1)
setListOption2(
initData.filter((entry) => entry.id !== parseInt(e.target.value))
);
else if (i === 2)
setListOption(
initData.filter((entry) => entry.id !== parseInt(e.target.value))
);
};
return (
<div className="App">
<select
name="Type A"
onChange={(e) => {
someFunctionToCheck(e, 1);
}}
>
{listOption &&
listOption.map((x) => {
return (
<option value={x.id} key={"key" + x.id}>
{x.name}
</option>
);
})}
</select>
<select
name="Type B"
onChange={(e) => {
someFunctionToCheck(e, 2);
}}
>
{listOption &&
listOption2.map((x) => {
return (
<option value={x.id} key={"key" + x.id}>
{x.name}
</option>
);
})}
</select>
</div>
);
}
推荐阅读
- python - 如何设置热图的 X 轴和 Y 轴范围?
- r - 从数据框名称列表创建数据框列表(用于merge_all)
- python - Python 3 POST 请求处理表单数据
- javascript - $lookup 字段上的 $sum 对象数
- java - 使用 Validate.notNull() 时是否可以更改或包装异常
- shell - 在 shell 中等待事件或用户中止
- r - 具有相互依赖的小部件的闪亮 renderUI
- android - 使用自定义 App 字体而不是用户配置的字体
- reactjs - 在 React 中未设置 useState
- postgresql - 仅从 postgres 中的 csv 中选择列名