【问题标题】:Dynamic nested accordion with nested children具有嵌套子项的动态嵌套手风琴
【发布时间】:2021-07-25 15:50:49
【问题描述】:

我正在尝试构建一个可重复使用的手风琴,我能够创建一个具有一层的手风琴,但在这里我坚持使用嵌套的手风琴。

到目前为止我已经尝试过什么

App.js

import "./styles.css";
import Accordion from "./Accordion";
import LIST from './Constants';


const listMaker = (item) => {
  let faqItem;
  if (item.children.length === 0) {
    faqItem = (
      <>
        <Accordion title={item.name}></Accordion> <hr />
      </>
    );
  } else {
    let faqItemChildren = item.children.map((item) => {
      let faqItem = listMaker(item);
      return (
        <>
          ${faqItem}
          <hr />
        </>
      );
    });
    faqItem = <Accordion title={item.name}>{faqItemChildren}</Accordion>;
  }
  return faqItem;
};

let listItems = LIST.map((item) => {
  let menuItem = listMaker(item);
  return menuItem;
});

export default function App() {
  return listItems;
}

已添加codesandbox

我是新来的反应,任何帮助表示赞赏

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    dangerouslySetInnerHTML 用于字符串。你不应该给它一个组件数组。但是,无论如何您都不会发送任何名为 content 的道具。我想你的意思是children 那里的道具。只渲染孩子而不是使用dangerouslySetInnerHTML

    在你的 Accordion 组件中替换这个:

    <div
      className="accordion__text"
      dangerouslySetInnerHTML={{ __html: props.content }}
    />
    

    有了这个:

    <div className="accordion__text"> 
      { props.children }
    </div>
    

    【讨论】:

    • 非常感谢我错过了
    • 我重新访问了代码,我有一个疑问。 codesandbox.io/s/ecstatic-monad-1m068。如果我设置为自动,请检查此内容,然后滚动中的内容会消失,但平滑的滚动过渡将不起作用。有没有一种方法可以避免在内容内部滚动并在手风琴的打开和关闭时实现平滑过渡
    • @Remzi 任何方式来实现这一点,我已经尝试过但打开会工作但关闭不会
    【解决方案2】:

    您可以使用children,而不是使用dangerouslySetInnerHTML,因为您需要的是React.ReactChildren 的传播。那只是从 props 调用 {children} 而不是 dangerouslySetInnerHTML

        <div className="accordion__section">
          <button className={`accordion ${setActive}`} onClick={toggleAccordion}>
            <p className="accordion__title">{title}</p>
            <Chevron className={`${setRotate}`} width={10} fill={"#777"} />
          </button>
          <div
            ref={content}
            style={{ maxHeight: `${setHeight}` }}
            className="accordion__content"
          >
            {children}
          </div>
        </div>
    

    这是您的密码箱的forked solution

    此外,作为条件场景,您可以使用三元运算符,而不是将 DOM 设置为变量,这有助于提高可读性。

    const listMaker = (item) => {
      return (
        <>
          {item.children.length === 0 ? (
            <Accordion title={item.name} />
          ) : (
            <Accordion title={item.name}>
              {item.children.map((childItem) => {
                return listMaker(childItem);
              })}
            </Accordion>
          )}
        </>
      );
    };
    

    【讨论】:

    • 非常感谢,只是一个疑问,当我关闭我的父手风琴时如何使我的嵌套手风琴关闭,同时检查分叉的代码框有这个疑问,有没有办法?
    • 以上任何方式
    • 为此,我认为您可以做两件事,一是可以将活动状态推送到父级,即所有手风琴的容器,并使用从 LIST json 检索到的数据从那里处理它,或者另一种方法是在某个时间点保持单个手风琴打开,这会将手风琴的 onChange 推送到父级,并设置活动状态。
    • 这个有没有参考,可能我是新手,没完全理解
    • 这是解决您问题的方法。我还改变了一些不好的做法,所以你可以观察并获得更好的想法。 codesandbox
    猜你喜欢
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多