返回

点击省市区选择地区时,将勾选结果展现到右侧面板

前端







## 级联面板组件实现

为了实现级联面板组件,需要做的第一步是定义一个名为 `CascadePanel` 的 React 组件。这个组件将负责管理左侧区域的数据展示,以及处理用户点击父级节点时联动展示子级数据的逻辑。

```javascript
import React, { useState } from 'react';

const CascadePanel = () => {
  // 定义省市区数据
  const data = [
    {
      id: 1,
      name: '北京市',
      children: [
        { id: 2, name: '东城区' },
        { id: 3, name: '西城区' },
        { id: 4, name: '朝阳区' }
      ]
    },
    {
      id: 5,
      name: '上海市',
      children: [
        { id: 6, name: '黄浦区' },
        { id: 7, name: '徐汇区' },
        { id: 8, name: '长宁区' }
      ]
    },
    {
      id: 9,
      name: '广东省',
      children: [
        { id: 10, name: '广州市' },
        { id: 11, name: '深圳市' },
        { id: 12, name: '佛山市' }
      ]
    }
  ];

  // 定义勾选状态
  const [checked, setChecked] = useState({});

  // 处理点击父级节点时的逻辑
  const handleParentClick = (id) => {
    // 展开父级节点
    setChecked((prevChecked) => ({
      ...prevChecked,
      [id]: !prevChecked[id]
    }));

    // 联动展示子级数据
    const children = data.find((item) => item.id === id).children;
    children.forEach((child) => {
      setChecked((prevChecked) => ({
        ...prevChecked,
        [child.id]: !prevChecked[child.id]
      }));
    });
  };

  // 处理勾选状态改变时的逻辑
  const handleChange = (id) => {
    setChecked((prevChecked) => ({
      ...prevChecked,
      [id]: !prevChecked[id]
    }));
  };

  // 渲染左侧区域
  const renderLeftPanel = () => {
    return (
      <ul>
        {data.map((item) => (
          <li key={item.id}>
            <input type="checkbox" checked={checked[item.id]} onChange={() => handleParentClick(item.id)} />
            {item.name}
            {item.children && (
              <ul>
                {item.children.map((child) => (
                  <li key={child.id}>
                    <input type="checkbox" checked={checked[child.id]} onChange={() => handleChange(child.id)} />
                    {child.name}
                  </li>
                ))}
              </ul>
            )}
          </li>
        ))}
      </ul>
    );
  };

  // 渲染右侧区域
  const renderRightPanel = () => {
    const selectedItems = [];
    for (const id in checked) {
      if (checked[id]) {
        const item = data.find((item) => item.id === Number(id));
        selectedItems.push(item.name);
      }
    }
    return (
      <ul>
        {selectedItems.map((item) => (
          <li key={item}>{item}</li>
        ))}
      </ul>
    );
  };

  return (
    <div>
      <div className="left-panel">
        {renderLeftPanel()}
      </div>
      <div className="right-panel">
        {renderRightPanel()}
      </div>
    </div>
  );
};

export default CascadePanel;

在上面这个示例中,我们首先定义了省市区数据,然后使用 useState 钩子定义了勾选状态,再定义了处理点击父级节点和勾选状态改变时的逻辑。最后,我们分别渲染了左侧区域和右侧区域,在左侧区域展示省市区数据,点击父级节点后联动展示子级数据,在右侧区域展示勾选结果。

结语

这篇关于级联面板组件的文章由 AI 螺旋创作器生成。希望这篇文章对您有所帮助。如果您有任何疑问,请随时提问。