javascript - 关于Vue elementui Tree组件自定义编辑删除后值怎么取?

查看:927
本文介绍了javascript - 关于Vue elementui Tree组件自定义编辑删除后值怎么取?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

点击官方的append或者后,取出来的store依然还是原始数据,数据并没有变化,依然是最初的虚拟数据,请问怎么取出变化后的值。
我有一个不成熟的想法,新建一个数组,在renderContent(h, { node, data, store }) 函数中可以获取到最新添加的data和node.parent,再对新数组进行添加。。。但是实现起来有技术难点,无法判断用户会增加多少层级。。

<template>
    <div id="logsearch">
        <el-row class="warp">
            <el-col :span="24" class="warp-breadcrum">
                <el-breadcrumb separator="/">
                    <el-breadcrumb-item :to="{ path: '/' }"><b>首页</b></el-breadcrumb-item>
                    <el-breadcrumb-item>日志检索</el-breadcrumb-item>
                </el-breadcrumb>
            </el-col>
            <el-col :span="24">
                <el-card class="box-card">
                    <div class="cardcontent">
                        <div class="cardLeft" style="border-right: 1px solid lightgray">
                            <el-form ref="form" label-width="100px" class="editform" style="padding-bottom: 0;">
                                <el-form-item label="类型选择">
                                    <el-cascader :options="options" :show-all-levels="false" v-model="selectedOptions" @change="handleChange"  style="width: 260px;">
                                    </el-cascader>
                                </el-form-item>
                                <el-form-item label="输入参数1" class="args" style="display: none;">
                                    <el-input style="width: 220px;" class="arg1" v-model="arg1data"></el-input>
                                    <el-button class="el-icon-plus" size="mini" @click="addargsmenu"></el-button>
                                </el-form-item>

                            </el-form>
                            <div id="argsbox">

                            </div>
                            <el-form ref="form" label-width="100px" class="editform">
                                <el-form-item>
                                    <el-button type="primary" @click="edit()">立即创建</el-button>
                                    <el-button @click="edithide">取消</el-button>
                                </el-form-item>
                            </el-form>
                        </div>
                        <div class="cardRight">
                            <el-tree :data="data2"  ref="tree2" @node-click="handleNodeClick" :props="defaultProps" node-key="id" default-expand-all :expand-on-click-node="false" :render-content="renderContent" style="border:none">
                            </el-tree>
                        </div>
                    </div>
                </el-card>
            </el-col>
        </el-row>
    </div>
</template>

