我是 React 新手,正在开发一个应用程序(使用 React 钩子),它基本上是 Trello 板或看板板的克隆,因此一组列表显示为列,其中每个列表都有许多卡片。用户可以添加新列表并将新卡片添加到列表中(除了将卡片从列表拖放到列表中),这就是我遇到问题的地方。
当这个视图加载时,我用来自数据库的一个对象填充一个状态变量lists,列表对象数组的形式,每个对象数组都有一个卡片对象数组,基本上结构如下:
[
{
listId: 0,
listTitle: 'List Title',
cards: [
{
cardId: 0,
cardText: 'some text'
},
{
cardId: 1,
cardText: 'some text'
}
]
},
{
listId: 1,
listTitle: 'Another title',
cards: [ ... ]
},
{
listId: 2,
listTitle: 'Yet another',
cards: [ ... ]
}
]
我负责这个视图的组件基本上是这样的:
function Board() {
const [lists, setLists] = useState([]);
const addList = (listTitle) => {
// adds list to db and updates lists state with new array
}
const addCard = (listId, cardText) => {
// adds card to db and updates lists state with new array
}
useEffect(() => {
api.getLists()
.then((listData) => {
setLists(listData)
})
.catch((error) => {
console.log(error);
})
}, []);
return (
<main>
{lists.map((list) => <List key={list.id} listId={list.id} title={list.title} cards={list.cards} addCard={addCard} />)}
<AddElementPanel addElement={addList} />
</main>
);
}
function List({ title, cards, listId, addCard }) => {
return (
<section>
<h2>{title}</h2>
<ul>
{listCards.map((card) => <Card key={card.id} text={card.text} />)}
</ul>
<AddElementPanel listId={listId} addElement={addCard} />
</section>
);
}
function Card({ text }) {
return (<li>{text}</li>);
}
我的问题是,当用户想要添加新卡片或列表时,数据会被插入到数据库中,但我知道如何显示更改的唯一方法是执行类似setList[...newList]的操作,这当然会导致每个列表和卡片重新渲染。这对我来说似乎并不理想,因为如果我向一个列表添加新列表或新卡片,未更改的列表将重新呈现。我知道这对于当前的设置来说没什么大不了的,但是如果子组件中需要发生一些非常昂贵的事情,或者有大量数据,那么如何更好地构建呢?
从研究来看,似乎像 Redux 或其他状态管理库这样的东西可能会更有效地管理这样的状态,尽管我不能 100% 确定这对于像这样尚未学习 Redux 的情况是否准确。我也很好奇是否有更简单的解决方案,或者更好的方法来首先进行设置以防止这种行为?我尝试将 List 组件包装在 React.memo 中,但这似乎没有什么不同,所以我要么做错了,要么没有考虑到影响它的东西。如果有人能指出我正确的方向,我将不胜感激。