elementUI tree树和loadNode和dialog

本文介绍了在elementUI中使用dialog和tree组件时遇到的问题,特别是loadNode仅加载一次的限制。为了解决在查询后重置tree的问题,文章提出通过设置node.loaded为false及node.expand()来重置特定层级的树节点。此外,文章还分享了dialog和tree的封装代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dialog 和 tree树的一个功能小组件

我们先来看一下样式
**加粗样式**
这里我们对dialog进行一个封装 ,tree树也进行了封装。我们这次采用的懒加载方式。

tree树遇到的最大的问题loadNode只加载一次。所以我们点击查询的时候想重置操作

我查了下文档没有怎么样重置loadNode的方法,然后经过大佬解答我们需要用node.loaded = false; node.expand();重置这层树。
下边为了方便将代码送给大家
对dealog的封装

<template>
  <el-dialog
    custom-class="w-modal-wrp"
    :width="width"
    :top="top"
    :title="title"
    :center="true"
    :show-close="showClose"
    :append-to-body="appendToBody"
    :close-on-click-modal="false"
    :close-on-press-escape="false"
    :visible.sync="dialogVisible"
    :before-close="beforeClose"
    @closed="onClosed"
  >
    <div v-loading="loading">
      <div class="w-modal_content">
        <slot />
      </div>
    </div>
    <template slot="footer">
      <el-button
        v-if="cancelButton"
        size="small"
        :disabled="loading"
        @click="doCancel()"
      >
        {{ cancelText }}
      </el-button>
      <el-button
        v-if="submitButton"
        size="small"
        :disabled="loading"
        @click="doSubmit()"
      >
        {{ submitText }}
      </el-button>
    </template>
  </el-dialog>
</template>

<script>
import { Button, Dialog } from 'element-ui';

export default {
  name: 'w-modal',
  components: {
    [Button.name]: Button,
    [Dialog.name]: Dialog,
  },
  props: {
    loading: Boolean,
    width: {
      type: String,
      default: '480px',
    },
    top: {
      type: String,
      default: '30px',
    },
    center: {
      type: Boolean,
      default: false,
    },
    showClose: {
      type: Boolean,
      default: false,
    },
    appendToBody: {
      type: Boolean,
      default: true,
    },
    cancelButton: {
      type: Boolean,
      default: true,
    },
    cancelText: {
      type: String,
      default: '关闭',
    },
    submitButton: {
      type: Boolean,
      default: true,
    },
    submitText: {
      type: String,
      default: '保存',
    },
    title: String,
    beforeClose: Function,
  },
  data() {
    return {
      dialogVisible: false,
    };
  },
  methods: {
    show() {
      this.dialogVisible = true;
    },
    close() {
      this.dialogVisible = false;
    },
    doCancel() {
      this.$emit('cancel');
      this.close();
    },
    doSubmit() {
      this.$emit('submit');
    },
    onClosed() {
      this.$emit('closed');
    },
  },
};
</script>

<style lang="less">
.w-modal-wrp {
  .el-dialog__header {
    background-color: #f6f7fb;
    padding: 10px 20px;
    .el-dialog__headerbtn {
      top: 12px;
      font-weight: bold;
      font-size: 18px;
    }
  }
  .el-dialog__body {
    padding: 15px 20px;
  }
  .el-dialog__footer {
    padding: 0;
    border-top: 1px solid #dcdfe6;
    .el-button {
      border-radius: 0;
      font-size: 16px;
      color: #333;
      font-weight: normal;
      width: 50%;
      border: 0;
      padding-top: 15px;
      padding-bottom: 15px;
    }
    .el-button + .el-button {
      margin-left: 0px;
      border-left: 1px solid #dcdfe6;
    }
    .el-button:last-child.el-button:first-child {
      width: 100%;
    }
  }
  .w-modal_content {
    position: relative;
    max-height: 500px;
    overflow-y: auto;

    .el-form-item--small.el-form-item {
      transition: margin-bottom 0.1s;
      margin-bottom: 5px;
      &.is-error {
        margin-bottom: 15px;
      }
    }
  }
}
</style>

tree树的封装

