vue2 实现树形选择器(el-tree/el-select)绝对有效!!!

vue2 实现树形选择器(el-tree/el-select)

组件结构

 <el-select v-model="value2" placeholder="请选择" multiple @change="delItem">
            <el-option value="1" lable="1" v-show="false"></el-option>
            <el-option v-for="item in selectArr" :key="item.id" :value="item.id" :lable="item.name"
                v-show="false"></el-option>
            <el-tree :props="props" :data="treeData" show-checkbox @check-change="handleCheckChange2" ref="tree2"
                node-key=id>
            </el-tree>
 </el-select>

说明:必须要有两个opitons,选择器组件内部没有options,会导致无法渲染内容。第一个options的作用是因为,当selectArr为空数组的时候,option节点在html中没有生成,会导致下拉框会显示无

方法

handleCheckChange2:getCheckedNodes获取到勾选节点的数组对象
this.selectArr = data 树和选择器进行显示联动

 handleCheckChange2() {
            let data = this.$refs.tree2.getCheckedNodes(true)
            this.selectArr = data
            this.value2 = data.map(item => item.id)
  },

delItem:点击删除选择器节点的时候,同时取消树形控件的对应节点

 delItem() {
            this.$refs.tree2.setCheckedKeys(this.value2)
}

最终效果展示

在这里插入图片描述

完整代码

<template>
    <div id="app">
        <el-select v-model="value" placeholder="请选择">
            <el-option value="1" lable="1" v-show="false"></el-option>
            <el-tree :props="props" :data="treeData" show-checkbox @check-change="handleCheckChange" ref="tree">
            </el-tree>
        </el-select>
        <el-select v-model="value2" placeholder="请选择" multiple @change="delItem">
            <el-option value="1" lable="1" v-show="false"></el-option>
            <el-option v-for="item in selectArr" :key="item.id" :value="item.id" :lable="item.name"
                v-show="false"></el-option>
            <el-tree :props="props" :data="treeData" show-checkbox @check-change="handleCheckChange2" ref="tree2"
                node-key=id>
            </el-tree>
        </el-select>
        <el-select v-model="value3" placeholder="请选择" multiple>
            <el-option value="1" lable="1"></el-option>
            <el-option value="2" lable="2"></el-option>
            <el-option value="3" lable="3"></el-option>
        </el-select>
        <button @click="btn">打印</button>
    </div>
</template>
<script>
import { options } from "../../testData.js"
export default {
    name: '',
    data() {
        return {
            props: {
                label: 'name',
                children: 'children',
                id: "id",
                isLeaf: "leaf",
            },
            treeData: [],
            value: [],
            value2: [],
            copyData: [],
            selectArr: [{}],
            value3: []
        }
    },
    created() {
        setTimeout(() => {
            this.treeData = options
            // this.selectArr = options
        }, 1000);
    },
    methods: {
        handleCheckChange() {
            let res = this.$refs.tree.getCheckedNodes(true);
            this.value = res.map(item => item.name).join(', ');
        },
        handleCheckChange2() {
            let data = this.$refs.tree2.getCheckedNodes(true)
            this.selectArr = data
            this.value2 = data.map(item => item.id)
        },
        btn() {
            console.log(this.value3, "value3");
            console.log(this.value2, "value2");
            console.log(this.value1, "value1");
        },
        delItem() {
            this.$refs.tree2.setCheckedKeys(this.value2)
        }
    }
}
</script>
<style scoped lang='less'></style>

效果

在这里插入图片描述

options数据来源需引入

