javascript - 你如何允许用户在 React 的 select 标签中选择多个选项?
问题描述
我正在尝试创建一个名为 SelectMultiple 的组件。
import React, { useState } from "react";
const SelectMultiple = () => {
const [skills, setSkills] = useState([]);
const handleChange = event => {
const { value } = event.target;
const indexOfValue = skills.indexOf(value);
if (indexOfValue === -1) {
setSkills([...skills, value]);
} else {
setSkills(skills.filter(skill => skill !== value));
}
};
return (
<select multiple={true} value={skills} onChange={handleChange}>
<option value="HTML">HTML</option>
<option value="CSS">CSS</option>
<option value="JavaScript">JavaScript</option>
</select>
);
};
export default SelectMultiple;
当我运行这段代码时,点击 HTML,HTML 被选中,再次点击 HTML,显然,它并没有取消选择,因为 onChange 事件没有触发。
解决这个问题的最佳方法是什么?我应该改用 ref 吗?这种多选组件的最佳实践是什么?
解决方案
您可以通过 event.target.selectedOptions 访问所选项目。
function SelectMultiple () {
const [skills, setSkills] = useState([]);
const handleChange = event => {
var selectedSkills = Array.from(event.target.selectedOptions, (item) => item.value)
setSkills(selectedSkills);
};
return (
<>
<select multiple={true} value={skills} onChange={handleChange}>
<option value="HTML">HTML</option>
<option value="CSS">CSS</option>
<option value="JavaScript">JavaScript</option>
</select>
<hr />
Selected Skills{JSON.stringify(skills)}
</>
);
}
代码沙盒:
推荐阅读
- python - Django在重定向后下载文件
- javascript - 选择另一个下拉值时如何从下拉列表中隐藏特定选项
- javascript - 矩形内的 Matter.js 文本
- spring-boot - Axon - 无法在不同的微服务中发出查询更新
- apache-spark - Pyspark 不显示 hive 数据库
- apache-spark - 在 Spark 数据集上调用 createOrReplaceTempView 时是否会对性能造成影响?
- javascript - 性能:在 React 中调度动作与作为道具传递
- windows - 根据安装程序是处于用户模式还是管理员模式更改环境注册表项
- reactjs - 如何在反应中更新我的 chart.js 数据?
- syntax-error - 为什么我在赋值语句左值中出现语法错误?