<script>
    let id = 1000;
    let addNode=false;
    
    export default {
        data() {
            return {
                arg1data: "",
                editValue: "",
                tree: {
                    store: [],
                    data: [],
                    content: "",
                    node:[],
                    postdata:[]
                },
                argId: 1,
                data2: [{
                        id: 1,
                        label: 'or',
                        children: [{
                            id: 4,
                            label: 'and',
                            children: [{
                                id: 9,
                                label: 'Rising Connect 19'
                            }, {
                                id: 10,
                                label: 'Rising Connect 198'
                            }]
                        }]
                    },
                    {
                        id: 2,
                        label: 'or',
                        children: []
                    },
                    {
                        id: 3,
                        label: 'and',
                        children: []
                    }
                ],
                defaultProps: {
                    children: 'children',
                    label: 'label'
                },
                options: [{
                        value: 'and',
                        label: 'and'
                    },
                    {
                        value: 'or',
                        label: 'or'
                    },
                    {
                        value: 'EXP',
                        label: 'EXP',
                        children: [{
                                value: '=',
                                label: '='
                            },
                            {
                                value: '>',
                                label: '>'
                            },
                            {
                                value: '<',
                                label: '<'
                            }
                        ]
                    }
                ],
                selectedOptions: []
            }
        },
        methods: {
            handleNodeClick(data,store){
                
            },
            handleChange(value) {
                this.editValue = value[value.length - 1];
                if(this.editValue == "and" || this.editValue == "or") {
                    this.argshide();
                } else {
                    this.argsshow();

                }
            },
            addargsmenu() {
                this.argId++;
                var $div = $('<div class="args"></div>');
                var $input = $('<input style="width: 220px;" />')
                var html = '<span>输入参数' + this.argId + '</span>'
                $div.append(html)
                $div.append($input)
                $('#argsbox').append($div);
            },
            argsshow() {
                $('.args').show()
            },
            argshide() {
                $('.args').hide();
                this.argId = 1;
            },
            editshow(node,store, data) {
                $('.cardLeft').show();
                this.tree.store = store;
                this.tree.data = data;
                this.tree.node = node;
            },
            edithide() {
                $('.cardLeft').hide();
                this.selectedOptions = [];
                this.arg1data = ""
                $('#argsbox').empty();
                this.argshide();
            },
            edit() {
                addNode=true;
                var that = this;
                if(this.editValue == "and" || this.editValue == "or") {
                    this.tree.content = this.editValue;
                    this.tree.store.append({ id: id++, label: that.tree.content, children: [] }, that.tree.data);

                } else if(this.editValue == "") {

                } else {
                    let inputs = $('.args>input');
                    if(this.arg1data == "") {
                        this.arg1data = "空";
                    }
                    var inputvalue = this.arg1data;

                    $.each(inputs, function() {
                        if($(this)[0].value == "") {
                            $(this)[0].value = "空"
                        }
                        inputvalue += "," + $(this)[0].value;
                    })
                    if(inputvalue == "") {
                        return;
                    }
                    this.tree.content = this.editValue + inputvalue;
                    
                    this.tree.store.append({ id: id++, label: that.tree.content, children: [] }, that.tree.data);
                    
                }
                
                this.edithide();
            },
            remove(store, data) {
                store.remove(data);
                addNode=true;
                console.log(store.data)
            },
            renderContent(h, { node, data, store }) {
                this.tree.postdata=this.data2;
            if(addNode==true){
                console.log(data)
                console.log(node.parent.data.id)
                
                for(var key of this.tree.postdata){
                    console.log(key)
                }
            }
              
                if(data.label == "or" || data.label == "and") {
                    return(
                        <span>
            <span>
              <span >{node.label}</span>
            </span>
            <span style="float: right; margin-right: 20px">          
              <el-button size="mini" class="el-icon-edit" on-click={ () => this.editshow(node,store,data) }></el-button>
              <el-button size="mini" class="el-icon-close" on-click={ () => this.remove(store, data) }></el-button>
            </span>
          </span>);
                } else {
                    return( 
                        <span>
              <span>{node.label}</span>
            </span>)
                }
            }
        }
    };
</script>

<style lang="scss">
    #logsearch {
        .el-card__body {
            padding: 0px;
        }
        .editform {
            padding: 20px 0;
        }
        .cardcontent {
            display: flex;
        }
        .cardLeft {
            flex: 2;
            text-align: center;
            display: none;
        }
        .el-icon-plus {
            border-radius: 50%;
            margin: 2px 0 0 5px;
        }
        #argsbox span {
            text-align: right;
            vertical-align: middle;
            float: left;
            font-size: 14px;
            color: #48576a;
            line-height: 1;
            padding: 11px 12px 11px 0;
            box-sizing: border-box;
            width: 100px;
        }
        #argsbox input {
            -webkit-appearance: none;
            -moz-appearance: none;
            appearance: none;
            background-color: #fff;
            background-image: none;
            border-radius: 4px;
            border: 1px solid #bfcbd9;
            box-sizing: border-box;
            color: #1f2d3d;
            font-size: 14px;
            height: 36px;
            line-height: 1;
            outline: 0;
            padding: 3px 10px;
            margin-left: -32px;
            transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
        }
        #argsbox div {
            margin-bottom: 22px;
        }
        .cardRight {
            flex: 5;
        }
    }
</style>

解决方案

我自己解决了!用的最麻烦的方式获取到最终树形图的数据,原理是通过改变属性图真实数据,过程就是利用递归循环查找被点击的data.id与数据中哪个对象id相等来进行判断与递归。包括增删改都是利用这个方法,没找到框架提供的api有关于获取最终数据的参数。。。打印出来的store一直是原始数据。可能功能还不太完善吧,用个框架这个麻烦!

这篇关于javascript - 关于Vue elementui Tree组件自定义编辑删除后值怎么取?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