reactjs - 如何禁用/灰显 setSubmittedNominees 状态下可用的两条记录的下拉选择复选框?
问题描述
如何在 react hooksdisable/gray
中为状态中可用的两条记录退出下拉选择复选框?setSubmittedNominees
我试图将 submitNominees 传递给 selectedValues 和 disablePreSelectedValues(true) 但它不起作用,有人可以就此提出建议吗?代码框链接:
https://codesandbox.io/s/magical-haslett-s0oeh?file=/src/App.js
import React, { useRef, useEffect, useState } from "react";
import { useParams } from "react-router-dom";
import { useForm } from "react-hook-form";
import Axios from "axios";
import { Link, useHistory } from "react-router-dom";
import Multiselect from "multiselect-react-dropdown";
const options = [
{ id: 1, name: "Ath", email: "ath.best@test1.com", access: null },
{ id: 2, name: "Arnolds", email: "arnold@test1.com", access: null },
{ id: 3, name: "Alter", email: "alloop@test1.com", access: null },
{ id: 4, name: "Brandan", email: "brandan@test1.com", access: null },
{ id: 5, name: "Ron", email: "ron@test1.com", access: null },
{ id: 6, name: "Rads", email: "rad@test1.com", access: null },
{ id: 7, name: "Sam", email: "sam@y.com", access: null }
];
const submitted = [
{ id: 4, name: "Brandan", email: "brandan@test1.com", access: null },
{ id: 5, name: "Ron", email: "ron@test1.com", access: null }
];
const Selection= () => {
const [option, setOption] = useState([]);
const [selectedOption, setSelectedOption] = useState([]);
const [nomRegister, setNomRegister] = useState([{}]);
const [helperText, setHelperText] = useState("");
const [userEmail, setUserEmail] = useState("");
const [submittedNominees, setSubmittedNominees] = useState([{}]);
const {
register,
handleSubmit,
watch,
formState: { errors },
reset
} = useForm();
const maxOptions = 3;
const history = useHistory();
useEffect(() => {
const userEmail = localStorage.getItem("loginEmail");
setUserEmail(userEmail);
});
useEffect(() => {
const fetchData = async () => {
try {
const res = await Axios.get(
"http://localhost:8000/service/nomineeslist"
);
//const data1 = res.data;
setOption(options);
console.log("Get the list of nominees :" + JSON.stringify(res.data));
} catch (e) {
console.log(e);
}
};
fetchData();
}, []);
useEffect(() => {
const fetchData = async () => {
try {
// const res = await Axios.get(
// "http://localhost:8000/service/submittednominees"
// );
setSubmittedNominees(submitted);
} catch (e) {
console.log(e);
}
};
fetchData();
}, []);
const handleTypeSelect = (e, i) => {
const copy = [...selectedOption];
copy.push(e[i]);
setSelectedOption(copy);
};
const sendNomination = () => {
console.log("What the Array holds: " + JSON.stringify(nomRegister));
const fetchData = async (nomRegister) => {
try {
const res = await Axios.post(
"http://localhost:8000/service/nominateperson",
{ userEmail },
nomRegister
);
if (res.data) {
console.log("Print data:" + res.data);
const successMessage = res.data.message;
setHelperText(successMessage);
setNomRegister(reset);
}
} catch (e) {
console.log(e);
setNomRegister(reset);
setHelperText(e.message);
}
};
fetchData();
};
options.forEach((option) => {
option.displayValue = option.name + "\t" + option.email;
submittedNominees.forEach((item) => {
let subEmail = item.email; // how can I pass those two email to selectedValues and make it disable ?
});
});
const handleChange = (e, i) => {
const { name, email, value } = e.target;
// immutating state (best practice)
const updateList = nomRegister.map((item) => {
return { ...item };
});
const select_Email = selectedOption.map((item) => {
return item.email;
});
//change the specific array case depends on the id //email:emailList[i],
updateList[i] = {
...updateList[i],
name: name,
email: select_Email[i],
reason: value
};
setNomRegister(updateList);
};
return (
<div className="App">
<h1>Nominate a person</h1>
<div className="nomineeSelectBox">
<div id="dialog2" className="triangle_down1" />
<div className="arrowdown">
<Multiselect
onSelect={(e) => handleTypeSelect(e, selectedOption.length)}
options={selectedOption.length + 1 === maxOptions ? [] : options}
displayValue="displayValue"
selectedValues={subEmail}
showCheckbox={true}
emptyRecordMsg={"Maximum nominees selected !"}
/>
</div>
</div>
<div className="nominationcount"></div>
<form onSubmit={handleSubmit(sendNomination)}>
<div className="nomineesSelectedList">
<h4>Selected Nominees</h4>
{selectedOption.map((x, i) => (
<div key={i}>
<div className="row eachrecord">
<div className="column">
<label className="nomlabel">
{x?.name} <b>>></b>
</label>
</div>
<input
required
type="textarea"
placeholder="Please provide reason for nomination.."
key={i}
id={i}
name={x?.name}
className="nomineechoosed"
onChange={(e) => handleChange(e, i)}
/>
</div>
</div>
))}
<div className="row">
<div className="buttongroup">
<input id="Submit" type="submit" value="Submit" />
<input id="Cancel" type="button" value="Cancel" />
</div>
</div>
</div>
</form>
<span className="nominationValidationText">{helperText}</span>
</div>
);
};
export default Selection;
解决方案
这里的问题是您通过displayValue ( displayValue="displayValue"
) 显示下拉选择复选框,并且submitted
您将分配给submittedNominees
( setSubmittedNominees(submitted)
)的数组不包含displayValue
:
const submitted = [
{ id: 4, name: "Brandan", email: "brandan@test1.com", access: null },
{ id: 5, name: "Ron", email: "ron@test1.com", access: null }
];
解决方案::
- 让你
submitted
的例子像这样:
const submitted = [
{
id: 4,
name: "Brandan",
email: "brandan@test1.com",
access: null,
displayValue: "Brandan brandan@test1.com"
},
{
id: 5,
name: "Ron",
email: "ron@test1.com",
access: null,
displayValue: "Ron ron@test1.com"
}
];
- 添加
selectedValues={submittedNominees}
到您Multiselect
以找出您将禁用哪些值:
<Multiselect
onSelect={(e) => handleTypeSelect(e, selectedOption.length)}
options={selectedOption.length + 1 === maxOptions ? [] : options}
displayValue="displayValue"
disablePreSelectedValues={true}
selectedValues={submittedNominees}
showCheckbox={true}
emptyRecordMsg={"Maximum nominees selected !"}
/>
代码沙盒链接
推荐阅读
- javascript - 返回一个布尔值是否搜索词是数据标签的部分匹配
- javascript - 在不同浏览器上执行 javascript
- reactjs - TypeError: undefined is not an object (evalating 'Analytics.events.USER_SETTINGS') Expo firebase anlytics
- kibana-4 - 如何从 kibana 自定义插件中获取 elasticsearch 索引数据并将其显示在表中(KIBANA 7.10.1)
- mongodb - 如何连接到第三方 mongoDB?
- javascript - 左上角的按钮有两行,我需要一行
- java - 空闲时间后 JDBC 连接丢失
- python - 将参数从 Python 传递给 bash 不能按预期工作
- spring-boot - 尝试在 Spring Boot 应用程序中使用 Redis 作为缓存时出现存储库错误
- java - 使用 InetSocketAddress 创建 DatagramPacket,缺少构造函数