项目中自己用 Vue 封装了一个分页工具条.
但是最近却总是报这个错误.
vue.js:634 [Vue warn]: Invalid prop: type check failed for prop “pageindex”. Expected Number with value NaN, got MouseEvent

分页工具条的代码贴一下如下, (全当分享了. 此问题跟分页工具条的代码无关.)

VuePagebar.js的代码

Vue.component('v-pagebar', {
    //model: {
    //    prop: 'page_index'
    //},
    data: function () { 
        var d = {
            page_index: this.pageindex == undefined || isNaN(this.pageindex) ? 1 : this.pageindex,
            page_size: this.pagesize == undefined || isNaN(this.pagesize) ? 30 : this.pagesize,
            //totalcount: this.totalcount == undefined ? 0 : this.totalcount,
            total_page: this.totalcount == undefined || isNaN(this.totalcount) ? 1 : Math.ceil(this.totalcount / this.pagesize), //Math.ceil向上取整,有小数就+1
        };
        this.getIndexs(d);
        this.showpageindex = d.page_index;
        return d;
    },
    watch:{     //监听value的变化,进行相应的操作即可
        totalcount: function (a, b) {     //a是value的新值,b是旧值  
            this.total_page = a == undefined ? 1 : Math.ceil(a / this.pagesize); //Math.ceil向上取整,有小数就+1
            this.getIndexs(this); 
        },
        pageindex: function (a, b) {     //a是value的新值,b是旧值   
            this.page_index = a; //Math.ceil向上取整,有小数就+1
            this.getIndexs(this);
        },
        pagesize: function (a, b) {
            this.page_size = a; //Math.ceil向上取整,有小数就+1
            this.getIndexs(this);
        }
    },
    props: { 
        pageindex: Number,
        pagesize:Number, 
        totalcount: Number,
    },
    template: [
                '     <div class="pagebar">', 
                '            <ul class="pagination">',
                '                <li class="paginate_button" >',
                '                    <a href="#" v-on:click="jumptopage(1)" style="color:#337ab7">首页</a>',
                '                </li>',
                '                <li v-bind:class="this.page_index <= 1? \'disabled\':\'\' "  >',
                '                    <a href="#" v-on:click="previous" style="color:#337ab7">上一页</a>',
                '                </li>',
                '                <li v-for="num in indexs" :class="num!=page_index?\'paginate_button\':\'paginate_button active\'">',
                '                    <a href="#" v-on:click="jumptopage(num)" v-bind:style="{color:(num!=page_index ? \'#337ab7\' : \'\')}">{{num}}</a>',
                '                </li>',
                '                <li v-bind:class="this.page_index>=this.total_page?\'disabled\':\'\'" >',
                '                    <a href="#" v-on:click="next" style="color:#337ab7">下一页</a>',
                '                </li>',
                '                <li class="paginate_button" >',
                '                    <a href="#" v-on:click="jumptopage(total_page)" style="color:#337ab7">尾页</a>',
                '                </li>',
                '            </ul>',

                '            <ul class="pagination">', 
                '                <li >',
                '                   <a>第<input style="width:25px;height:20px;" v-on:change="jumptopage(showpageindex)" v-model:value="showpageindex">/{{total_page}}页,共{{totalcount}}条记录</a>',
                //'                   <a  v-on:click="jumptopage(page_index)" style="color:#337ab7"  >跳转</a>',
                '               </li>',
                '            </ul>',
                '    </div>'
                ].join('\r\n'),
    methods: {
        next: function () {
            //alert(this.page_index);
            if (this.page_index < this.total_page) {
                this.page_index++;
                this.changePage();
            }
        },
        previous: function () {
            if (this.page_index == 1)
            {
                return;
            }
            if (this.page_index > 1) {
                this.page_index--;
            }

            this.changePage();
        },
        changePage: function () {
            this.getIndexs(this);
            this.$emit('page-change', this.page_index);
        },
        getIndexs: function (_this) {
            //var left = 1
            //var right = _this.total_page
            //var ar = []
            //if (_this.total_page >= 10) {
            //    if (_this.page_index > 8 && _this.page_index < _this.total_page - 7) {
            //        left = Number(_this.page_index) - 4
            //        //right = Number(_this.page_index) - 1
            //        right = Number(_this.page_index) + 5
            //    } else {
            //        if (_this.page_index <= 8) {
            //            left = 1
            //            right = 10
            //        } else {
            //            right = _this.total_page
            //            left = _this.total_page - 9
            //        }
            //    }
            //}
            //while (left <= right) {ar.push(left)
            //    left++
            //}
            //_this.indexs = ar
            var ar = []; 
            // (_this.page_index - 3 > 0) { ar.push(_this.page_index - 3); }
            if (_this.page_index - 2 > 0) { ar.push(_this.page_index - 2); }
            if (_this.page_index - 1 > 0) { ar.push(_this.page_index - 1); }
            if (_this.page_index - 0 > 0) { ar.push(_this.page_index - 0); }
            if (_this.page_index + 1 <= _this.total_page) { ar.push(_this.page_index + 1); }
            if (_this.page_index + 2 <= _this.total_page) { ar.push(_this.page_index + 2); }
            if (_this.page_index + 3 <= _this.total_page) {
                if (_this.page_index + 4 <= _this.total_page)
                {
                    ar.push("...");
                } else {
                    ar.push(_this.page_index + 3);
                }
            }
            if (_this.page_index + 4 <= _this.total_page) { ar.push(_this.total_page); }

            _this.indexs = ar;
            this.showpageindex = _this.page_index;
        },
        jumptopage: function (num) {
            if (num == '...') {
                num = this.page_index + 3;
            }
            if (!(/(^[1-9]\d*$)/.test(num)) || num == '') { num = 1 }
             
            num = num * 1;//转数字
            if (this.total_page <= 0)
            {
                this.total_page = 1;
            }
            if (num > this.total_page) { num = this.total_page * 1; }
            this.page_index = num;
            this.changePage();
        }

    }
})

