javascript - 如何添加新项目并在没有超时的情况下呈现它?反应
问题描述
我有这个代码,基本上是为了向列表中添加一个新项目。
import './styles/app.css'
import {useState, useEffect} from 'react'
const initialList = [
{title: 'Group 1', items: ['Item 1', 'Item 2', 'Item 3']},
{title: 'Group 2', items: ['Item 1', 'Item 2']}
]
function App() {
const [dale, setDale] = useState(true);
const [list, setList] = useState(initialList);
const handleAdd = (e)=>{
setDale(false);
const newList = list;
newList[e.target.parentNode.id-1].items.push('New');
setList(newList);
setTimeout(() => {
setDale(true);
}, 1);
}
return (<div>{dale ? <div className="App" key="app">
{list.map((group, groupI)=>{
return (
<div id={groupI+1} key={groupI+1} className="dnd-group">
<div className="dnd-title">{group.title}</div>
{group.items.map((item, itemI)=>{
return(
<div draggable key={itemI+1}className="dnd-item">
Item {itemI+1}
</div>)
})}
<div className="dnd-añadir-item" onClick={handleAdd}>Add</div>
</div>
)
})}
</div>:<div>No vuic</div> }</div>
);
}
export default App;
如果我删除超时功能和“戴尔”状态,列表会不断更新,但不会在渲染中更新。我想知道如何在没有这种荒谬的超时和“戴尔”状态的情况下呈现更新的列表。
解决方案
代码是同步的handleAdd
,因此在执行时尝试更改显示毫无意义。会发生什么:
- 您将状态更改为
false
- 您将状态更改为
true
相同的同步功能 - React 介入并比较之前和之后的状态:
true === true
计算结果为true
. 状态没有改变,所以 React 不会重新渲染组件。
此外,在编写此代码时,const newList = list;
您并没有按照您应该做的那样克隆状态,您只需在同一个列表上创建一个新的引用。
改为这样写:
const newList = [...list];
推荐阅读
- html - 按下按钮后如何更改按钮颜色?
- mysql - 如何使 MySQL MATCH...AGAINST 使用各种单词分隔符?
- java - 如何使用 java 代码突出显示 Android 中的按钮?
- python - vgg = tf.keras.applications.vgg19.VGG19 不确定模型是否正确加载
- react-native - 如何测试使用 react-i18next 的 react-native 组件?
- ios - 用于插入新对象的 CoreData 语法
- sql - 如何使用子组合对许多单独的表进行有效组合
- python - Python tweepy:仅在机器人启动后发推文
- r - 按组对多个(组合)列执行计算的更有效方法
- xamarin - 在 Xamarin Forms 中如何调用 MainActivity 的方法或从另一个类获取 MainActivity 的“窗口”?