javascript - 如何使单击锚点等同于单击详细信息标签?
问题描述
我有一个<details>
标签,点击它会切换一些内容。现在我<a>
在它下面有一个标签,点击<a>
标签我想切换相同的内容,即点击<a>
应该等同于点击<details>
。这是我尝试过的代码片段:
import React, { useState } from "react";
import ReactDOM from "react-dom";
const Menu = ({ toggleDetails }) => {
return (
<div>
<a href="/#" onClick={toggleDetails}>
Open
</a>
</div>
);
};
const Details = (isOpen) => {
return (
<details>
<summary>Hello</summary>
{isOpen ? <div>Hi</div> : null}
</details>
);
};
const App = () => {
const [isOpen, setIsOpen] = useState(false);
const toggleDetails = () => {
setIsOpen(isOpen ? false : true);
};
return (
<div>
<Details isOpen={isOpen} />
<Menu toggleDetails={toggleDetails} />
</div>
);
};
ReactDOM.render(<App />, document.getElementById("container"));
在这里点击“你好”,它会切换“你好”。我想在点击“打开”时做同样的事情,即切换“嗨”。我该怎么做?条件渲染不起作用。我应该使用 ref 来访问<details>
标签的“打开”属性吗?
编辑:
我也尝试了如下的 ref 解决方案,但它没有用:
const Details = (isOpen) => {
const detailsRef = useRef();
// detailsRef.current.open = isOpen
return (
<details ref={detailsRef}>
<summary>Hello</summary>
<div>Hi</div>
</details>
);
};
解决方案
我假设您正在尝试使用 details 标签的本机切换功能。为此,您需要通过open
属性控制打开/关闭状态。然后,您应该使用该onToggle
事件来检测单击摘要元素的时间,这样您就可以使组件的状态与实际 DOM 保持同步。
const Menu = ({ setIsOpen }) => {
return (
<div>
<a
href="#"
onClick={() => {
setIsOpen((prev) => !prev);
}}
>
Open
</a>
</div>
);
};
const Details = ({ isOpen, setIsOpen }) => {
return (
<details
open={isOpen}
onToggle={(event) => {
setIsOpen(event.target.open);
}}
>
<summary>Hello</summary>
<div>Hi</div>
</details>
);
};
const App = () => {
const [isOpen, setIsOpen] = useState(false);
return (
<div>
<Details isOpen={isOpen} setIsOpen={setIsOpen} />
<Menu setIsOpen={setIsOpen} />
</div>
);
};
推荐阅读
- angular - 如何保存语句输入Angular?
- c# - .Net Framework 4.8 for asp.net 中是否包含 C# 7.3 编译器?
- python - 当您同时显式和隐式地使用同一个夹具两次时会发生什么?
- python - Django,在将表单数据提交到数据库后,使用电子邮件转发表单数据
- javascript - 将 $and 和 $or 查询添加到 MongoDB 查询的结构 - 必须是非空数组
- sql-server - 增加 MS SQL 恢复操作的响应时间
- c# - 将代码从 Umbraco v7 复制到 Umbraco v8 时出现问题
- ios - 生成覆盖率报告时出错
- javascript - 提取两个对象(甚至嵌套对象)之间不同的键值什么方法?
- python - MSEdgeDriver (Chromium) 不适用于版本 >= 79.0.313 (Canary)