react手写树形菜单

288 阅读1分钟

参考视频

const Tree = ({ data }) => (
    <ul className={styles.tree}>
      {data?.map((item) => {
        return (
          <li className={`${styles.treeItem} ${styles[item.open]}`} key={item?.id}>
            <div
              className={
                item.checked ? `${styles.itemContent} ${styles.checked}` : styles.itemContent
              }
              onMouseEnter={() => {
                clearRoot(rootData, 'hover');
                item.hover = true;
                setRoot([...rootData]);
              }}
              onMouseLeave={() => {
                clearRoot(rootData, 'hover');
                setRoot([...rootData]);
              }}
              onClick={() => {
                if (item.open !== '') {
                  if (item.open == 'open') {
                    item.open = 'close';
                  } else {
                    item.open = 'open';
                  }
                }
                // console.log(item);
                clearRoot(rootData, 'check');
                item.checked = true;
                setRoot([...rootData]);
              }}
            >
              <div className={styles.titleBox}>
                <Spread open={item.open} onClick={() => {}} />
                <div className={styles.title}>
                  {searchValue ? (
                    <div style={{ whiteSpace: 'nowrap' }}>
                      {item.name.split(searchValue)[0]}
                      {(item.name.indexOf(searchValue) > -1 ||
                        PinyinMatch.match(item.name, searchValue)) && (
                        <span style={{ color: 'red' }}>{searchValue}</span>
                      )}
                      {item.name.split(searchValue)[1]}
                    </div>
                  ) : (
                    item.name
                  )}
                </div>
                {!initData.some((i) => `${i.id}` === `${item.id}`) && (
                  <div
                    className={styles.subscribed}
                    onClick={(e) => {
                      e.stopPropagation();
                      item.subscribed = true;
                      setRoot([...rootData]);
                    }}
                  >
                    {!item.subscribed && item.hover && (
                      <Tooltip placement="top" title="订阅">
                        <PlusOutlined style={{ fontSize: '16px', color: '#1677ff' }} />
                      </Tooltip>
                    )}
                    {item.subscribed && (
                      <Tooltip placement="top" title="已订阅">
                        <CheckOutlined style={{ fontSize: '16px', color: 'rgba(0,0,0,0.45)' }} />
                      </Tooltip>
                    )}
                  </div>
                )}
              </div>
            </div>

            {item?.child && <Tree data={item?.child} />}
          </li>
        );
      })}
    </ul>
  );