我有一个组件的两个示例,我希望它们的行为像切换按钮。如果我单击一个特定的组件示例,其他组件示例应该被取消选择。
下面是我的代码:
store.js:
import { configureStore } from '@reduxjs/toolkit'
import boxReducer from './slices/boxSlice'
export default configureStore({
reducer: {
box:boxReducer
}
})
boxSlice.js:
export const boxSlice = createSlice({
name: "box",
initialState: {
selected: false,
},
reducers: {
select: (state) => {
state.selected=true;
},
deselect: (state) => {
state.selected=false;
},
},
});
export const { select, deselect } = boxSlice.actions;
export default boxSlice.reducer;
Box.js:
export function Box(){
const selectedStatus = useSelector((state) => state.box.selected)
const dispatch = useDispatch()
const [status, setStatus] = useState("Unselected")
const onSelect = (e) => {
dispatch(select());
if (selectedStatus) {
setStatus("Selected")
dispatch(deselect());
} else {
setStatus("Unselected");
}
}
return (
<div tabIndex="0" onClick={onSelect} className="box">
{status}
</div>
)
}
这是臭虫。我观察到的是:
- 第一次单击时,示例不会更新。它得到更新只有在第二次点击
- 它无法正确切换。两者都保持选中或未选中状态
每当单击组件的一个示例时,如何正确地更新这些示例
3条答案
按热度按时间czfnxgou1#
还原状态应该是真理的源泉。我建议给每个盒子组件一个唯一的id,并存储当前选择的盒子id。如果已经选择了相同的框ID,请取消选择框ID,否则,设置为新ID。
示例:
boxSlice.js
盒子
应用程序
643ylb082#
您可以利用
useSelector
返回的Redux状态,而不是在组件中维护单独的state
尝试点击下面的“选中”和“未选中”来查看它的工作情况:
在此之后,您可以有另一个布尔标志(例如。
inverse
)来知道2个盒子的哪个分量应该被反转。yacmzcpb3#
试试这个