javascript - React Hooks:更改多个项目的状态
问题描述
我有一个图标列表。当我单击其中一个时,我希望它:
1/ 将状态更改为白天或黑夜
2/ 将图标图像更改为太阳或月亮。
但是使用我编写的代码,如果我单击一个,它会更改所有图标图像,并且只有一个状态与所有状态相关联。
我该怎么做,每个图标都有自己的状态,当我点击图标时,只有点击的图标会变成月亮或太阳,而不是全部?
我的代码:
export default function MyModal() {
const [isVisible, setVisible] = useState(false);
const [isDay, setDay] = useState(true);
const { RangePicker } = DatePicker;
const { Option } = Select;
const style = {
verticalAlign: "middle",
marginRight: 10,
};
function handleDayNight() {
isDay === true ? setDay(false) : setDay(true);
console.log("isDay =", isDay);
}
function handleSelectChange(value) {
console.log(`selected ${value}`);
}
function handleCheckChange(checkedValues) {
console.log("checked =", checkedValues);
}
return (
<div>
<Button type="primary" onClick={() => setVisible(true)}>
Add an exception
</Button>
<Modal
title="Add an exception"
style={{ top: 20 }}
visible={isVisible}
onOk={() => setVisible(false)}
onCancel={() => setVisible(false)}
>
<p>Exceptions name</p>
<Input placeholder="80% Wednesday" />
<p style={{ marginTop: 10 }}>Select date</p>
<RangePicker onChange={([date]) => console.log(date)} />
<p style={{ marginTop: 10 }}>Frequency</p>
<Select
defaultValue="Weekly"
style={{ width: 120 }}
onChange={handleSelectChange}
>
<Option value="daily">Daily</Option>
<Option value="weekly">Weekly</Option>
<Option value="monthly">Monthly</Option>
</Select>
<Divider />
<Checkbox.Group style={{ width: "100%" }} onChange={handleCheckChange}>
<div>
{isDay === true ? (
<Sun style={style} onClick={handleDayNight} />
) : (
<Moon style={style} onClick={handleDayNight} />
)}
<Checkbox value="Monday">Monday</Checkbox>
<br></br>
{isDay === true ? (
<Sun style={style} onClick={handleDayNight} />
) : (
<Moon style={style} onClick={handleDayNight} />
)}
<Checkbox value="Tuesday">Tuesday</Checkbox>
<br></br>
{isDay === true ? (
<Sun style={style} onClick={handleDayNight} />
) : (
<Moon style={style} onClick={handleDayNight} />
)}
<Checkbox value="Wednesday">Wednesday</Checkbox>
<br></br>
{isDay === true ? (
<Sun style={style} onClick={handleDayNight} />
) : (
<Moon style={style} onClick={handleDayNight} />
)}
<Checkbox value="Thursday">Thursday</Checkbox>
<br></br>
<Checkbox value="Friday">Friday</Checkbox>
<br></br>
<Checkbox value="Saturday">Saturday</Checkbox>
<br></br>
<Checkbox value="Sunday">Dimanche</Checkbox>
</div>
</Checkbox.Group>
</Modal>
</div>
);
}
解决方案
为每个组件使用单独的组件,因此您可以在这些组件中拥有单独的单独状态。例如,替换所有
{isDay === true ? (
<Sun style={style} onClick={handleDayNight} />
) : (
<Moon style={style} onClick={handleDayNight} />
)}
和
<SunMoon style={style} />
const SunMoon = ({ style }) => {
const [isDay, setDay] = useState(true);
const handleDayNight = () => setDay(!isDay);
return isDay
? <Sun style={style} onClick={handleDayNight} />
: <Moon style={style} onClick={handleDayNight} />;
};
推荐阅读
- r - 使用 Alpha Vantage 插件时在 tidyquant (R) 中指定日期
- java - 是否可以显式使用 Java 内部锁?
- node.js - Noto 字体无法使用 Vue 处理 jsPDF
- streaming - python Dataflow DoFn生命周期中的光束设置()刷新多长时间?
- mysql - 如何确定其安全退出节点应用程序
- javascript - 如何手动创建 http.IncomingMessage 流?
- javascript - 使用 AJAX 表单时如何让 Chrome 将用户的输入保存到他们的自动完成历史记录中
- java - 将所选日期与当前日期进行比较,不能超过 1 天
- vb.net - 从数据行 vb 从字符串转换为整数类型
- google-apps-script - 使用 GAS 将段落类型更改为列表项类型