Laravel项目应用PullRefresh 下拉刷新(Vue组件)获取后台数据的详细使用过程

我们在查询自己一些历史记录的时候,是一个列表页,这个列表页往下滑,会自动加载。

今天记录的是如何使用vant组件应用到laravel项目中

假设现在要获取一个账户的提现列表,就可以用到该组件

首先看下从接口获取数据,

$page_num = $params['page_num'];//从前台定义之后传过来的变量
//进行查询
        $data = Withdrawal::select()
                ->where('withdrawals.user_id','=','2')//当前Id
                ->orderBy('withdrawals.id',"desc")//倒序
                ->paginate(8, null, null, $page_num);//laravel自带分页
//字段语义化
        foreach($data as &$val){
            $val->time = date('Y-m-d',strtotime($val->created_at));
            $val->status  = Withdrawal::STATUS[$val->status];
            $val->type = Withdrawal::TYPES[$val->type];
        }
        unset($val);

下面看下前台html部分

贴上代码

<div v-show="shelly">
        <div class="list_null" v-if="items == null || items==0" v-cloak>
            <div class="list_null_word">暂无提现记录!</div>
        </div>
        <van-list v-model="loading" :finished="finished" @load="ShowLoad">
            <div  v-for="item in items" v-cloak class="with-box" >
                <div class="with-box-left">
                    <div>单号:{{item.order_no ==''?'未知':item.order_no}}</div>
                    <div>提现类型:{{item.type ==''?'未知':item.type}}</div>
                    <div>提现状态:{{item.status == ''?'未知':item.status}}</div>
                </div>
                <div class="with-box-right" >
                    <div style="margin-top: -5px;">{{item.time == ''?'未知':item.time}}</div>
                    <div style="color:#101010;font-size: 20px;">
                        +{{item.trade_amount/100 ==''?0:item.trade_amount/100}}
                    </div>
                </div>
            </div>
        </van-list>
    </div>

从上面开始说:v-show=“shelly” 是自己定义的,首先加载页面的时候 ,整块隐藏掉,接下去判断列表的内容为空的话

v-if="items == null || items==0"

,就显示  暂无提现记录

否则就执行自动加载的组件。

先到这边,接下去将VUE.js部分,先看代码

var data_id  = obj.id;
    var page_num = 1;
    var app = new Vue({
        el:"#app",
        data() {
            return {
                show:false,
                items:[],
                loading: false,
                finished: false,
                post_data: {},
                total:"",
                shelly:false,
            };
        },
        mounted () {
            var _self =this ;
            var post_data = {
                id: data_id,
                method: 'withdraw.detail',
                nonce:' withdraw.detail',
                page_num: page_num,
            };
            axios.post('/api/v1',api_data_sign(post_data, 'mrf'))
                .then(function (response) {
                    var data = response.data;
                    if(data.code == 200){
                        _self.items = response.data.data.data;
                    }

                }).catch(function (error) {
                console.log(error);
            });
        },
        methods: {

            onClickLeft(){
                window.history.go(-1);
            },
            ShowLoad() {
                page_num++;
                if ($.isEmptyObject(this.post_data)) {
                    this.post_data = {
                        method: 'withdraw.detail',
                        nonce: 'withdraw.detail',
                        id: data_id,
                        page_num: page_num,
                    };
                }
                var _self = this;
                axios.post('/api/v1', api_data_sign(this.post_data, 'mrf'))
                    .then(function (response) {
                        if (response.data.code == 200) {
                            var datas = response.data.data.data;
                            var total =  response.data.data.total
                            var length = datas.length;
                            _self.shelly=true;
                            if (length == 0) {
                                _self.finished = true;
                            }else if(total<=_self.items.length){
                                _self.finished = true;
                            } else {
                                for (var i = 0; i < length; i++) {
                                    _self.items.push(datas[i]);
                                }
                            }
                            _self.post_data.page_num++;
                            _self.loading = false;

                        }
                    }).catch(function (error) {
                });
            },

        }
    });

从上往下开始讲,首页初始化变量var page_num = 1;传到接口那边可以使用,

return的值是要渲染的值,items是一个数组,组件的属性loading: false, finished: false,获取的条数total为空,定义的shelly为false,上述有提到

接下里是mouted,post请求我们拿数据的接口,将上面定义的page_num,赋予到page_num,准备传到接口那边拿数据,下面的

axios请求就是要循环的列表值,

接下来是methods,ShowLoad方法就是组件的下拉刷新的重要部分,加载时候,定义的页面肯定是要++的,接下去,同样和接口进行请求,

在axios请求当中,如果数据请求正确的话:shelly为true就是代表显示出来的,然后进行判断,如果获取的列表数长度为0,_self.finished = true;就是不再下拉刷新,再如果总条数小于获取的长度,同样也是不再拉下刷新,否则最后执行下拉刷新

else {
                                for (var i = 0; i < length; i++) {
                                    _self.items.push(datas[i]);
                                }

如果数据请求错误的话,

_self.post_data.page_num++;
                            _self.loading = false;

我们的组件使用就结束了,接下来看下我们的效果图

未拉下刷新前,只有渲染没有进行下拉刷新的数据请求

再次往下拉,就有了刷新请求v1

第一次使用这个组件,发现很方便,欢迎进行交流

猜你喜欢

转载自blog.csdn.net/zhangzeshan/article/details/82721412