【发布时间】:2020-08-13 16:34:47
【问题描述】:
我正在尝试创建一个自定义反应钩子,用于将 9 个元素的状态保存在一个对象中,无论是真还是假。
let pads = {
Q: false,
W: false,
E: false,
A: false,
S: false,
D: false,
F: false,
Z: false,
X: false,
C: false,
};
export default () => {
const [padsPlaying, setPadsPlaying] = useState(pads);
return {
padsPlaying,
setPlayState: (element, state) => {
setPadsPlaying({ ...state, [element]: true });
},
};
};
在我的组件中,我导入钩子并这样调用它:
const { padsPlaying, setPlayState } = usePlayState();
const playSound = (element) => {
// do some other stuff and in the end:
setPlayState(element.id, padsPlaying);
};
它起作用了,Q 的 element.id 以 Q:true 和其他所有 false 返回状态。但是,如果我再次运行该函数,它会将Q 重置为其初始值false,并且新元素是true。有人可以指出我正确的方向吗?我尝试了设置播放状态和初始化状态的不同组合,但我觉得我只是在开枪,我在这里错过了什么?
编辑:我正在使用该状态来呈现带有 isPlaying 属性的组件列表为true或false
const makePads = preset[0].sounds.map((sound, i) => (
<DrumPad
key={sound.id}
id={sound.name}
name={sound.name}
source={sound.source}
trigger={sound.trigger}
isPlaying={padsPlaying[i]}
/>
));
已解决 我对我在哪里使用旧状态感到困惑,现在钩子看起来像这样并且它正在工作:)
export default () => {
const [padsPlaying, setPadsPlaying] = useState(initialPads);
const setPlayState = (id) => {
setPadsPlaying((state) => {
console.log(id);
return { ...state, [id]: true };
});
};
return [padsPlaying, setPlayState];
};
【问题讨论】:
标签: javascript reactjs react-hooks setstate