【发布时间】:2021-01-12 18:02:36
【问题描述】:
我是 React 的初学者。我有一个项目,我正在做一些示例旅行。我想使用“阅读更多/显示更少”功能来描述每次旅行。阅读更多/显示更少按钮正在切换,但是当我希望它仅切换单击的游览时,它会在单击时显示所有游览的或多或少的描述。换句话说,它正在更新所有游览的状态,而不仅仅是被点击的那个。希望这是有道理的。请帮忙!提前致谢。
import React, { useState, useEffect } from 'react';
import './index.css';
const url = 'https://course-api.com/react-tours-project';
const Tour = () => {
const [tourItem, setTourItem] = useState('');
const removeItem = (id) => {
let newList = tourItems.filter((item) => item.id !== id);
setTourItem(newList);
};
const [fetchingData, setFetchingData] = useState(true);
useEffect(() => {
const abortController = new AbortController();
const fetchUrl = async () => {
try {
const response = await fetch(url, {
signal: abortController.signal,
});
if (fetchingData) {
const data = await response.json();
setTourItem(data);
}
setFetchingData(false);
} catch (e) {
console.log(e);
}
};
fetchUrl();
return () => {
//cleanup!
abortController.abort();
};
});
const tourItems = Object.values(tourItem);
const [readMore, setReadMore] = useState(false);
return (
<>
{tourItems.map((item) => {
return (
<div key={item.id}>
<article className='single-tour'>
<img src={item.image} alt={item.name} />
<footer>
<div className='tour-info'>
<h4>{item.name}</h4>
<h4 className='tour-price'>
${item.price}
</h4>
</div>
{readMore ? (
<p>
{item.info}
<button
onClick={() => setReadMore(false)}
>
Show Less
</button>
</p>
) : (
<p>
{item.info.slice(0, 450) + '...'}
<button
onClick={() => setReadMore(true)}
>
Read More
</button>
</p>
)}
<button
className='delete-btn'
onClick={() => removeItem(item.id)}
>
Not Interested
</button>
</footer>
</article>
</div>
);
})}
</>
);
};
export default Tour;
【问题讨论】:
-
您为您呈现的所有项目保持一种状态 (
readMore)。因此,任何项目的变化都会导致每个项目的变化。您可以创建一个TourItem组件,该组件具有所需的所有逻辑,包括内部readMore状态,并从父组件中删除状态。 -
如果你真的想在父组件中保持状态,你可以保持一个对象作为状态。例如,您将
readMore存储为值,将 id 作为索引:{'0': false, '1': true}表示 id 为 '0' 的项目未展开,但 id 为 '1' 的项目是。 -
谢谢!那么,像这样的事情?
const [readMore, setReadMore] = useState({'0': false, '1': true})那么在我的onClick中,我会setReadMore(0)吗?只是想知道如何选择仅在onClick中单击的那个。 -
不,你应该设置整个对象。如果要设置 id 为 3 的项目的扩展状态,请执行以下操作:
setReadMore(readMore => ({...readMore, 3: true}))。阅读有关functional update here 的更多信息。但是再次移动TourItem组件中的状态可能会对您有更多帮助。请记住,设置状态会导致组件及其子组件重新渲染。 -
非常感谢!!!!