自定义Element Plus树形控件组件:实现全选功能与自定义样式

功能实现

  1. 全选功能

    • 在组件的setup函数中,我们定义了一个dataTree响应式数组,用于存储树形结构的数据。
    • 使用show-checkbox属性为树形控件添加复选框,允许用户进行多选。
    • default-expanded-keys属性用于设置默认展开的节点,这里我们设置了前两个节点。
  2. 自定义样式

    • <style>标签中,我们使用了SCSS来定义树形控件的样式。
    • 对于复选框,我们通过修改.el-checkbox__inner的样式来实现自定义图标。这里我们使用了background属性来设置图标的背景图片,并通过background-sizeborder-radius来调整样式。
    • .is-checked类用于当复选框被选中时的样式,同样通过背景图片来实现。
    • el-tree-node__expand-icon类用于隐藏树形控件的默认展开图标。
    • el-tree-node__content类用于设置节点的字体颜色。

代码解析

<template>

    <div class="home">

        <el-tree

            :data="dataTree"

            show-checkbox

            node-key="id"

            :default-expanded-keys="[0, 1]"

            :props="defaultProps">

            <template #default="{ node }">

                <span>{{ node.label }}</span>

            </template>

        </el-tree>

    </div>

</template>

<script lang="ts">

export interface AnyObject { [key: string]: any; }

import { ref, onMounted, reactive, toRefs, defineComponent } from "vue"; // vue相关方法

import "@/assets/scss/home/home.scss";

let state:AnyObject = reactive({

   

})

export default defineComponent({

    components: {

       

    },

    setup() {

        onMounted(() => {

           

        });

        // 树形控件

        const defaultProps = {

            children: 'children',

            label: 'label',

        }

        const dataTree = reactive([

            {

                id: 0,

                label: '全选',

                children: [

                    {

                        id: 0,

                        label: '铁路',

                        imageIndex: 0,

                        children: [

                            {

                                id: 0,

                                label: '铁路1',

                            },

                            {

                                id: 1,

                                label: '铁路2',

                            },

                            {

                                id: 2,

                                label: '铁路3',

                            }

                        ]

                    },

                    {

                        id: 1,

                        label: '公路',

                        imageIndex: 0,

                        children: [

                            {

                                id: 0,

                                label: '公路1',

                            },

                            {

                                id: 1,

                                label: '公路2',

                            },

                            {

                                id: 2,

                                label: '公路3',

                            }

                        ]

                    },

                    {

                        id: 1,

                        label: '水路',

                        imageIndex: 0,

                        children: [

                            {

                                id: 0,

                                label: '水路1',

                            },

                            {

                                id: 1,

                                label: '水路2',

                            },

                            {

                                id: 2,

                                label: '水路3',

                            }

                        ]

                    },

                ],

            }

        ]);

        return {

            ...toRefs(state),

            defaultProps,

            dataTree,

        };

    },

});

</script>

<style lang="scss" scope>

.home {

    .el-tree {

        /* 默认 */

        .el-checkbox__inner {

            width: 16px;

            height: 16px;

            background: url('../../assets/close.png') no-repeat top center;

            background-size: 100% 100%;

            background-size: contain;

            border: none;

            border-radius: none;

            &:before {

                display: none;

            }

        }

        /* checked 选中 */

        .is-checked .el-checkbox__inner {

            width: 16px;

            height: 16px;

            background: url('../../assets/open.png') no-repeat top center;

            background-size: 100% 100%;

            background-size: contain;

            border: none;

            border-radius: none;

            &:before {

                display: none;

            }

        }

        /* 隐藏倒三角 */

        .el-tree-node__expand-icon {

            display: none;

        }

        /* 节点的字体颜色 */

        .el-tree-node__content {

            color: #409eff;

        }

    }

   

}

</style>

结语

通过上述步骤,我们成功创建了一个具有全选功能和自定义样式的树形控件。这个组件可以轻松地集成到任何Vue.js项目中,为用户提供一个既美观又实用的界面元素。希望这篇文章能帮助您更好地理解如何在Vue.js中实现和定制树形控件。

注意事项

  • 请确保您的项目中已经正确安装并引入了Element UI库。
  • 自定义样式时,请注意路径和文件名的正确性,确保图片资源可以正确加载。
  • 如果您需要进一步的样式定制或功能扩展,可以根据Element UI的文档进行相应的调整。

结束语

感谢您的阅读,希望这篇文章对您有所帮助。如果您有任何问题或建议,请在评论区留言,我们期待与您的交流。

  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,针对您的问题,我理解的是您想通过自定义选框样式实现全选功能,是这样的吗?如果是的话,可以通过以下方法来实现: 1. 在 `i-table` 组件上添加 `@select-all` 事件监听器,该事件会在全选复选框被点击时触发。 2. 在 `i-table` 组件上添加 `:selectable` 属性,该属性可以自定义选框的样式。 下面是一个示例代码,您可以参考一下: ``` <template> <div> <i-table :columns="columns" :data="tableData" :selectable="customSelectBox" @select-all="selectAllRows"> </i-table> </div> </template> <script> export default { data() { return { columns: [...], tableData: [...], customSelectBox: row => { return { template: ` <label class="custom-checkbox"> <input type="checkbox" v-model="row._checked"> <span class="custom-checkbox-label"></span> </label> ` }; } }; }, methods: { selectAllRows(selected) { this.tableData.forEach(row => { row._checked = selected; }); } } }; </script> <style> .custom-checkbox { position: relative; display: inline-block; width: 16px; height: 16px; margin-right: 8px; margin-top: -2px; vertical-align: middle; cursor: pointer; } .custom-checkbox input[type="checkbox"] { opacity: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; cursor: pointer; } .custom-checkbox .custom-checkbox-label { position: absolute; top: 0; left: 0; width: 16px; height: 16px; border: 1px solid #d9d9d9; opacity: 1; transition: all 0.3s; } .custom-checkbox input[type="checkbox"]:checked + .custom-checkbox-label::after { content: ""; position: absolute; top: 2px; left: 2px; width: 12px; height: 12px; background-color: #409EFF; opacity: 1; transition: all 0.3s; } .custom-checkbox:hover .custom-checkbox-label { border-color: #409EFF; } </style> ``` 在上面的代码中,我们定义了一个 `customSelectBox` 函数来自定义选框的样式,该函数会返回一个包含选框模板的对象。然后在 `i-table` 组件上添加 `:selectable="customSelectBox"` 属性,将自定义的选框样式应用到表格中。 同时,我们在 `i-table` 组件上添加了 `@select-all` 事件监听器,该事件会在全选复选框被点击时触发,我们在 `selectAllRows` 方法中,将所有行的选中状态都设置为全选状态即可。 希望能对您有所帮助!如果还有其他问题,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值