我有以下问题.在widgetFilters数组(长度==3)中,我想在过滤器的标题中显示所选项目的数量.

  const [selectedFilters, setSelectedFilters] = useState([]); 

enter image description here

在下面的代码snipet中,我映射了所有widgetFilter数组,并使3与标题、过滤器的名称typeName以及过滤器包含的选项一致,例如.

      <Stack>
        {widgetFilters.map((filter) => (
          <FilterWidgetAccordion
            key={filter.id}
            headline={filter.typeName}
            list={filter.options}
            selectedFilters={selectedFilters}
            setSelectedFilters={setSelectedFilters}
          />
        ))}
      </Stack>

enter image description here

FilterWidgetAccordion.js

    <Fragment>
      <Accordion>
        <AccordionSummary aria-controls="panel1a-content" id="panel1a-header">
          <StyledTypography>{headline}</StyledTypography>
        </AccordionSummary>
        <AccordionDetails>
          {list?.map((filterItem) => {
            return(
        
            <Button
              onClick={() => {
                const list = [...selectedFilters];
                const index = list.indexOf(filterItem);
                index === -1 ? list.push(filterItem) : list.splice(index, 1);
                setSelectedFilters(list);
              }}
              key={filterItem.value}
            >
              {filterItem.value} 
            </Button>
          )})}
        </AccordionDetails>
      </Accordion>
    </Fragment>

我想在"Product Category"标题旁边添加所选按钮的数量,如下图所示.

enter image description here

推荐答案

您必须 for each 小部件分离过滤器,然后在标题中显示过滤器长度,以下是一个示例:

  const updateWidgetFilters=(myFilters, widgetTypeId)=>{
    setSelectedFilters((prevSelectedFilters)=>{
      const selectedElement = prevSelectedFilters?.find(({typeId})=>typeId===widgetTypeId);
      if(selectedElement) {
        selectedElement.filters= myFilters;
        return [...prevSelectedFilters]
      }
      return [...prevSelectedFilters, {typeId: widgetTypeId, filters: myFilters}]; 
    });
  }

...

  <Stack>
    {widgetFilters.map((filter) => (
      <FilterWidgetAccordion
        key={filter.id}
        headline={
              filter.typeName+' '
              +(selectedFilters?.find(({typeId})=>typeId===filter.typeId)?.filters?.length || 0)
        }
        list={filter.options}
        selectedFilters={selectedFilters?.find(({widgetId})=>typeId===filter.typeId)?.filters || []}
        setSelectedFilters={(filters)=>updateWidgetFilters(filters, filter.typeId)}
      />
    ))}
  </Stack>

Javascript相关问答推荐

可以的.是否可以在不预编译的情况下使用嵌套 Select 器?

单击子元素时关闭父元素(JS)

yarn安装一个本地npm包,以便本地包使用main项目的node_modules(ckeditor-duplicated-modules错误)

使搜索栏更改语言

数字时钟在JavaScript中不动态更新

如何在bslib nav_insert之后更改导航标签的CSS类和样式?

Ember.js 5.4更新会话存储时如何更新组件变量

正则表达式,允许我匹配除已定义的子字符串之外的所有内容

创建以键值对为有效负载的Redux Reducer时,基于键的类型检测

Reaction Redux&Quot;在派单错误中检测到状态Mutations

在画布中调整边上反弹框的大小失败

在FAQ Accodion应用程序中使用React useState时出现问题

以编程方式聚焦的链接将被聚焦,但样式不适用

自定义确认组件未在vue.js的v菜单内打开

在表单集中保存更改时删除';禁用';

如何在尚未创建的鼠标悬停事件上访问和着色div?

如何使用puppeteer操作所有选项

用内嵌的含selenium的Java脚本抓取网站

如何从图表中映射一组图表-js使用REACT

如何将缓冲区数组转换回音频