哪位大侠,来吧这段vue代码封装成组件呢?

新手上路,请多包涵

功能说明:

分页列表包括查询表单,使用vue读取后端数据,就是效果图整个这一块的功能

效果图:

组件效果.fw.png

html代码

<section class="body" v-cloak>
    <div class="box_header">
        <div class="title" name="页面名称">
            <h2>操作员</h2>
        </div>
        <ul class="operate" name="操作按钮">
            <li>
                <a @click="btnAdd('admin/user/add')">{{lang.btn_new}}</a>
                <a @click="btnClear">{{lang.btn_delete_setlected}}</a>
                <!-- <a @click="btnImport">导入</a> -->
            </li>
        </ul>
        <div class="search" name="查询表单">
            <form id="form1" name="form1" method="post" action="">
                <ul>
                    <li>
                        <div class="field">
                            <label class="field_title">{{lang.status}}</label>
                            <select name="status" v-model="searchForm.status">
                                <option value="">{{lang.select_status}}</option>
                                <option v-for="item in statusList" :value="item.status">{{item.statusMsg}}</option>
                            </select>
                        </div>
                        <div class="field">
                            <label class="field_title">{{lang.keywords}}</label>
                            <input type="text" name="search" maxlength="20" tabindex="1" v-model="searchForm.search" placeholder="用户姓名、登录名、手机、电子邮件">
                        </div>
                    </li>
                    <li>
                        <div class="field btns">
                            <label class="field_title">&nbsp;</label>
                            <a @click="btnSearch">{{lang.btn_search}}</a>
                            <a @click="btnExport">{{lang.btn_export}}</a>
                        </div>
                    </li>
                </ul>
            </form>
        </div>
    </div>
    <div class="box_list">
        <table width="100%" align="center" class="t_list">
            <tbody>
                <tr class="th">
                    <th width="2%">&nbsp;</th>
                    <th class="center"><input type="checkbox" v-model="checked" @click="btnCheckAll"></th>
                    <th>{{lang.user_userName}}</th>
                    <th>{{lang.user_loginName}}</th>
                    <th>{{lang.user_mobile}}/{{lang.user_email}}</th>
                    <th>{{lang.user_createTime}}</th>
                    <th>{{lang.user_enterCount}}/{{lang.user_enterTime}}</th>
                    <th>{{lang.status}}</th>
                    <th>{{lang.user_rolesName}}</th>
                    <th>{{lang.user_rolesType}}</th>
                    <th>{{lang.btn_manage}}</th>
                </tr>
                <tr v-for="(e,i) in userList">
                    <td class="cursor">{{e.cursor}}</td>
                    <td align="center"><input type="checkbox" v-model="checkList" :value="e.userId" @click="btnCheck(e.userId)"></td>
                    <td><a @click="btnDetail('admin/user/detail?id=' + e.userId)">{{e.userName}}</a></td>
                    <td>{{e.loginName}}</td>
                    <td><p>{{e.mobile}}</p>
                        <p>{{e.email}}</p></td>
                    <td>{{e.createTime}}</td>
                    <td><p>{{e.enterCount}}</p>
                        <p>{{e.enterTime}}</p></td>
                    <td>{{e.status}}</td>
                    <td>{{e.rolesName}}</td>
                    <td>{{e.rolesType}}</td>
                    <td><div class="btn_drop">
                            <button type="button" class="button" data-toggle="dropdown">{{lang.btn_manage}}<span class="caret"></span></button>
                            <div class="drop">
                                <a @click="btnEdit('admin/user/edit?id=' + e.userId)">编辑</a>
                                <a @click="btnDelete('admin/user/delete?id=' + e.userId)">删除</a>
                            </div>
                        </div></td>
                </tr>
            </tbody>
        </table>
        <div class="paging">
            <ul>
                <li>当前页:{{paging.pageIndex}}/{{paging.totalPages}}</li>
                <li>共计{{paging.totalRows}}条记录</li>
                <li @click="btnFirst">第一页</li>
                <li @click="btnNext">下一页</li>
            </ul>
        </div>
    </div>
