树形控件+自定义图片+收藏渲染与取消

import { useEffect, useState } from "react";
import { Tree } from "antd";
import { PlayCircleOutlined, DownOutlined } from "@ant-design/icons";
import JianKongImg from "./assets/images/icon_jk.png";
import ShouCangImg from "./assets/images/icon_sc.png";
import ShouCangImg2 from "./assets/images/icon_sc_2.png";
import "./App.css";

const { TreeNode } = Tree;

function App() {
  const treeData = [
    {
      title: "parent 1",
      key: "0-0",
      children: [
        {
          title: "parent 1-0",
          key: "0-0-0",
          imgSrc: [ShouCangImg, JianKongImg, ShouCangImg2],
          children: [
            {
              title: "leaf",
              key: "0-0-0-0",
              imgSrc: [ShouCangImg, JianKongImg, ShouCangImg2],
            },
            {
              title: "leaf",
              key: "0-0-0-1",
              imgSrc: [ShouCangImg, JianKongImg, ShouCangImg2],
            },
            {
              title: "leaf",
              key: "0-0-0-2",
              imgSrc: [ShouCangImg, JianKongImg, ShouCangImg2],
            },
          ],
        },
        {
          title: "parent 1-1",
          key: "0-0-1",
          imgSrc: [ShouCangImg, JianKongImg, ShouCangImg2],
          children: [
            {
              title: "leaf",
              key: "0-0-1-0",
              imgSrc: [ShouCangImg, JianKongImg, ShouCangImg2],
            },
          ],
        },
        {
          title: "parent 1-2",
          key: "0-0-2",
          imgSrc: [ShouCangImg, JianKongImg, ShouCangImg2],
          children: [
            {
              title: "leaf",
              key: "0-0-2-0",
              imgSrc: [ShouCangImg, JianKongImg, ShouCangImg2],
            },
            {
              title: "leaf",
              key: "0-0-2-1",
              imgSrc: [ShouCangImg, JianKongImg, ShouCangImg2],
            },
          ],
        },
      ],
    },
  ];
  const [shoucang, setShouCang] = useState([]); //收藏列表

  const [selectedKeys, setSelectedKeys] = useState([]);
  const [count, setcount] = useState(0);
  const onSelect = (selectedKeys, info) => {
    console.log("selected", selectedKeys, info);
    // setSelectedKeys(selectedKeys);
  };
  const handleImgClick = (e, key) => {
    e.stopPropagation(); // 阻止事件冒泡,避免触发上层节点的 onSelect 事件
    setSelectedKeys([key]);
    let newSelectedKeys;
    if (selectedKeys.some((item) => item === key)) {
      // 如果已经选中了,则取消选中
      newSelectedKeys = selectedKeys.filter((k) => k !== key);
    } else {
      // 如果未选中,则添加到选中列表中
      newSelectedKeys = [...selectedKeys, key];
    }
    setSelectedKeys(newSelectedKeys);
    console.log("收藏", e, key);

    const node = findNodeByKey(treeData, key);
    if (!node) return;

    // 如果已经收藏了,则取消收藏
    if (shoucang.some((item) => item.key === key)) {
      setShouCang(shoucang.filter((item) => item.key !== key));
    } else {
      // 如果未收藏,则添加到收藏列表中
      setShouCang([...shoucang, node]);
    }
  };

  // 递归查找树节点
  const findNodeByKey = (data, key) => {
    for (let i = 0; i < data.length; i++) {
      const item = data[i];
      if (item.key === key) {
        return item;
      } else if (item.children) {
        const node = findNodeByKey(item.children, key);
        if (node) return node;
      }
    }
    return null;
  };

  // 渲染收藏列表
  const renderShoucangList = () => {
    return shoucang.map((item) => (
      <ul className="sc-list" key={item.key}>
        <li>
          <img src={item.imgSrc[1]} alt="" />
        </li>
        <li>{item.title}</li>
        <li>
          <img
            src={ShouCangImg}
            alt=""
            onClick={(e) => handleImgClick(e, item.key)}
          />
        </li>
      </ul>
    ));
  };

  function renderTreeNodes(data) {
    return data.map((item) => {
      const { title, imgSrc, children, key } = item;

      const isSelected = selectedKeys.includes(key);
      // const isSelected = selectedKeys.splice(key);

      return (
        <TreeNode
          icon={<PlayCircleOutlined />}
          title={
            <span>
              {imgSrc && (
                <img
                  src={imgSrc[1]}
                  alt=""
                  style={{ marginLeft: 8, maxWidth: 24 }}
                />
              )}
              {title}
              {imgSrc && (
                <img
                  onClick={(e) => handleImgClick(e, key)}
                  src={isSelected ? imgSrc[0] : imgSrc[2]}
                  alt=""
                  style={{ marginLeft: 8, Width: 20, height: 20 }}
                />
              )}
            </span>
          }
          key={key}
          onClick={() => onSelect([key])}
        >
          {children && renderTreeNodes(children)}
        </TreeNode>
      );
    });
  }
  // useEffect(() => {
  //   console.log(selectedKeys, "要渲染的值");
  //   let SCguolv = treeData.key;
  //   setShouCang(SCguolv);
  // }, [selectedKeys]);
  return (
    <div id="box">
      <div id="left">
        <Tree
          id="tree-box"
          showLine
          switcherIcon={<DownOutlined />}
          defaultExpandedKeys={["0-0-0", "0-0-1"]}
          onSelect={onSelect}
        >
          {renderTreeNodes(treeData)}
        </Tree>
      </div>
      <div id="right">{renderShoucangList()}</div>
    </div>
  );
}

