• Vue3学习(十八) - TreeSelect 树选择


    写在前面

    本以为可以在家学习一天,结果家里来了客人拜年,就没学习上,有点小遗憾吧。

    昨天完成从分类管理的前后端代码复制出文档管理的前后端代码,遗留问题是只能选择一级父分类。值得说的是,昨晚的遗留的问题修复了,开心。

    遗留问题

    点击父文档,弹出警告,从报错来看那意思就是parent应该是一个对象,我却给他一个string字符串。

    解决方案:

    将parent改造为对象:

    node.parent = {'id': node.parent}

    使用树形选择组件选择父节点

    1、从分类管理的前后端代码复制出文档管理的前后端代码

    此处略,参考以前

    2、TreeSelect 树选择使用

    其实就是将原来一级分类,改为可以多级分类选择,这里我们就用TreeSelect选择来实现,示例代码如下:

      v-model="docs_data"
      show-search
      style="width: 100%"
      :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
      placeholder="请选择父文档"
      tree-default-expand-all
      :tree-data="treeSelectData"
      :fieldNames="{label: 'name', key: 'id', value: 'id'}"
      >
    
    
    const treeSelectData = ref();
    treeSelectData.value = [];          

    3、增加对象拷贝及对应选中状态设置

    
       /**
         * 将某节点及其子孙节点全部置为disabled
         */
        const setDisable = (treeSelectData: any, id: any) => {
          // 遍历数组,即遍历某一层节点
          for (let i = 0; i < treeSelectData.length; i++) {
            const node = treeSelectData[i];
            node.parent = {'id': node.parent}
            if (node.id === id) {
            // 将目标节点设置为disabled
            node.disabled = true;
            // 遍历所有子节点,将所有子节点全部都加上disabled
            const children = node.children;
            if (Tool.isNotEmpty(children)) {
              for (let j = 0; j < children.length; j++) {
                setDisable(children, children[j].id)
              }
            }
          } else {
            // 如果当前节点不是目标节点,则到其子节点再找找看。
            const children = node.children;
            if (Tool.isNotEmpty(children)) {
              setDisable(children, id);
            }
          }
        }
      };
    
    
       /**
         * 编辑
         */
        const edit = (record: any) => {
          open.value = true;
          docs_data.value = Tool.copy(record);
          // 不能选择当前节点及其所有子孙节点,作为父节点,会使树断开
          treeSelectData.value = Tool.copy(level1.value);
          setDisable(treeSelectData.value, record.id);
          // 为选择树添加一个"无"
          treeSelectData.value.unshift({id: 0, name: '无'});
        };
    
       /**
         * 新增
         */
        const add = () => {
          open.value = true;
          docs_data.value = {};
          treeSelectData.value = Tool.copy(level1.value);
          // 为选择树添加一个"无"
          treeSelectData.value.unshift({id: 0, name: '无'});
        };
    
        const level1 = ref(); // 一级文档树,children属性就是二级文档
    
        /**
         * 数据查询
         **/
        const handleQuery = () => {
          loading.value = true;
          // 如果不清空现有数据,则编辑保存重新加载数据后,再点编辑,则列表显示的还是编辑前的数据
          docs.value = [];
          axios.get("/doc/all", {}).then((response) => {
            loading.value = false;
            const data = response.data;
            if (data.success) {
              docs.value = data.content;
              level1.value = [];
              level1.value = Tool.array2Tree(docs.value, 0);
            } else {
              message.error(data.message);
            }
          });
        };  

    4、效果

    写在最后

    前端部分代码,尤其对象拷贝部分,真的需要一定代码功底,我会继续努力的,相信很快我也能写出这样的代码。


    __EOF__

  • 本文作者: 久曲健的测试窝
  • 本文链接: https://www.cnblogs.com/longronglang/p/18033185
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    Go语言基准测试(benchmark)三部曲之一:基础篇
    两天学会微服务网关Gateway-Gateway工作原理
    基于安卓android微信小程序美容理发店预约系统app
    pytorch中的Dataloader和dataset详细的collate_fn参数测试
    OpenGL ES freeglut 下载和使用
    自从学会了 CSS resize 属性,我也可以对美女背景大展身手
    新消费时代,零售业的进与退?
    gitHub添加ssh
    Linux系统中Qt应用程序确保使用集成显卡进行图形渲染
    Python 自动化(十七)ORM操作
  • 原文地址:https://www.cnblogs.com/longronglang/p/18033185