【发布时间】:2021-10-13 15:33:07
【问题描述】:
我正在尝试制作一个简单的按钮,当您按下它时,该按钮允许展开一行。现在,我只关心按钮的工作情况并担心以后的细节。但是,当我添加按钮时,它会扩展所有行而不是我单击的行。这是我的代码
import React, {
useState, useEffect,
} from 'react';
import dayjs from 'dayjs';
import dayjsPluginUTC from 'dayjs-plugin-utc';
import PropTypes from 'prop-types';
import CircularProgress from '@material-ui/core/CircularProgress';
import clsx from 'clsx';
import {
FaChevronDown, FaChevronUp,
} from 'react-icons/fa';
dayjs.extend(dayjsPluginUTC);
const Itinerary = ({ itineraryDays, isExpanded }) => {
const [isDetailsOpen, setIsDetailsOpen] = useState(false);
const handleDetailsClick = () => {
setIsDetailsOpen((v) => !v);
};
useEffect(() => {
if (isExpanded.value) {
setIsDetailsOpen(true);
}
}, [isExpanded]);
return (
<div className="grid grid-cols-1 gap-5 mx-2 md:mx-10 my-5 pb-5">
{itineraryDays && itineraryDays.map((destination, index) => (
<div
key={destination.itineraryDayNumber + destination.cityName}
className={clsx('grid grid-cols-4 py-2 text-sm md:text-base', index < itineraryDays.length - 1 && 'border-b-2')}
>
<div>
<div className="font-bold">
{`Day ${destination.itineraryDayNumber}`}
</div>
<div className="text-gray-600">
{dayjs(destination.itineraryDayDate).format('ddd, MMM DD')}
</div>
</div>
<div className="col-span-3">
<div className="text-blue-600">
{destination.cityName}
</div>
<div className="grid grid-flow-col auto-cols-max gap-x-2">
{destination.itineraryDayArrivalDateTime && (
<div className="inline-block text-gray-600">
{`Arrive: ${dayjs(destination.itineraryDayArrivalDateTime).format('h:mm A')}`}
</div>
)}
{destination.itineraryDayArrivalDateTime && destination.itineraryDayDepartureDateTime
&& <div className="border-l-2 justify-self-center" />}
{destination.itineraryDayDepartureDateTime && (
<div className="inline-block text-gray-600">
{`Depart: ${dayjs(destination.itineraryDayDepartureDateTime).format('h:mm A')}`}
</div>
)}
</div>
</div>
<div className="text-blue-600">
<button onClick={handleDetailsClick} type="button">
{!isDetailsOpen
&& (
<>
<span>View details </span>
<FaChevronDown className="inline-block" />
</>
)}
{isDetailsOpen
&& (
<>
<span>Hide details </span>
<FaChevronUp className="inline-block" />
</>
)}
</button>
</div>
</div>
))}
{!itineraryDays && (
<div className="text-center">
<CircularProgress color="secondary" />
</div>
)}
</div>
);
};
Itinerary.propTypes = {
// eslint-disable-next-line react/forbid-prop-types
itineraryDays: PropTypes.array,
isExpanded: PropTypes.shape({
value: PropTypes.bool,
}),
};
Itinerary.defaultProps = {
itineraryDays: undefined,
isExpanded: { value: false },
};
export default Itinerary;
这是我遇到的问题的图片
如您所见,该按钮在每一行上都有效,但我只想展开我单击的行。
【问题讨论】:
-
它应该如何独立地用一个单个状态变量控制多个UI元素?
-
如果
.map()内部的内容是一个单独的组件,并且对应的isDetailsOpen处于其individual 状态,那么您的组件将会更好地组织,这样您就可以独立地切换它们。 -
@YevgenGorbunkov 好的,有道理,谢谢
标签: javascript html reactjs