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>