想知道如何在JSX中的任何位置显示分隔符?例如,我有以下列表,它在单击项目时显示文本:

enter image description here

代码如下:

<Accordion>
  {items.map((item, index) => (
    <AccordionItem key={item.id} item={item} index={index} />
  ))}
</Accordion>

有一个像这样的对象声明列表的内容:

const items = [
    { label: "One", content: "lorem ipsum for more, see https://one.com" },
    { label: "Two", content: "lorem ipsum for more, see https://two.com" },
    {
      label: "Three",
      content: "lorem ipsum for more, see https://three.com",
    },
  ];

Now, I'd like to add a separator after the label "Two" to get something like this: enter image description here

如果我们try 以下方法,我将激活索引0中的元素和索引2中的元素:

<Accordion>
  {items.slice(0, 2).map((item, index) => (
    <AccordionItem key={item.id} item={item} index={index} />
  ))}
  <hr />
  {items.slice(2).map((item, index) => (
    <AccordionItem key={item.id} item={item} index={index} />
  ))}
</Accordion>

Then, getting this incorrect result: enter image description here

为什么会发生这样的事情?因为我的手风琴对象如下:

import { useState, createContext } from "react";

export const AccordionContext = createContext({
  activeItemIndex: 0,
  setActiveItemIndex: () => 0,
});

export const Accordion = (props) => {
  const [activeItemIndex, setActiveItemIndex] = useState(0);

  return (
    <AccordionContext.Provider value={{ activeItemIndex, setActiveItemIndex }}>
      <ul>{props.children}</ul>
    </AccordionContext.Provider>
  );
};

开始时activeItemIndex是0,因此当应用Slice(2)时,第一个元素也是索引0(但是该元素位于索引2).

如何才能使行紧跟在列表中的第二个元素之后?

非常感谢

推荐答案

您可以基于当前索引有条件地呈现分隔符.

...
return (
    <Accordion>
      {items.map((item, index) => (
        <React.Fragment key={item.id}>
          <AccordionItem item={item} index={index} />
          {index === 1 && <hr />}
        </React.Fragment>
      ))}
    </Accordion>
  );

100


Dynamic Solution for any index value:

因此,如果您看到上面的解决方案适用于特定的指数,即1(意味着第二个<AccordionItem />).要使分隔符位置动态化,可以向Accordion组件传递一个props ,指定分隔符索引,然后可以利用这些索引有条件地呈现分隔符.

export const Accordion = ({ separators, children }) => {
  const [activeItemIndex, setActiveItemIndex] = useState(0);

  return (
    <AccordionContext.Provider value={{ activeItemIndex, setActiveItemIndex }}>
      <ul>{children(separators)}</ul>
    </AccordionContext.Provider>
  );
};
// To use
 // const separatorIndices = [2]; // or any dynamic index which you want to provide.
  const separatorIndex = 1; // or this whichever suits your needs

  return (
    <Accordion>
      {items.map((item, index) => (
        <React.Fragment key={item.id}>
          <AccordionItem item={item} index={index} />
          {/* {separatorIndices.includes(index) && <hr />} */}
          {index === separatorIndex && <hr />}
        </React.Fragment>
      ))}
    </Accordion>
  );

100

Javascript相关问答推荐

vanillajs-datepicker未设置输入值,日期单击时未触发更改事件

硬币兑换运行超时

类型自定义lazy Promise. all

我不知道为什么setwritten包装promise 不能像我预期的那样工作

无法在nextjs应用程序中通过id从mongoDB删除'

角色 map 集/spritebook动画,用户输入不停止在键上相位器3

浮动Div的淡出模糊效果

为什么我的列表直到下一次提交才更新值/onChange

如何从调整大小/zoom 的SVG路径定义新的d属性?""

以Angular 实现ng-Circle-Progress时出错:模块没有导出的成员

有条件重定向到移动子域

在SHINY R中的嵌套模块中,不能使用Java代码

如何使用基于promise (非事件emits 器)的方法来传输数据?

如何防止ionic 输入中的特殊字符.?

在JS/TS中将复杂图形转换为数组或其他数据 struct

调用特定数组索引时,为什么类型脚本不判断未定义

在Puppeteer中使用promise进行日志(log)记录时出现TargetCloseError

如何在加载页面时使锚定标记成为焦点

当达到高度限制时,如何裁剪图像?使用html和css

对象作为react 子对象无效(已找到:具有键的对象{type,props}).如果要呈现一个子级集合,请改用数组