vue Invalid prop: type check failed for prop Expected Number

项目中自己用 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: [
                '     
', ' ', ' ', '
'
].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” 不带圆括号参数的写法还是要注意的. 最好带上 圆括号

你可能感兴趣的:(js)