【发布时间】:2019-08-03 17:44:17
【问题描述】:
我正在创建一个简单的 Magic The Gathering 搜索引擎。愿景是拥有一个搜索结果列表,当点击搜索结果时,主显示屏会呈现有关所选卡片的扩展信息。
顶级App 组件包含要显示的卡片的状态,ScrollView 组件维护所选卡片的状态,仅在列表中突出显示所选卡片。我向下传播setDisplayCard 处理程序,这样当在列表中单击卡片时,我可以将显示卡片设置为回调。
function App(props) {
const [displayCard, setDisplayCard] = useState(null)
return (
<div className="App">
<SearchDisplay handleCardSelect={setDisplayCard}/>
<CardDisplay card={displayCard} />
</div>
);
}
function SearchDisplay({handleCardSelect}) {
const [cards, setCards] = useState([]);
useEffect(() => {
(async () => {
const cards = await testCardSearch();
setCards(cards);
})();
}, []);
async function handleSearch(searchTerm) {
const searchCards = await cardSearch({name: searchTerm});
setCards(searchCards)
};
return (
<StyledDiv>
<SearchBar
handleSubmit={handleSearch}
/>
<ScrollView
handleCardSelect={handleCardSelect}
cards={cards}
/>
</StyledDiv>
);
}
function ScrollView({cards, handleCardSelect}) {
const [selected, setSelected] = useState(null);
return (
<ViewContainer>
{cards.map((card, idx) =>
<li
key={idx}
style={selected === idx ? {backgroundColor: "red"} : {backgroundColor: "blue"}}
onClick={() => {
setSelected(idx);
handleCardSelect(card);
}}
>
<Card card={card} />
</li>
)}
</ViewContainer>
);
}
我遇到的问题是调用setDisplayCard 会重新呈现我的ScrollView 并消除其所选卡的本地状态,因此我无法突出显示列表中的活动卡。根据我对反应的理解,我不明白为什么ScrollView 会重新渲染,因为它不依赖于displayCard 的状态。而且我不确定采取什么方法来解决它。当我点击列表中的一张卡片时,我希望它会突出显示为红色。
【问题讨论】:
标签: javascript reactjs react-hooks