antd vue tree树形结构问题记录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了antd vue tree树形结构问题记录相关的知识,希望对你有一定的参考价值。

参考技术A 1.节点数据显示上一个的数据
2.节点数据出现死循环
主要问题是,为了优化搜索性能,在请求接口的方法使用了节流函数,导致树形结构加载数据不能同步
处理方式是,将节流函数放到搜索方法

vue+element tree(树形控件)组件

今天记录组件的代码和一个调用它的父组件的代码,接口接收数据直接传element直接能用的,也就是经过上一章函数处理过的数据以下是代码

父组件

<template>
    <commonfiltertree :placeholder="placeholder"
        :data="data"
        :showCheckbox="showCheckbox"
        @check=‘getcheckdata‘
        :title="title"
        :showScreen="showScreen"
        @click=‘getCurrentKey‘
        @checkkey=‘getCheckedKeys‘
        :defaultExpandAll="defaultExpandAll"
        :default=‘defaults‘></commonfiltertree>
</template>
<script>
import commonfiltertree from "@/components/newCommon/tree/filtertree.vue";
export default {
    components: {
        commonfiltertree
    },
    data() {
        return {
            placeholder: 输入信息,按回车搜索,
            showCheckbox: true,
            data: [{
                id: 1,
                label: 一级 1,
                children: [{
                    id: 4,
                    label: 二级 1-1,
                    children: [{
                        id: 9,
                        label: 三级 1-1-1
                    }, {
                        id: 10,
                        label: 三级 1-1-2
                    }]
                }]
            }, {
                id: 2,
                label: 一级 2,
                children: [{
                    id: 5,
                    label: 二级 2-1
                }, {
                    id: 6,
                    label: 二级 2-2
                }]
            }, {
                id: 3,
                label: 一级 3,
                children: [{
                    id: 7,
                    label: 二级 3-1
                }, {
                    id: 8,
                    label: 二级 3-2
                }]
            }],
            countent: "",
            defaultProps: {
                children: "children",
                label: "label"
            },
            data1: new Array,
            data2: "",
            title: "水费电费水电费",
            showScreen: true,
            defaults: [],
            defaultExpandAll:true
            
        };
    },
    methods: {
        getcheckdata(data) {
            //有多选框的时候返回的data数组
            this.data1 = data;
        },
        getCurrentKey(data) {
            //点击的时候返回当前点击的key
            this.data2 = data;
        },
        getCheckedKeys(data) {
            //有多选框时返回的key所组成的数组
            this.data3 = data;
        }
    }
};
</script>

子组件

/*
* @property { data :  {Array} 接口传来的数组 }
* @property { showCheckbox :  {Boolean} 是否显示多选小方框 }
* @property { placeholder :  {String} 提示语,上方搜索框提示语。 }
* @property { check : 父组件使用check来接收已选中的所有数据组成的数组 }
* @property { title : {String} 弹窗上方的名字 }
* @property { showScreen : {Boolean} 是否需要筛选框 }
* @property { nodeclick : 节点被点击时的回调 }
* @property { defaults : {Array} 默认选中的数据 传key组成的数组 }
* @property { defaultExpandAll : {Boolean} 是否默认展开 }
* @version 1.0.0
* @edit: 2018/8/2
*/
<template>
    <div class="air-tree-wrappers">
            <div class="el-dialog__title">{{ this.title }}</div>
        <div v-if="screen">
            <el-input class="input"
                :placeholder="placeholder"
                prefix-icon="el-icon-search"
                v-model="filterText"
            >
            </el-input>
        </div>
        <el-tree class="filter-tree"
            :data="data"
            :props="defaultProps"
            :show-checkbox="checkbox"
            :default-expand-all="defaultExpandAll"
            :filter-node-method="filterNode"
            @check-change=‘check()‘
            ref="tree"
            :node-key="‘id‘"
            @node-click="nodeclick">
        </el-tree>
        <div class="foot">
        </div>
    </div>
</template>
<script>
export default {
    props: {
        placeholder: {
            type: String
        },
        data: {
            type: Array
        },
        default: {
            type: Array
        },
        showCheckbox: {
            type: Boolean
        },
        width: {
            type: String
        },
        title: {
            type: String
        },
        showScreen: {
            type: Boolean
        },
        defaultExpandAll: {
            type: Boolean,
        }
    },
    data() {
        return {
            filterText: ‘‘,
            countent: "",
            checkbox: this.showCheckbox,
            defaultProps: {
                children: "children",
                label: "label",
            },
            data1: new Array,
            dialogTableVisible: false,
            screen: this.showScreen
        };
    },
    watch: {
        filterText(val) {
            this.$refs.tree.filter(val);
        }
    },
    methods: {
        filterNode(value, data) {
            if (!value) return true;
            return data.label.indexOf(value) !== -1;
        },
        //传回父组件
        check() {
            //获取所有被选中的data的数组
            let takeDate = this.$refs.tree.getCheckedNodes();
            this.$emit(check, takeDate);
            //获取所有被选中的key的数组
            let keyDate = this.$refs.tree.getCheckedKeys();
            this.$emit(checkkey, keyDate);
        },
        nodeclick() {
            let key = this.$refs.tree.getCurrentKey()
            this.$emit(click, key);
        }
    }
};
</script>

里面用的事件都是element封好的直接用就好了比如

技术分享图片

更多的事件,属性直接去element官网找就好了。

this.$nextTick(()=>{}) 这个方法的作用是 DOM更新完成后执行
应该就相当于一个延时函数,很有用,有时你的函数触发的时候dom还没加载出来比如使用$ref时候就会发生这种情况。

以上是关于antd vue tree树形结构问题记录的主要内容,如果未能解决你的问题,请参考以下文章

关于 antd@4 之后 tree 树形控件不能横向排列这件事

关于 antd@4 之后 tree 树形控件不能横向排列这件事

关于 antd@4 之后 tree 树形控件不能横向排列这件事

vue+element tree(树形控件)组件

antd树形控件Tree的展开

[antd of vue] a-tree组件子节点不完全勾选获取父节点的值