javascript - 如何确保一次仅打开/展开 1 个面板?

标签 javascript reactjs user-interface

这里是组件/功能,它是一张可以通过按钮扩展的卡片。 <Viewmore>只不过是一个图像组件。必须使用它,因为图像是 svg。

import React, { useState, useRef } from "react";
import Rating from "@material-ui/lab/Rating";
import Icon1 from "../test.jpeg";
import Viewmore from "./Viewmore";

function Acc(props) {
  const [value, setValue] = React.useState(2);

  const content = useRef(null);

  const [setActive, setActiveState] = useState("");
  const [setHeight, setHeightState] = useState("160px");
  const [setRotate, setRotateState] = useState("icon");

  function toggleAccordion() {
    setActiveState(setActive === "" ? "active" : "");
    setHeightState(
      setActive === "active" ? "160px" : `${content.current.scrollHeight}px`
    );
    setRotateState(setActive === "active" ? "icon" : "icon rotate");
  }

  return (
    <div className="accordian" id={props.id}>
      <div className="accordianHeading">
        <div
          className="container"
          ref={content}
          style={{ maxHeight: `${setHeight}` }}
        >
          <img src={Icon1} className="postimg" />

          <div className="title">
            Nulla adipisicing do ea qui enim id cillum reprehenderit aliquip
            nostrud sint fugiat.
          </div>
          <div className="namedate">asdfasdf | 10th April 2021</div>
          <div classname="content">
            <p>
              Aliquip duis excepteur non ullamco eiusmod cillum cupidatat non
              officia laborum esse tempor est nisi. Aute amet irure ex proident
              commodo reprehenderit cupidatat deserunt dolor eu. Culpa elit
              officia sit id reprehenderit nisi amet tempor reprehenderit fugiat
              sint irure. Laborum pariatur nisi amet minim eiusmod ad occaecat
              ipsum aliquip. Aute dolore culpa ad minim voluptate. Lorem in qui
              pariatur nostrud in velit ad sunt irure mollit commodo. Sit
              voluptate occaecat cupidatat dolor veniam aute amet sit ea
              consequat et voluptate id.
            </p>
          </div>
        </div>
      </div>
      <div className="accordianContent">
        <div className="foot">
          <Rating defaultValue={0} precision={1} />
          <button className="button" onClick={toggleAccordion}>
            <Viewmore className={`${setRotate}`} width={20} fill={"777"} />
          </button>
        </div>
      </div>
    </div>
  );
}

export default Acc;

单击该按钮时,会启动 3 个进程。首先是触发事件状态的事件。这会触发一个事件的 CSS 类并旋转按钮图标。

这是路由到 ReactDOM 的 App.js。

import React, { useState } from "react";
import "./App.css";
import Acc from "./components/Acc";

function App() {
  return (
    <div className="App">
      <Acc />
      <Acc />
      <Acc />
      <Acc />
      <Acc />
      <Acc />
      <Acc />
      <Acc />
    </div>
  );
}

export default App;

如何确保只有 1 <Acc />卡是否一次打开?

最佳答案

有一些不同的方法可以做到这一点,但这是我的建议。

父级(App)有一个状态,谁是事件卡。它传递给每个 child

  1. 是否处于事件状态
  2. 一个 onToggle 回调,让父级知道它点击了。

子进程正在监听 (useEffect) 其状态 (active) 并相应地更新 UI。

App.js

const cards = [1, 2, 3, 4, 5, 6, 7, 8];

export default function App() {
  const [active, setActive] = useState();
  const onToggle = (id) => {
    setActive(id === active ? null : id);
  };
  return (
    <div className="App">
      {cards.map((card) => (
        <Acc
          key={card}
          id={card}
          onToggle={onToggle}
          active={card === active}
        />
      ))}
    </div>
  );
}

Acc.js(仅差异)

useEffect(() => {
  setHeightState(active ? `${content.current.scrollHeight}px` : "160px");
  setRotateState(active ? "icon" : "icon rotate");
}, [active]);
function toggleAccordion() {
  onToggle(id);
  // setActiveState(setActive === "" ? "active" : "");
  // setHeightState(
  //   setActive === "active" ? "160px" : `${content.current.scrollHeight}px`
  // );
  // setRotateState(setActive === "active" ? "icon" : "icon rotate");
}

https://codesandbox.io/s/cranky-cherry-5x9xx?file=/src/App.js


您也可以使用 Context,但我相信这是一种更简单的方法。

关于javascript - 如何确保一次仅打开/展开 1 个面板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67292169/

相关文章:

node.js - X-Content-Encoding-Over-Network 位于响应 header 中,但不位于 Content-Encoding 中

java - Wicket:在页面构造函数外部动态填充 RadioGroup

python - Gtk 笔记本选项卡大小

JavaFX GridPane 对象对齐

reactjs - 设置默认值过滤

javascript - 当我尝试运行 grunt-react 任务时,它会挂起

全局对象数组上的javascript推送方法覆盖数组中的所有值

javascript - 将屏幕截图保存在数据库中

php - 如果 url 与 iframe 标签中设置的不同,则拒绝访问

javascript - Angular 循环误差