• 表格行添加双击事件


    需求:  文件管理功能, 类似与windows 的文件及文件夹操作

    如下图:

    双击是实现:

      1、主要依靠 mounted() 中 this.$nextTick, 渲染后挂载事件

      2、其中 addEventListener('dblclick', function () {}) 为主要功能实现

    前端vue代码:

    <template>
        <div class="log_manage">
            <div class="head">
                <div class="step">
                    <span><i class="step-i el-icon-back" title="上一层" @click="onStep"></i></span>
                    <span><i class="step-i el-icon-right" title="下一层" @click="underStep"></i></span>
                </div>
                <div class="path path_display" v-if="is_path" tabindex="-1" @focus="focus_path">
                    <i slot="prefix" class="el-input__icon el-icon-folder-opened"
                       style="color: #ff9b11; font-size: 22px; margin: 0 5px"></i>
                    <span v-for="(value, index) in display_path" :key="index">
                        <i class="el-icon-arrow-right"></i>
                        {{ value }}
                    </span>
                </div>
                <el-input class="path path-input" v-model="log_path" placeholder="请输入内容" v-else
                          tabindex="-1" @blur="blur_path" ref="input" @keyup.enter.native="onSubmit">
                    <i slot="prefix" class="el-input__icon el-icon-folder-opened"
                       style="color: #ff9b11; font-size: 22px; margin: 0 5px"></i>
                </el-input>
                <div class="refresh">
                    <el-button icon="el-icon-refresh" @click="refresh_content" title="刷新"></el-button>
                </div>
                <div class="search-box">
                    <el-input v-model="search_path" placeholder="请输入内容">
                        <i slot="prefix" class="el-input__icon el-icon-search" style="padding-left: 6px"></i>
                    </el-input>
                </div>
                <div class="search">
                    <el-button @click="execute_search">搜索</el-button>
                </div>
            </div>
            <div class="content-box">
                <el-table
                        :data="dir_list"
                        :default-sort="{prop: 'type', order: 'ascending'}"
                        style=" 100%">
                    <el-table-column
                            prop="name"
                            label="名称"
                            sortable
                            width="260">
                        <template slot-scope="scope">
                            <span v-if="scope.row.type === '文件夹'">
                                <i class="el-icon-folder" style="color: #ff9b11;"></i>
                                {{ scope.row.name }}
                            </span>
                            <span v-else>
                                <i class="el-icon-tickets"></i>
                                {{ scope.row.name }}
                            </span>
                        </template>
                    </el-table-column>
                    <el-table-column
                            prop="time"
                            sortable
                            label="修改日期"
                            width="220">
                    </el-table-column>
                    <el-table-column
                            class="file-type"
                            prop="type"
                            sortable
                            label="类型"
                            width="200">
                    </el-table-column>
                    <el-table-column
                            prop="size"
                            label="大小"
                            width="460">
                    </el-table-column>
                    <el-table-column fixed="right" label="操作" width="200">
                        <template slot-scope="scope">
                            <el-button @click="my_modify(scope.row)" type="text" size="small">修改</el-button>
                            <el-button @click="my_delete(scope.row)" type="text" size="small">删除</el-button>
                        </template>
                    </el-table-column>
                </el-table>
            </div>
        </div>
    </template>

    js:

    <script>
        import {check, open_file} from "@/js/log_manage"
    
        export default {
            name: "LogManage",
            mounted() {
                this.$nextTick(() => {
                    setTimeout(this.bindEvent, 500)
                })
            },
            data() {
                return {
                    dir_list: [
                        {'name': 'file1', 'time': '2002/10/22', 'type': '文本文档', 'size': '100k'},
                        {'name': 'file2', 'time': '2002/11/23', 'type': '文本文档', 'size': '100M'},
                        {'name': 'file3', 'time': '2002/9/24', 'type': '文本文档', 'size': '10M'},
                        {'name': 'file4', 'time': '2002/8/25', 'type': '文本文档', 'size': '1k'},
                        {'name': 'log', 'time': '2002/8/25', 'type': '文件夹', 'size': ''},
                        {'name': 'case', 'time': '2002/9/24', 'type': '文件夹', 'size': ''},
                        {'name': 'var', 'time': '2002/10/22', 'type': '文件夹', 'size': ''},
                    ],
                    // 路径相关
                    is_path: true,
                    // 初始路径
                    base_path: 'logs',
                    // 当前路径
                    log_path: 'logs/sdfd/fdfd',
                    // 搜索路径
                    search_path: '',
                    // 显示路径
                    display_path: ['logs', '123'],
                    // 前进一步
                    history_path: 'logs/sdfd/fdfd',
                    dir_name: '',
                }
            },
            methods: {
                // 路径显示
                focus_path() {
                    this.is_path = false;
                    this.$nextTick(() => {
                        this.$refs.input.focus()
                    })
                },
                blur_path() {
                    this.is_path = true;
                    this.log_path = this.base_path
                },
                // enter 跳转
                onSubmit() {
                    console.log(this.log_path)
                },
                // 刷新
                refresh_content() {
                    console.log(this.log_path)
                },
                // 执行搜索
                execute_search() {
                    console.log(this.search_path)
                },
                // 上一步
                onStep() {
                    if (this.log_path === this.base_path) {
                        return
                    }
                    let path = this.log_path.split('/');
                    path.pop(-1);
                    this.log_path = path.join('/');
                    console.log(this.log_path);
                },
                // 下一步
                underStep() {
                    if (this.log_path === this.history_path) {
                        return
                    }
                    let path_list = this.history_path.split('/');
                    let path = this.log_path.split('/');
                    for (let i = 0; i < path_list.length; i++) {
                        if (path_list[i] === path[path.length - 1]) {
                            let under_path = path_list[i + 1];
                            path.push(under_path);
                            this.log_path = path.join('/');
                            break
                        }
                    }
                    console.log(this.log_path)
                },
                dir_open(name) {
                    console.log(name);
                    let path = this.log_path + '/' + name;
                    check(path)
                },
                file_open(name) {
                    console.log(name);
                    let path = this.log_path + '/' + name;
                    open_file(path)
                },
                // 绑定
                bindEvent() {
                    // 双击打开
                    let item = document.querySelectorAll('tr.el-table__row');
                    for (let i = 0; i < item.length; i++) {
                        let td = item[i].childNodes;
                        if (td[2].childNodes[0].textContent === '文件夹') {
                            let dir_open_event = this.dir_open;
                            item[i].addEventListener('dblclick', function () {
                                dir_open_event(td[0].childNodes[0].textContent.trim())
                            });
                            // item[i].style.background  = 'red'
    
                        } else {
                            let file_open_event = this.file_open;
                            item[i].addEventListener('dblclick', function () {
                                file_open_event(td[0].childNodes[0].textContent.trim())
                            });
                        }
                    }
                },
            }
    
        }
    </script>

    css:

    <style scoped>
        .head {
            /*line-height: 60px;*/
            height: 40px;
        }
    
        /* 顶部栏 */
        .step {
            float: left;
             80px;
        }
    
        .step > span {
            line-height: 40px;
            text-align: center;
        }
    
        .step-i {
             40px;
            font-size: 20px;
            color: #7e8188;
        }
    
        .step-i:hover {
            color: #0978e7c2;
        }
    
        .path {
             55%;
            float: left;
            line-height: 40px;
        }
    
        .path_display {
            background-color: #FFF;
            background-image: none;
            border: 1px solid #DCDFE6;
            box-sizing: border-box;
            color: #606266;
            display: inline-block;
            font-size: 14px;
            height: 40px;
            padding: 0 15px 0 4px;
            transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
        }
    
        /deep/ .el-input__inner {
            padding-left: 45px;
            border-radius: 0 !important;
        }
    
        .refresh {
            text-align: center;
            float: left;
            border-radius: 0;
        }
    
        .refresh > .el-button {
            text-align: center;
            padding: 0;
             40px;
            line-height: 38px;
            font-size: 18px;
            color: #999b9d;
            border: 1px solid #DCDFE6;
            border-radius: 0
        }
    
        .refresh > .el-button:hover {
            color: #0978e7c2;
        }
    
        .search-box {
             calc(100% - 55% - 180px);
            float: left;
        }
    
        .search {
            float: left;
            border-radius: 0;
            border: 0;
        }
    
        .search > .el-button {
            text-align: center;
            padding: 0;
             60px;
            line-height: 38px;
            border: 1px solid #DCDFE6;
            border-radius: 0
        }
    
        /* 内容 */
        .content-box {
            background-color: pink;
            height: 600px;
        }
        /deep/.el-table__row:hover {
            background-color: pink;
        }
    </style>

    import js: 可根据情况自行设定

    import axios from "@/js/my_axios";
    
    
    function check(path) {
        console.log(path);
        let data = {
            'path': path
        };
    
        return axios({
            method: 'get',
            url: 'log_manage',
            params: data,
        }).then((response) => {
            console.log(response.data)
        }).catch((error) => {
            console.log(error);
        });
    }
    
    function open_file(path) {
        console.log(path);
        let data = {
            'path': path
        };
    
        return axios({
            method: 'post',
            url: 'log_manage',
            data: data,
        }).then((response) => {
            console.log(response.data)
        }).catch((error) => {
            console.log(error);
        });
    }
    
    
    function delete_file(path) {
        console.log(path);
        let data = {
            'path': path
        };
    
        return axios({
            method: 'delete',
            url: 'log_manage',
            data: data,
        }).then((response) => {
            console.log(response.data)
        }).catch((error) => {
            console.log(error);
        });
    }
    
    
    export {
        check,
        open_file,
        delete_file,
    }
  • 相关阅读:
    编写高质量代码改善C#程序的157个建议——建议34:为泛型参数设定约束
    编写高质量代码改善C#程序的157个建议——建议33:避免在泛型类型中声明静态成员
    编写高质量代码改善C#程序的157个建议——建议32:总是优先考虑泛型
    编写高质量代码改善C#程序的157个建议——建议31:在LINQ查询中避免不必要的迭代
    编写高质量代码改善C#程序的157个建议——建议30:使用LINQ取代集合中的比较器和迭代器
    编写高质量代码改善C#程序的157个建议——建议29:区别LINQ查询中的IEnumerable<T>和IQueryable<T>
    编写高质量代码改善C#程序的157个建议——建议28:理解延迟求值和主动求值之间的区别
    编写高质量代码改善C#程序的157个建议——建议27:在查询中使用Lambda表达式
    编写高质量代码改善C#程序的157个建议——建议26:使用匿名类型存储LINQ查询结果
    编写高质量代码改善C#程序的157个建议——建议25:谨慎集合属性的可写操作
  • 原文地址:https://www.cnblogs.com/TF511/p/16245426.html
Copyright © 2020-2023  润新知