export default App;



#box{
  width: 100vw;
  height: 100vh;
  position: relative;
  background-color: dimgray;
}

#left{
  
  width: 463px;
  height: 417px;
  position: absolute;
  top: 200px;
  left: 400px;
  background-color: lightseagreen;
}

#right{
  
  width: 463px;
  height: 417px;
  position: absolute;
  top: 200px;
  right: 400px;
  background-color: lightseagreen;
 
}
#right>.sc-list{
  width: 463px;
  padding: 0;
  display: flex;
  justify-content:center;
  align-items: center;
  list-style: none; /* 取消默认的列表样式 */
}
#right>.sc-list>li{
  width: 40px;
  height: 30px;
  line-height: 28px;
  text-align: center;
  /* border: 1px solid red; */
}

#right>.sc-list>li:nth-of-type(2){
  width: 200px;
  text-align: start;
}
#right>.sc-list>li:nth-of-type(3){
  width: 180px;
  text-align: end;
}
.ant-tree {
   background-color:lightseagreen ;
   overflow-y: scroll;
   overflow-x: hidden;
   /* 隐藏默认的滚动条 */

}
::-webkit-scrollbar {
  width: 4px;
  height: 0;
}

/* 定义滚动条轨道的样式 */
::-webkit-scrollbar-track {
  background-color: lightseagreen;
}

/* 定义滚动条滑块的样式 */
::-webkit-scrollbar-thumb {
  background-color: #ce0b0b;
  border-radius: 10px;
}
/* 定义滚动条滑块悬停时的样式 */
::-webkit-scrollbar-thumb:hover {
  background-color: #a1a1a1;
}

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
特点1:美化的并且可自定义的外观 该下拉框使用JS进行渲染。下拉框样式如下: 该外观是由CSS和图片控制。通过修改CSS可以很方便地实现更改外观。 QUI树形下拉框不存在IE6中无法被浮动层遮住等问题。 特点2:使用简单 引入脚本和相应的CSS之后, 在页面写如下的HTML代码: 然后为其指定JSON数据即可。数据格式: var zNodes1 =[ { id:1, pId:0, name:"父节点1",open:true}, { id:11, pId:1, name:"叶子节点11"}, { id:12, pId:1, name:"叶子节点12"}, { id:13, pId:1, name:"叶子节点13"}, { id:2, pId:0, name:"父节点2 ",open:true}, { id:211, pId:2, name:"叶子节点21"}, { id:212, pId:2, name:"叶子节点22"}, { id:213, pId:2, name:"叶子节点23"}, { id:214, pId:2, name:"叶子节点24"} ]; 特点3:控制某些节点不可选 如果希望某些子节点(例如父节点)不可选择,为该项JSON数据设置clickExpand:true即可,这样点击后不会选中项,而是展开子节点。 特点4:触发close事件 可以为selectTree的div添加close事件,每当内容层关闭时会调用。通过这种方式可以将选中项传递给hidden表单元素,用于提交表单。 特点5:自定义图标 下拉框树结构每个节点都可以自定义图标。效果如下: 特点6:宽度处理 QUI树形下拉框对于宽度的处理方式是:默认会有一个宽度,当树结构过宽则内容层会增大宽度用于自适应里面的内容。 还可以为下拉框和内容层强制指定一个宽度。效果如下: 特点7:树形下拉框可编辑 为下拉框代码添加一个editable="true"属性,就把它变成了一个可编辑的下拉框,效果如下: 特点8:可通过AJAX方式加载数据 下拉框的树结构可以通过ajax方式加载。详情请参见在线相关示例。 特点9:变成树形多选下拉框 为下拉框添加multiMode="true"属性,可以把它变成树形多选下拉框。效果如下: 当选择完毕后,鼠标移入可以显示所有选择的选项提示。效果如下: 特点10:树形多选下拉框的不分组模式 改变树形多选下拉框的JSON数据,让其不分组。那么就变成一个select多选下拉框。效果如下: 特点11:树形下拉框的验证 结合QUI框架的验证机制,可以方便地为树形下拉框添加验证。效果如下: 特点12:树形下拉框动态增删改选项 树形下拉框支持动态增删改选项。结合ajax机制可以方便地实现如下效果: 添加一个节点后的效果: 特点13:完美的浏览器兼容性 无论是IE6、IE7、IE8、IE9还是FireFox、Chrome、Safira,甚至在Linux下都保持功能与外观的一致性。 声明:本组件内部的树结构采用的是zTree组件,感谢zTree组件作者的支持与授权。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值