reactjs - 如何在react redux中仅选择一个映射数据上的复选框
问题描述
在这种情况下,我只想选择一个复选框,如果一个复选框被选中,所有其他复选框都将被取消选中。那么它将如何与 react redux action 和 reducer 一起工作
data:[
{id:1, name:apple, isChecked:false},
{id:2, name:banana, isChecked:false}
{id:3 ,name:mango, isChecked:false},
{id:4, name:grape, isChecked:false},
{id:5, name:carrot, isChecked:false},
]
{data.map((item,index) => {
<Checkbox onChange={(e)=>handleChange(e)} checked={item.isChecked} />
}}
解决方案
一般来说,如果您只想选择一个项目,那么您不希望isChecked
每个项目都有一个属性,因为有太多的错误空间。相反,您需要一个存储当前选中的id
. 如果使用 Redux 或本地组件状态,这是正确的。
您的问题中没有太多信息,但是您可以通过使用as调度一个toggleChecked
动作来处理 Redux 中的大部分逻辑。id
payload
下面是一个使用 Redux Toolkit 的 reducer 设置示例。
import { createSlice, PayloadAction } from "@reduxjs/toolkit";
const initialState = {
items: [
{ id: 1, name: "apple" },
{ id: 2, name: "banana" },
{ id: 3, name: "mango" },
{ id: 4, name: "grape" },
{ id: 5, name: "carrot" }
],
selectedId: undefined
};
const slice = createSlice({
name: "checkboxes",
initialState,
reducers: {
// select this id and deselect all others
// action.payload is the id
selectId: (state, action) => {
state.selectedId = action.payload;
},
// either select or deselect this id
// action.payload is the id
toggleChecked: (state, action) => {
const isChecked = state.selectedId === action.payload;
if (isChecked) {
state.selectedId = undefined; // uncheck
} else {
state.selectedId = action.payload; // check
}
},
// action.payload is an item with name and id properties
addItem: (state, action) => {
state.items.push(action.payload);
}
// can add other actions like remove, rename, etc.
}
});
export const { selectId, toggleChecked, addItem } = slice.actions;
export default slice.reducer;
现在您的组件变得非常简单。selectedId
我们从 Redux 状态中选择选项和当前。我们通过将其与 进行比较来查看是否每个都item
被选中。我们通过使用 this调度操作来处理每个复选框的更改。id
selectedId
toggleChecked
id
import { toggleChecked } from "../store/slice";
import { useSelector, useDispatch } from "react-redux";
import { Checkbox } from "@material-ui/core";
const CheckboxSelect = () => {
const dispatch = useDispatch();
const { items, selectedId } = useSelector((state) => state.checkboxes);
return (
<div>
{items.map(({ id, name }) => (
<div key={id}>
<Checkbox
checked={id === selectedId}
onChange={() => dispatch(toggleChecked(id))}
/>
{name}
</div>
))}
</div>
);
};
export default CheckboxSelect;
推荐阅读
- python - 如何在终端中正确打印我的方框?
- swift-package-manager - Swift 包构建正常,但由于派生数据中缺少“SourcePackages”,测试总是失败
- python - python web服务器和客户端服务器
- scikit-learn - clf.pred_proba 用于面向直方图的梯度预测
- database - 如何在VB中显示访问数据库?
- c# - C# 计算小数位数而不考虑尾随零
- azure - AZURE 上的 RBAC 用于运行时
- python - 单独的标签 - Django
- python - 如何使用关联表进行 Django 查询?
- bash - 如何在 bash shell 输出中等待文本?