Используя React, как мне обратиться к ближайшему элементу родительского элемента с определенным именем класса?
Код ниже:
const Skill = props => (
<div className="skill-card">
<div className="skill-header">
<div className="skill-header-text">
<div className="skill-header-img-container">
<img src={require('../../img/projects/skills/' + props.skill.image)} alt={props.skill.name} className="skill-image" />
</div>
<div className="skill-heading"><h2 className="skill-name">{props.skill.name}</h2></div>
</div>
<div className="skill-header-icon">
<FontAwesomeIcon icon={"angle-" + props.angle} onClick={props.click} />
</div>
</div>
<div className="skill-body">
...
</div>
</div>
);
class Skills extends Component {
...
handleClick = () => {
// Add style to the closest skill-body in here!
}
}
В этом случае, когда я нажимаю FontAwesomeIcon
, я хочу, чтобы открылся элемент div
с className skill-body
.
Сначала я подумал, что использование состояний было бы хорошо, но, безусловно, все элементы skill-body
откроются после нажатия FontAwesomeIcon
. Мой подход заключается в добавлении стилей к skill-body
(display: block
и display: none
).
Как я могу ссылаться на skill-body
внутри функции Component
с помощью handleClick
?
РЕДАКТИРОВАТЬ: Использовал пример функционального компонента HMR, и я все еще застрял.
const Skills = ({ skills }) => (
<div>
{skills.map(skill => (
<SkillContainer key={skill._id} skill={skill} />
))}
</div>
);
const Skill = ({ skill, open, toggle, data }) => (
<div>
<h4 onClick={toggle}>skill: {skill} {data.name}</h4>
{open && <div>{data.description}</div>}
</div>
);
const SkillContainer = ({ skill }) => {
const [open, setOpen] = React.useState(false);
const [data, setData] = React.useState({ skills: [] });
const toggle = React.useCallback(() => setOpen(open => !open), []);
useEffect(() => {
const fetchData = async () => {
const result = await
axios("http://localhost:5000/api/skills/");
setData(result.data);
}
fetchData();
}, []);
return React.useMemo(() => Skill({ skill, open, toggle, data }), [open,
skill, toggle, data]);
}
export default Skills;
До сих пор, прочитав документацию useHook
. То, что я хочу сделать, это собрать данные с помощью axios
, а затем установить содержимое с ним.