如何在单击时从状态数组中删除值
How to remove value from state array on click
目前我正在开发闹钟应用程序,我想以某种方式进行,以便您可以添加多个闹钟。每个警报都存储在 alarms:[] 状态的 App.js 文件中。如果添加了闹钟,我想将该闹钟显示为时钟下的 li 元素,我希望能够通过单击 X[=40= 将其删除] 图标。此外,当当前时间 === 为闹钟设置的时间时,Ring.js 组件呈现并且闹钟开始响起。当闹钟响起时,有'turn off'按钮。单击关闭按钮后,如何从状态数组中删除正在响铃的特定警报?
如果满足条件,我已尝试发送 removeAlarm 函数和警报(这可能有助于确定从数组中删除哪个警报)作为此组件的道具。
function checkTime(){
if(time.alarms[0]){
const alarms = time.alarms.map(function(alarm,i){
if(time.currentHour === alarm.hour && time.currentMinute === alarm.minute && time.currentSecond
>= 0){
return <Ring message={alarm.message} key={i} alarm={alarm} removeAlarm={removeAlarm} />
}
})
return alarms;
}
}
移除报警功能:
function removeAlarm(alarm){
setTime(prevState => ({
...prevState,
alarms:[...prevState.alarms.filter(el => el !== alarm)]
}))
}
Ring.js 文件
let message = props.message;
function removeAlarm(alarm){
props.removeAlarm(alarm);
}
function turnOff(e,alarm){
e.preventDefault();
setShowRing(false);
removeAlarm(alarm);
}
<form>
<h3>{message}</h3>
<button onClick={turnOff}>TURN OFF</button>
</form>
我不知道该怎么做。我不知道如何使用该传递的函数或如何在该 onClick 函数中确定这是必须发送到 removeAlarm 函数的按钮,通过状态映射并删除该特定按钮。
我注意到的第二个问题是 React Spring 转换。我在 Ring.js,Alarm.js 中使用它并且还想用它来列出 ListAlarms.js[= 中的活动警报40=]。我使用它的方式与前两个组件完全相同,但对于 ListAlarms.js 它不起作用,我不明白为什么。我的目标是显示那些带有转换的活动警报,而不仅仅是 'blink' 那里。
谢谢。
CodeSandBoxlinkhere
您正在过滤掉 objects/references 您应该按 id 过滤掉。
你传递的警报参数是一个对象,你的警报过滤器数组包含对象,找到一个你可以过滤的唯一属性,通过查看你的代码,它应该是 id。
像这样:
function removeAlarm(alarm){
setTime(prevState => ({
...prevState,
alarms:[...prevState.alarms.filter(el => el.id !== alarm.id)]
}))
}
可以进行一些更正,但您必须更改转换
首先你需要按id过滤你的列表,以便正确删除警报。
function removeAlarm(alarm){
setTime(prevState => ({
...prevState,
alarms:[...prevState.alarms.filter(el => el.id !== alarm.id)]
}))
}
其次,我已经从您的过渡中删除了 from
属性,因为每个新对象都位于其他对象之上。此外,我使用映射到每个项目的 id 的键代替 null
。
(item) => item.id
最后我更正了map函数中的顺序
{listAlarmTransitions.map(({ item, props, key }) => (
于是就变成了
const listAlarmTransitions = useTransition(props.alarms, (item) => item.id, {
enter: { opacity: 1 },
leave: { opacity: 0 }
});
return (
<ul>
{listAlarmTransitions.map(({ item, props, key }) => (
<animated.div key={key} style={props}>
<li
key={item.id}
id={item.id}
onClick={() => {
removeAlarm(item);
}}
>
<FontAwesomeIcon icon={faTimesCircle} className="listIcon" />
<h3>{item.message}</h3>
<span>
{item.hour}:{item.minute}
</span>
</li>
</animated.div>
))}
</ul>
);
目前我正在开发闹钟应用程序,我想以某种方式进行,以便您可以添加多个闹钟。每个警报都存储在 alarms:[] 状态的 App.js 文件中。如果添加了闹钟,我想将该闹钟显示为时钟下的 li 元素,我希望能够通过单击 X[=40= 将其删除] 图标。此外,当当前时间 === 为闹钟设置的时间时,Ring.js 组件呈现并且闹钟开始响起。当闹钟响起时,有'turn off'按钮。单击关闭按钮后,如何从状态数组中删除正在响铃的特定警报?
如果满足条件,我已尝试发送 removeAlarm 函数和警报(这可能有助于确定从数组中删除哪个警报)作为此组件的道具。
function checkTime(){
if(time.alarms[0]){
const alarms = time.alarms.map(function(alarm,i){
if(time.currentHour === alarm.hour && time.currentMinute === alarm.minute && time.currentSecond
>= 0){
return <Ring message={alarm.message} key={i} alarm={alarm} removeAlarm={removeAlarm} />
}
})
return alarms;
}
}
移除报警功能:
function removeAlarm(alarm){
setTime(prevState => ({
...prevState,
alarms:[...prevState.alarms.filter(el => el !== alarm)]
}))
}
Ring.js 文件
let message = props.message;
function removeAlarm(alarm){
props.removeAlarm(alarm);
}
function turnOff(e,alarm){
e.preventDefault();
setShowRing(false);
removeAlarm(alarm);
}
<form>
<h3>{message}</h3>
<button onClick={turnOff}>TURN OFF</button>
</form>
我不知道该怎么做。我不知道如何使用该传递的函数或如何在该 onClick 函数中确定这是必须发送到 removeAlarm 函数的按钮,通过状态映射并删除该特定按钮。
我注意到的第二个问题是 React Spring 转换。我在 Ring.js,Alarm.js 中使用它并且还想用它来列出 ListAlarms.js[= 中的活动警报40=]。我使用它的方式与前两个组件完全相同,但对于 ListAlarms.js 它不起作用,我不明白为什么。我的目标是显示那些带有转换的活动警报,而不仅仅是 'blink' 那里。
谢谢。
CodeSandBoxlinkhere
您正在过滤掉 objects/references 您应该按 id 过滤掉。
你传递的警报参数是一个对象,你的警报过滤器数组包含对象,找到一个你可以过滤的唯一属性,通过查看你的代码,它应该是 id。
像这样:
function removeAlarm(alarm){
setTime(prevState => ({
...prevState,
alarms:[...prevState.alarms.filter(el => el.id !== alarm.id)]
}))
}
可以进行一些更正,但您必须更改转换
首先你需要按id过滤你的列表,以便正确删除警报。
function removeAlarm(alarm){
setTime(prevState => ({
...prevState,
alarms:[...prevState.alarms.filter(el => el.id !== alarm.id)]
}))
}
其次,我已经从您的过渡中删除了 from
属性,因为每个新对象都位于其他对象之上。此外,我使用映射到每个项目的 id 的键代替 null
。
(item) => item.id
最后我更正了map函数中的顺序
{listAlarmTransitions.map(({ item, props, key }) => (
于是就变成了
const listAlarmTransitions = useTransition(props.alarms, (item) => item.id, {
enter: { opacity: 1 },
leave: { opacity: 0 }
});
return (
<ul>
{listAlarmTransitions.map(({ item, props, key }) => (
<animated.div key={key} style={props}>
<li
key={item.id}
id={item.id}
onClick={() => {
removeAlarm(item);
}}
>
<FontAwesomeIcon icon={faTimesCircle} className="listIcon" />
<h3>{item.message}</h3>
<span>
{item.hour}:{item.minute}
</span>
</li>
</animated.div>
))}
</ul>
);