IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> element input+table实现一个双向绑定分页筛选组件 -> 正文阅读

[JavaScript知识库]element input+table实现一个双向绑定分页筛选组件

<template>
    <div>
        <el-input v-model="searchKey" 
                @input="changeNative" 
                @focus="isDisplay = true"
                @blur="blur"
                clearable
                />
        <el-card 
            v-show="isDisplay"
            class="my-table" 
            v-loading="loading" 
            element-loading-text="拼命加载中">
            <el-table :data="tableData" @row-click="rowClick" style="width: 100%" :show-header="isShowHeader">
                <el-table-column v-for="item in theadTitles" :key="item.key" :prop="item.key" :label="item.label" :width="item.width" />
            </el-table>
            <el-pagination
                @current-change="handleCurrentChange"
                :current-page.sync="pageNation.currentPage"
                :page-size="pageNation.size"
                layout="prev, pager, next, jumper"
                :total="pageNation.total" />
        </el-card>
    </div>
</template>
<script>
const debounce = (fn, wait = 300) => {
    let timeout;
    return function () {
        const context = this;
        const args = [...arguments];
        if (timeout) clearTimeout(timeout);
            timeout = setTimeout(() => {
            fn.apply(context, args);
        }, wait);
    };
};
export default {
    model: {
        prop: 'value',
        event: 'input'
    },
    props: {
        value: String,
        isShowHeader: {
            type: Boolean,
            default: false
        },
        url: {
            type: Function,
            required: true
        },
        queryParams: {
            type: Object,
            default: () => {
                return {}
            }
        }
    },
    data() {
        return {
            isDisplay: false,
            loading: false,
            searchKey: this.value,
            theadTitles: [
                {key: 'deptCode', label: '网点编码', width: 120}, 
                {key: 'deptName', label: '网点名称', }
            ],
            tableData: [],
            pageNation: {
                currentPage: 1,
                size: 5,
                total: 0
            }
        }
    },
    methods: {
        changeNative: debounce(function(e) {
            this.$emit('input', this.searchKey);
            this.pageNation.currentPage = 1;
            setTimeout(() => {
                this.getTableData();
            }, 0);
        }, 300),
        handleCurrentChange(val) {
            this.pageNation.currentPage = val;
            this.getTableData();
        },
        blur(e) {
            let dom = document.querySelector('.my-table');
            window.addEventListener('click', (evt) => {
                let tagName = evt.target.tagName;
                let isContain = dom.contains(evt.target);
                // 聚焦的时候也会执行click, 因此需要排除点击input的时候
                // 确保点击dom不在表格上的时候才会执行blur
                if (!isContain && tagName !== 'INPUT') {
                    // blur与click 不可兼得,如果是同步则只会执行blur而不会执行click
                    setTimeout(() => {
                        this.isDisplay = false;
                    }, 200);
                }
            });
        },
        rowClick(row) {
            this.$emit('input', row.deptName);
            this.searchKey = row.deptName;
            this.isDisplay = false;
        },
        getTableData() {
            try {
                this.loading = true;
                const API = this.url;
                API({
                    ...this.queryParams,
                    current: this.pageNation.currentPage,
                    size: this.pageNation.size
                }).then(res => {
                    const { data } = res;
                    this.tableData = data.records || [];
                    this.pageNation.total = data.totalRecord;
                    this.loading = false;
                });
            } catch(e) {
                this.loading = false;
                console.log('e', e);
            }
        }
    },
    mounted() {
        this.getTableData();
    },
    watch: {
        queryParams: {
            immediate: true,
            handler: function(v) {}
        }
    }
}
</script>

<style lang="scss" scoped>
.my-table {
    background: #FFF;
    position: absolute;
    z-index: 10;
    /deep/.el-card__body {
        padding: 4px;
    }
}
</style>

父组件使用方式:

<blur-search v-model="form.orgName" :url="$api.statistics.queryDeptNames" :queryParams="queryParams" />
// url 为接口api, queryParams为查询参数
    computed: {
        queryParams() {
            return {
                deptName: this.form.orgName
            }
        }
    },
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:12:46  更:2022-03-16 22:16:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:59:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码