export const options = [
    {
        "tbname": "kyxmda",
        "children": [],
        "hasChildren": false,
        "name": "测试档案表添加",
        "id": "4d9af4bddc314e2f925be6fe14e1c9ce",
        "type": 1,
        "params": "",
        "nodeType": 1,
        "parentId": "0",
        "order": 1,
        "status": "01"
    },
    {
        "tbname": "",
        "children": [
            {
                "tbname": "dqda",
                "children": [],
                "hasChildren": false,
                "name": "党群档案",
                "id": "7266a52d260e49d3b1e2e15055628a28",
                "type": 0,
                "params": "",
                "nodeType": 1,
                "parentId": "ea831dd4a8ee41b9b5c7c0db811cfff4",
                "order": 1,
                "status": "01"
            },  
            {
                "tbname": "swdajh",
                "children": [],
                "hasChildren": false,
                "name": "实物档案",
                "id": "740127fa524f491bb08367db99eacdf1",
                "type": 1,
                "params": "",
                "nodeType": 1,
                "parentId": "ea831dd4a8ee41b9b5c7c0db811cfff4",
                "order": 1,
                "status": "01"
            },
            {
                "tbname": "cbda",
                "children": [],
                "hasChildren": false,
                "name": "出版档案",
                "id": "c0192d29b5e04c98901100cf4ef10db4",
                "type": 1,
                "params": "",
                "nodeType": 1,
                "parentId": "ea831dd4a8ee41b9b5c7c0db811cfff4",
                "order": 1,
                "status": "01"
            },
            {
                "tbname": "",
                "children": [
                    {
                        "tbname": "bshdact",
                        "children": [],
                        "hasChildren": false,
                        "name": "博士后档案",
                        "id": "1cfc5dae04a8450c96ae5f64bf805bfb",
                        "type": 1,
                        "params": "",
                        "nodeType": 1,
                        "parentId": "cbe4b8f9e73847a4911c1de2ef62f122",
                        "order": 1,
                        "status": "01"
                    },
                    {
                        "tbname": "qrzbkcjd",
                        "children": [],
                        "hasChildren": false,
                        "name": "全日制本科成绩单",
                        "id": "a522e18f696f48c1b3a45173c5994c0d",
                        "type": 1,
                        "params": "",
                        "nodeType": 1,
                        "parentId": "cbe4b8f9e73847a4911c1de2ef62f122",
                        "order": 1,
                        "status": "01"
                    },
                    {
                        "tbname": "crjycjd",
                        "children": [],
                        "hasChildren": false,
                        "name": "承认教育成绩单",
                        "id": "c3983c1a523a42b49fb7c69a07a910d7",
                        "type": 1,
                        "params": "",
                        "nodeType": 1,
                        "parentId": "cbe4b8f9e73847a4911c1de2ef62f122",
                        "order": 1,
                        "status": "01"
                    }
                ],
                "hasChildren": true,
                "name": "教学档案",
                "id": "cbe4b8f9e73847a4911c1de2ef62f122",
                "type": 1,
                "params": "",
                "nodeType": 0,
                "parentId": "ea831dd4a8ee41b9b5c7c0db811cfff4",
                "order": 1,
                "status": "01"
            },
            {
                "tbname": "sbyqda",
                "children": [],
                "hasChildren": false,
                "name": "仪器设备档案",
                "id": "49ebe32fd7944ed4936f67014479c349",
                "type": 1,
                "params": "",
                "nodeType": 1,
                "parentId": "ea831dd4a8ee41b9b5c7c0db811cfff4",
                "order": 3,
                "status": "01"
            },
            {
                "tbname": "sjwsdajh",
                "children": [],
                "hasChildren": false,
                "name": "文书档案",
                "id": "36fb710c62234162995ca1d9f31c23e3",
                "type": 0,
                "params": "",
                "nodeType": 1,
                "parentId": "ea831dd4a8ee41b9b5c7c0db811cfff4",
                "order": 10,
                "status": "01"
            },
            {
                "tbname": "jjda",
                "children": [
                    {
                        "tbname": "jjda",
                        "children": [],
                        "hasChildren": false,
                        "name": "建设项目管理类文件",
                        "id": "4048990408c44968a105e4ef74d2ac39",
                        "type": 1,
                        "params": "",
                        "nodeType": 1,
                        "parentId": "680efdc50242404b92aca6a6bcf72a37",
                        "order": 1,
                        "status": "01"
                    },
                    {
                        "tbname": "jjxmdagl",
                        "children": [],
                        "hasChildren": false,
                        "name": "建设项目施工、监理文件",
                        "id": "885bb7e81c084ebd8386c0ecd9096788",
                        "type": 1,
                        "params": "",
                        "nodeType": 1,
                        "parentId": "680efdc50242404b92aca6a6bcf72a37",
                        "order": 1,
                        "status": "01"
                    }
                ],
                "hasChildren": true,
                "name": "基建档案",
                "id": "680efdc50242404b92aca6a6bcf72a37",
                "type": 1,
                "params": "",
                "nodeType": 0,
                "parentId": "ea831dd4a8ee41b9b5c7c0db811cfff4",
                "order": 10,
                "status": "01"
            }
        ],
        "hasChildren": true,
        "name": "南京档案管理",
        "id": "ea831dd4a8ee41b9b5c7c0db811cfff4",
        "type": 1,
        "params": "",
        "nodeType": 0,
        "parentId": "0",
        "order": 1,
        "status": "01"
    }
]
Vue2中封装一个时间选择器可以通过以下步骤进行: 1. 创建一个单文件组件(.vue文件),命名为TimePicker.vue,然后在该文件中定义你的时间选择器组件的模板、样式和逻辑。 2. 在模板中,你可以使用HTML和Vue指令来构建你的时间选择器的外观和交互。你可以使用input元素作为时间选择器的基础,并添加一些样式和事件处理程序来实现你的需求。 3. 在脚本部分,你可以使用Vue提供的data属性来定义时间选择器的数据,例如选中的时间、可选时间范围等。你还可以定义一些方法来处理时间选择器的交互逻辑,例如打开/关闭选择器、选择时间等。 4. 为了使你的时间选择器更加灵活和可配置,你可以通过props属性将一些参数传递给组件。例如,你可以传递一个可选的时间范围、默认选中的时间等。 5. 最后,你需要在父组件中使用你封装好的时间选择器组件。只需要在父组件的模板中添加一个<TimePicker></TimePicker>标签即可。你也可以通过v-model指令将选择的时间绑定到父组件的数据上。 这是一个简单的示例代码,帮助你更好地理解封装过程: ``` <template> <div> <input type="text" v-model="selectedTime" @click="openPicker"> <div v-if="isOpen" class="picker"> <!-- 时间选择器的内容 --> </div> </div> </template> <script> export default { data() { return { isOpen: false, selectedTime: '', }; }, methods: { openPicker() { this.isOpen = true; }, closePicker() { this.isOpen = false; }, selectTime(time) { this.selectedTime = time; this.closePicker(); }, }, }; </script> <style scoped> .picker { /* 时间选择器的样式 */ } </style> ``` 请注意,这只是一个简单的示例,实际上你可能需要更多的代码来处理时间的格式化、校验、时间范围选择等功能。你可以根据自己的需求进行扩展和修改。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值