React树形菜单

基于react写的一个树形菜单
有需要的可以看下

git@github.com/mkgrow/react-tree-menu-simple.git

有问题可以随时联系我

react-tree.jpg
import React, { useState } from "react";
import plus from './assets/plus.svg';
import minus from './assets/minus.svg';

import styles from './index.less';

const Children = ({ data = [], selectedMenu, onChange, icons = [], iconClassName = '', valueClassName = '', dropdownClassName = '', selectedClassName }) => {
  const [parent, setParent] = useState();

  const handleParentClick = (it) => {
    if (it?.children) {
      setParent(parent?.value === it?.value ? {} : it)
    } else {
      onChange(it)
    }
  };

  return (
    <div className={`${styles.children} ${dropdownClassName}`}>
      {
        data?.map((it, index) => {
          const isParentSelected = parent?.value === it?.value;
          const isMenuSelected = selectedMenu?.value === it?.value;
          const hasChildren = it?.children?.length;

          return (
            <div key={`${it?.value}-${index}`}>
              <div className={styles.child} onClick={() => handleParentClick(it)}>
                <div className={`${styles.icon} ${iconClassName}`}>
                  {hasChildren && isParentSelected && <img src={icons?.[0] ?? minus} alt=""/>}
                  {hasChildren && !isParentSelected && <img src={icons?.[1] ?? plus} alt=""/>}
                </div>
                <div className={`${valueClassName} ${isMenuSelected ? selectedClassName ?? styles.selected : ''} ${styles.text} ${it?.className ?? ''} `}>{it?.value}</div>
              </div>
              {hasChildren && isParentSelected && (
                <Children
                  data={it?.children}
                  onChange={onChange}
                  icons={icons}
                  selectedMenu={selectedMenu}
                  iconClassName={iconClassName}
                  valueClassName={valueClassName}
                  selectedClassName={selectedClassName}
                  dropdownClassName={dropdownClassName}
                />
              )}
            </div>
          )
        })
      }
    </div>
  )
};

const Tree = ({ data = [], icons, onSelect, className = '', iconClassName = '', valueClassName = '', dropdownClassName = '', selectedClassName = '' }) => {
  const [selectedMenu, setSelectedMenu] = useState();

  const handleChange = (v) => {
    setSelectedMenu(v);
    onSelect?.(v)
  };

  return (
    <div className={`${className} ${styles.tree}`}>
      <Children
        data={data}
        icons={icons}
        selectedMenu={selectedMenu}
        dropdownClassName={dropdownClassName}
        iconClassName={iconClassName}
        valueClassName={valueClassName}
        selectedClassName={selectedClassName}
        onChange={handleChange}
      />
    </div>
  )
};

export default Tree;
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容