</section>


<script type="text/javascript">
    // 
    // vue 配置
    var config = {
        el: "section.body",
        root: "http://127.0.0.1/sagesClockin/",
        listName: "userList",
        listId: "userId",
        load: "admin/user/load",
        // components: {
        //     "listdata": listdata
        // },
        data: {
            // 检索表单的参数
            searchForm: {
                status: "",
                regionsId: "",
                search: ""
            },
            statusList: [],
            rolesList: [],
            lang: {},
            userList: []
        }

    };

    var listVm = list_paging(config);

    //
</script>   

js代码,有些公共方法没有放进来


/**
 * 
 * 分页列表
 * 
 * @param {Object} config
 */
function list_paging(config) {

    //-----------------------------------------------------------------------
    // Vue链接地址
    // function里设定了基本的增删改查导入导出的链接地址
    // 除此以外的绑定可以调用func方法处理
    //-----------------------------------------------------------------------
    const el = config.el; //挂在id或class
    const root = config.root; // 系统根目录地址
    var components = config.components;

    // 加载列表
    let url_load = meth.checkUrl(root, config.load);

    //-----------------------------------------------------------------------
    // Vue参数
    //-----------------------------------------------------------------------
    var vueData = {
        paging: {
            pageIndex: 0, // 分页初始页码必须从0开始,每次请求将自动加1
            pageSize: 12, // 分页大小,默认为每页12条记录
            totalPages: 1, // 总页数,第一次加载后会自动更新
            totalRows: 0 // 记录总数,第一次加载后会自动更新
        },
        checked: false, // 全选按钮是否被选中
        checkList: [], // 被选中复选框ID清单
        listName: "", // 数据列表变量名称
        listId: "", // 数据对象ID名称
        searchForm: {}
    }

    vueData = meth.unionParams(vueData, config.data);

    //-----------------------------------------------------------------------
    // 新建Vue对象
    //-----------------------------------------------------------------------
    var vm = new Vue({
        el: el,
        components: components,
        data: vueData,
        created() {
            this.load();
        },
        methods: {

            // 加载数据
            load: function() {

                var she = this;

                // 分页参数
                var pageIndex = she.$data.paging.pageIndex + 1;
                var pageSize = she.$data.paging.pageSize;
                var totalPages = she.$data.paging.totalPages;

                if (pageIndex > totalPages) {

                    alert("已到最后一页");
                    return;
                }

                console.log("pageIndex===>>>" + pageIndex);
                console.log("pageSize===>>>" + pageSize);

                // 检索参数
                var searchParams = she.$data.searchForm;
                searchParams['pageIndex'] = pageIndex;
                searchParams['pageSize'] = pageSize;

                // 发送请求
                request.post(url_load, searchParams, function(res) {

                    var result = res.data.result;

                    console.log("服务器端数据")
                    console.log(result)

                    if (result) {

                        // 遍历对象设置页面参数

                        for (var key in result) {

                            console.log(key);
                            console.log(result[key]);

                            var data = result[key];

                            if (data) {

                                // 加载列表时,合并数据
                                she.$data[key] = data;

                                // if (key == config.listName) {

                                //     var dataList = she.$data[key];
                                //     var length = dataList.length;
                                //     Vue.set(dataList, length, data)

                                // } else {

                                //     // 覆盖初始化数据
                                //     she.$data[key] = data;
                                // }
                            }

                        }

                        console.log(she.$data)
                    }

                });

                // 设置选择框为空
                she.$data['checked'] = false;
                she.$data['checkList'] = [];

            },

            //-----------------------------------------------------------
            // 分页相关方法
            //-----------------------------------------------------------

            //返回第一页
            btnFirst: function() {

                // 返回第一页的时候,先设定分页数据
                this.$data["paging"].pageIndex = 0;

                // 重新加载数据
                this.load();
            },

            // 下一页
            btnNext: function(pageIndex) {

                if (pageIndex && pageIndex > 0) {
                    this.$data["paging"].pageIndex = pageIndex - 1;
                }

                this.load();
            },

            // 最后一页
            btnLast: function() {

                var totalPages = she.$data.paging.totalPages;
                this.$data["paging"].pageIndex = totalPages - 1;

                this.load();
            },

            //-----------------------------------------------------------
            // 增删改查按钮操作相关的方法
            //-----------------------------------------------------------

            // 打开弹窗层
            btnOpen: function(title, url) {

                meth.openLayer(title, url);

                return false;
            },

            // 检索记录
            btnSearch: function() {

                // 返回第一页的时候,先设定分页数据
                this.$data["paging"].pageIndex = 0;
                this.$data["paging"].totalPages = 1;

                // 清空已有数据
                if (config.listName) {
                    this.$data[config.listName].length = 0;
                }

                // 重新加载数据
                this.load();
            },

            // 新增记录
            btnAdd: function(url) {

                var title = "新建";

                meth.openLayer(title, url);

                return false;
            },

            // 编辑记录
            btnEdit: function(url) {

                var title = "编辑";

                meth.openLayer(title, url);

                return false;
            },

            // 查看记录
            btnDetail: function(url) {

                console.log("查看记录")

                meth.href(url);

                return false;

            },

            // 删除记录
            btnDelete: function(url) {

                var she = this;

                she.$messagebox({

                    title: '温馨提示',
                    message: '您确定要删除此记录?',
                    showCancelButton: true,
                    confirmButtonText: "删除",
                    cancelButtonText: "取消"

                }).then(action => {

                    if (action == 'confirm') {

                        if (url.indexOf(root) == -1) {
                            url = root + url;
                        }

                        var pst = {};
                        pst['id'] = item[config.listId];

                        console.log("删除记录")
                        console.log(url);
                        console.log(pst);

                        // 发送请求到后台
                        request.post(url, pst, function(res) {

                            var result = res.data;

                            console.log("处理结果");
                            console.log(result);

                            alert(result.statusMsg);

                            if (result.status == "success") {

                                // 重新加载数据
                                she.load();
                            }

                        })


                    } else {

                        console.log('取消')
                    }

                })

            },

            // 删除所有选中记录
            btnClear: function() {

                var she = this;

                var checkList = this.$data['checkList'];
                if (checkList.length > 0) {

                    she.$messagebox({

                        title: '温馨提示',
                        message: '您确定要删除所有选中的记录?',
                        showCancelButton: true,
                        confirmButtonText: "删除",
                        cancelButtonText: "取消"

                    }).then(action => {

                        if (action == 'confirm') {

                            var params = "";

                            for (var value in checkList) {

                                if (params.length > 0) {
                                    params = params + ",";
                                }
                                params = params + value;
                            }

                            var url = url_delete;
                            var pst = {};
                            pst['id'] = params;

                            console.log("删除记录")
                            console.log(url);
                            console.log(pst);

                            // 发送请求到后台
                            request.post(url, pst, function(res) {

                                var result = res.data;

                                console.log("处理结果");
                                console.log(result);

                                alert(result.statusMsg);

                                if (result.status == "success") {

                                    // 重新加载数据
                                    she.load();
                                }

                            })

                        } else {

                            console.log('取消')
                        }

                    })

                } else {

                    alert("没有选中记录,请先选中");
                }

            },

            // 导入操作
            // 打开导入窗口
            btnImport: function(url) {

                let title = "导入数据";

                meth.openLayer(title, url);

                return false;

            },

            // 导出操作
            // 发送请求(包含查询参数)到后台
            btnExport: function() {

                let title = "导出数据";
                var url = url_outport;

                var pageIndex = this.$data.paging.pageIndex;
                var pageSize = this.$data.paging.pageSize;

                // 请求参数
                var searchParams = this.$data.searchForm;
                searchParams['pageIndex'] = pageIndex;
                searchParams['pageSize'] = pageSize;

                var paramsBuffer = "";

                for (let name in searchParams) {

                    let value = searchParams[name];

                    if (value) {

                        var kv = "";

                        if (paramsBuffer.length > 1) {
                            kv = "&";
                        }

                        kv = kv + name + "=" + value;
                        paramsBuffer = paramsBuffer + kv;

                    }
                }

                url = url + "?" + paramsBuffer;

                console.log(title);
                console.log(url);

                meth.openLayer(title, url);

                return false;
            },

            // 下载导出文件
            // 导出完成后提示导出文件,点击按钮即可下载
            btnDown: function(url) {

                let title = "下载导出数据";

                meth.openLayer(title, url);

                return false;
            },

            btnTest: function(e) {

                console.log(e);

                return false;
            },

            //-----------------------------------------------------------
            // 其它按钮操作相关的方法
            //-----------------------------------------------------------

            // 全选
            btnCheckAll: function() {

                console.log("++++++++++{btnCheckAll}++++++++++{1}++++++++++++")

                var checked = this.$data['checked'];

                if (checked == false) {
                    checked = true;
                } else {
                    checked = false;
                }

                console.log("checked=" + checked);

                if (checked == true) {

                    // 全选时
                    // 将数据列表项的ID值push到checkList数组
                    var list = this.$data[config.listName];

                    if (list) {
                        var checkList = this.$data['checkList'];
                        for (let i = 0; i < list.length; i++) {
                            var item = list[i];
                            if (item) {

                                var id = item[config.listId];
                                if (checkList.indexOf(id) == -1) {
                                    checkList.push(id);
                                }
                            }
                        }
                    }

                } else {

                    checkList = [];
                }

                // 更新参数
                this.$data["checkList"] = checkList;
                this.$data["checked"] = checked;

                console.log("checkList===>>>");
                console.log(checkList);
                console.log("checked===>>>");
                console.log(checked);

                console.log("++++++++++{btnCheckAll}++++++++++{2}++++++++++++")
                // alert("全选");
            },

            // 选中或取消复选框
            btnCheck: function(id) {

                console.log("++++++++++{btnCheck}++++++++++{1}++++++++++++")
                console.log("点击选择框:id=" + id);

                if (id) {

                    var checkList = this.$data["checkList"];

                    if (checkList) {

                        var index = checkList.indexOf(id);
                        console.log("当前ID索引index==>>" + index);

                        if (index == -1) {
                            checkList.push(id);
                        } else {
                            checkList.splice(index, index + 1);
                        }

                        var checked = false;
                        if (checkList.length > 0) {
                            checked = true;
                        }

                        // 更新参数
                        this.$data["checkList"] = checkList;
                        this.$data["checked"] = checked;

                        console.log("checkList===>>>");
                        console.log(checkList);
                        console.log("checked===>>>");
                        console.log(checked);

                    }

                }

                console.log("点击选择框:id=" + id);
                console.log("++++++++++{btnCheck}++++++++++{2}++++++++++++")
            },

            // 选择框被改变
            selectChange: function() {

            },

            //-----------------------------------------------------------
            // 扩展方法,执行其它操作时,通过此方法来执行
            //-----------------------------------------------------------

            // 执行外部函数
            func: function(fn) {
                fn();
            }

        }
    })

    // 默认加载第一页
    // vm.load();

    return vm;

}
阅读 2.6k
3 个回答

重构一下直接上单文件组件吧,这种老代码改 vue 组件很困难的。

这个是完整的页面,没必要封装成组件啊,它就是一张页面啊。哪怕是vue项目,它也就是一个单文件组件,直接放到一个.vue中就行了。

很久没看到原生写的 tr,th了。

原生写,做成多页面,html, js,css放在不同文件里面
vue写,放在.vue里面,就成了组件

如果是想把整个页面的CRUD功能都封装到一个组件里面,可以参考这个https://github.com/FEMessage/...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题