<template>
  <w-modal
    ref="modal"
    :title="title"
    :loading="loading"
    @submit="doSubmit"
    class="rules-factory-parameter"
  >
    <el-form ref="form" size="small" label-width="100px">
      <el-row :gutter="rowGutter">
        <el-col :span="18">
          <el-form-item label="机构名称" prop="SALETEAMNAME">
            <el-input
              v-model="SALETEAMNAME"
              placeholder="请输入机构名称"
            ></el-input>
          </el-form-item>
        </el-col>
        <el-button size="mini" type="primary" @click="search(1)"
          >查询</el-button
        >
      </el-row>
    </el-form>
    <el-tree
      :load="loadNode"
      lazy
      :props="{
        label: 'INST_NAME',
        children: 'zones',
      }"
      :show-checkbox="showCheckbox"
      check-strictly
      node-key="INST_NAME"
      ref="tree"
      @check-change="handleCheckChange"
      @node-click="handleNodeClick"
    >
    </el-tree>
  </w-modal>
</template>

<script>
import { Tree, Form, FormItem, Input, Row, Col, Button } from 'element-ui';
import WModal from '@/components/WModal';
import cabala from '@/utils/cabala';
// import dict from '@/utils/dict';
export default {
  name: 'c-tree',
  components: {
    [WModal.name]: WModal,
    [Form.name]: Form,
    [FormItem.name]: FormItem,
    [Input.name]: Input,
    [Row.name]: Row,
    [Col.name]: Col,
    [Button.name]: Button,
    [Tree.name]: Tree,
  },
  props: {
    afterSubmit: Function,
    showCheckbox: {
      type: Boolean,
      default: false,
    },
  },
  data() {
    return {
      title: '',
      rowGutter: 10,
      loading: false,
      count: 1,
      node: '',
      resolve: '',
      num: '',
      SALETEAMNAME: '',
      selectedNode: [],
      treeData: [],
    };
  },
  methods: {
    doSubmit() {
      console.log('关闭');
      this.selectedNode = this.$refs.tree.getCheckedNodes();
      console.log(this.selectedNode);
      this.afterSubmit(this.selectedNode);
      this.$refs.modal.close();
    },
    show(data, title) {
      this.search(0);
      console.log('-----------');
      this.title = title;
      //   this.treeData = data;
    },
    handleCheckChange(data, checked) {
      if (checked) {
        console.log(checked);
        console.log(data);
        this.$refs.tree.setCheckedNodes([]);
        this.$refs.tree.setCheckedNodes([data]);
      }
    },
    loadNode(node, resolve) {
      // this.node.childNodes = [];
      console.log(node, resolve, this.num);
      if (node.level === 0) {
        if (this.num == 1) {
          node.loaded = false;
          node.expand();
        }
        this.node = node;
        this.resolve = resolve;
        console.log(1111, this.node, this.resolve);
        return resolve(this.treeData);
      }

      if (node.level >= 1) {
        // 二级节点
        this.getChildrenNode(node, resolve);
      }
    },
    search(num) {
      axios
        .post('Tree', {
          ORGCODE: '86',
          INST_NAME: this.SALETEAMNAME || '',
        })
        .then(res => {
          this.treeData = res.INSTTREE;
          this.num = num;
          this.loadNode(this.node, this.treeData);
        })
        .catch(err => {
          this.$message.error(err.MESSAGE);
        })
        .finally(() => {
          this.$nextTick(() => {
            this.$refs.modal.show();
          });
        });
    },
    getChildrenNode(node, resolve) {
      console.log(node);
      axios
        .post('Tree', {
          INST_ID: node.data['INST_ID'],
        })
        .then(res => {
          resolve(res.INSTTREE);
          console.log(this.treeData);
          this.num = 0;
        })
        .catch(err => {
          this.$message.error(err.MESSAGE);
        })
        .finally(() => {
          this.loading = false;
        });
    },
    handleNodeClick(data) {
      console.log(data);
    },
  },
};
</script>

<style scoped lang="less">
.rules-factory-parameter {
  .el-row {
    margin-left: 0px !important;
    margin-right: 0px !important;
  }
}
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lbchenxy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值