使用方法


<button class="btn btn-primary " type="button"  v-on:click="getData" style="margin-left:50px;"><i class="fa fa-search"></i>查询</button>
 ....
 ....
<v-pagebar v-bind:pageindex="this.pageindex" v-bind:pagesize="this.pagesize" v-bind:totalcount="this.total" v-on:page-change="this.pagechange"></v-pagebar>
 

<script type="text/javascript">
    var BTSampleInfomain = new Vue({
        el: "#SampleInfoVueIndexMainDiv",
        data: {
            CompanySeachKey:'',
            list: [], 
            SelectedSampleID: '',//当前选择的条码,变背景色用 
            pageindex: 1,
            total: 0,
            pagesize: 30,
            ascending: false,
            sortField: "ReceiveDate",

        },
        created: function () {//这里定义这个方法,vue实例之后运行到这里就调用这个函数
            var _this = this;
            setTimeout(function () { //延时是因为控件没准备好.
                $("#SampleInfoVueIndexMainDiv").find(".txtBeginDate").val(laydate.now(-1, "YYYY-MM-DD 07:00"));
                $("#SampleInfoVueIndexMainDiv").find(".txtEndDate").val(laydate.now(0, "YYYY-MM-DD 23:59"));

                _this.getData();
                _this = null;
            }, 300); 
        },
        methods: { 
            getData: function (page) {
                if (page != undefined && page != NaN) { this.pageindex = page }
                var params = {};
                params.pageindex = this.pageindex;
                params.pagesize = this.pagesize;
                params.ascending = this.ascending;
                params.sortField = this.sortField;
                var seachParam = $("#SampleInfoVueIndexMainDiv").find(".seacherform").serializeArray();
                for (var i = 0; i < seachParam.length; i++) {
                    params[seachParam[i]["name"]] = seachParam[i]["value"];
                }
                

                this.$http.post('/SampleInfo/SampleInfo/Ajax_LoadData', params).then(function (response) { 
                    if (typeof response.body == "string"){
                        MidPageLayer("出错了", response.body, "ErrorInfo", [2 * (document.documentElement.clientWidth) / 3 + 'px', document.documentElement.clientHeight + 'px']);
                    } else {
                        if (response.body.success == true)
                        { 
                            this.list = response.body.list;
                            this.total = response.body.total; 
                            this.pageindex = response.body.pageindex;
                            //this.TestAimsList = [];
                            //this.SampleTrackList = [];
                        } else {
                            alert(response.body.message);
                        }
                    }
                });
            }, 
            pagechange: function (page) { 
                this.getData(page);
            },
            sort: function (sortField) {
                this.list.sort(function (a, b) {
                    if (a[sortField] == null) {
                        a[sortField] = '';
                    }
                    if (b[sortField] == null) {
                        b[sortField] = '';
                    }
                    a = a[sortField].toString().toLowerCase();
                    b = b[sortField].toString().toLowerCase();
                    return a < b ? -1 : a > b ? 1 : 0;
                });
                this.ascending = this.sortField === sortField ? !this.ascending : false;
                if (this.ascending) this.list.reverse();
                this.sortField = sortField;
            },
            sortclass: function (sortField) {
                return this.sortField === sortField ? this.ascending === true ? 'sorting_desc' : 'sorting_asc' : 'sorting'
            }
        }
    });


</script>

如上的使用方法总是报错误, 后来改了一下v-on:click 就可以了,增加了一个中间隔离用的pagechange方法.

<button class="btn btn-primary " type="button"  v-on:click="pagechange(1)" style="margin-left:50px;"><i class="fa fa-search"></i>查询</button>

<script>
	methods: { 
		    pagechange: function (page) { 
                this.getData(page);
            },
            ....
	}
</script>

猜测问题原因,错误写法中, v-on:click=“getData” 这种不带参数的写法是不正确的.
Vue好像会自动传递一个参数MouseEvent进来, 然后里面的名字因为一致导致了自动赋值.
然后在后面的刷新界面,检测数据类型时导致了系统报错.
所以这种 v-on:click=“getData” 不带圆括号参数的写法还是要注意的. 最好带上 圆括号