在react中实现多个面板

167 阅读1分钟

在react中实现多个面板

由于业务上的需求,需要在一个页面中同时打开多个展示信息的面板,且每个面板的状态是独立的,并且面板上展示出的信息也是可控的。

需求

需求:创建一个配置面板,其中包含多个类别,每个类别都有一组属性和多媒体配置。在处理类别切换时,发现当不同类别的属性中存在相同名称的属性时,控制一个类别的显示会影响到另一个类别的显示。

首先,我们删除多余的 categoryProperties 定义,然后统一使用 selectedCategoryProperties 状态变量来存储属性。这样,在处理类别切换时,我们只需检查是否已存在选定类别的属性,如果不存在,则设置它们。

const [selectedCategoryProperties, setSelectedCategoryProperties] = useState({});
​
const handleCategoryChange = (e) => {
  const category = e.target.value;
  setSelectedCategory(category);
  setContent(true);
​
  if (!selectedCategoryProperties[category]) {
    const properties = classData.find((item) => item.id === category)?.properties;
    setSelectedCategoryProperties({
      ...selectedCategoryProperties,
      [category]: properties,
    });
  }
};

接下来,我们更新属性面板的相关代码,确保正确获取选定类别的属性列表。

const categoryProperties = selectedCategory
  ? selectedCategoryProperties[selectedCategory]
  : [];

随后,我们需要在属性面板的状态更新函数中,使用正确的属性列表进行处理。

const handleShowPropertiesPanel = (e) => {
  if (selectedCategory) {
    setCategories((prevCategories) =>
      prevCategories.map((prevCategory) => {
        if (prevCategory.id === selectedCategory) {
          return {
            ...prevCategory,
            panelState: e.target.checked,
            properties: {
              ...prevCategory.properties,
              [e.target.name]: e.target.checked,
            },
          };
        }
        return prevCategory;
      })
    );
  }
};

最后,确保在属性面板中正确显示属性列表。

{content && (
  <div className="property_content">
    {categoryProperties.map((propertyName) => (
      <Checkbox
        key={propertyName.name}
        checked={displayedProperties.includes(propertyName.name)}
        onChange={(e) =>
          handlePropertyChange(propertyName.name, e.target.checked)
        }
      >
        {propertyName.name}
      </Checkbox>
    ))}
  </div>
)}

通过删除多余的状态定义,解决了多个状态和组件交互引发的状态冲突问题。