vue 分页

1、直接引入的vue.js做的分页。
2、分页式样用的datetable,因为之前用datatable写分页,发现搞不明白他,就自己写了一个。
3、由于后端是django,前端模板有django模板语言,去掉就行。
4、不懂得欢迎咨询
github

效果如下:


GIF.gif

html

{% extends 'ssityadmin/base.html' %}
{% load static %}

{% block title %}
SsityaAdmin | 访客详情
{% endblock title %}

{% block css %}
<link rel="stylesheet" href="{% static "bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css" %}">
{% endblock css %}

{% block content-wrapper %}
    <section class="content-header">
        <h1>
            访客详情
            <small>表单数据</small>
        </h1>
        <ol class="breadcrumb">
            <li><a><i class="fa fa-street-view"></i> SsityAdmin</a></li>
            <li class="active">访客详情</li>
        </ol>
    </section>

    <section class="content">
        <div class="row">
            <div class="col-xs-12">
                <div class="box">
                    <div class="box-header">
                        <h3 class="box-title">访客数据表</h3>
                    </div>
                    <!-- /.box-header -->
                    <div class="box-body" id="visitor-table">
                        <div id="example1_wrapper" class="dataTables_wrapper form-inline dt-bootstrap">
                            <div class="row">
                                <div class="col-sm-6">
                                    <div class="dataTables_length" id="example1_length">
                                        <label>选择每页显示
                                            <select v-model="size" class="form-control input-sm" @change="changesize">
                                                <option value="10">10</option>
                                                <option value="20">20</option>
                                                <option value="30">30</option>
                                                <option value="40">40</option>
                                                <option value="50">50</option>
                                            </select> 条
                                        </label>
                                    </div>
                                </div>

                            </div>
                            <div class="row">
                                <div class="col-sm-12">
                                    <table class="table table-bordered table-striped dataTable" >
                                        <thead>
                                        <tr class="odd">
                                            <th class="dataTables_empty" >id</th>
                                            <th class="dataTables_empty" >ip</th>
                                            <th class="dataTables_empty" >country</th>
                                            <th class="dataTables_empty" >province</th>
                                            <th class="dataTables_empty" >city</th>
                                            <th class="dataTables_empty" >time</th>
                                        </tr>
                                        </thead>
                                        <!-- 加载数据显示过度 -->
                                        <tbody v-show="loaddata">
                                        <tr class="odd" >
                                            <td valign="top" colspan="6" class="dataTables_empty" style="color: #e23838;">数 据 加 载 中
                                            </td>
                                        </tr>
                                        </tbody>
                                        <!-- 无数据显示 -->
                                        <tbody v-show="tabledata == undefined || tabledata.length <= 0">
                                        <tr class="odd" v-show="!loaddata">
                                            <td valign="top" colspan="6" class="dataTables_empty" style="color: #0925ef;">暂 无 数 据
                                            </td>
                                        </tr>
                                        </tbody>
                                        <tbody v-for="data in tabledata">

                                        <tr class="odd">
                                            {% verbatim %}
                                            <td class="dataTables_empty" >{{ data.id }}</td>
                                            <td class="dataTables_empty" >{{ data.ip }}</td>
                                            <td class="dataTables_empty" >{{ data.country }}</td>
                                            <td class="dataTables_empty" >{{ data.province }}</td>
                                            <td class="dataTables_empty" >{{ data.city }}</td>
                                            <td class="dataTables_empty" >{{ data.time }}</td>
                                            {% endverbatim %}
                                        </tr>
                                        </tbody>

                                    </table>
                                </div>
                            </div>
                            <div class="row">
                                <div class="col-sm-5">
                                    {% verbatim %}
                                    <div class="dataTables_info">显示{{ size }}条一页/共{{ count }}条</div>
                                    {% endverbatim %}
                                </div>
                                <div class="col-sm-7">

                                    <div class="dataTables_paginate paging_simple_numbers">
                                        <ul class="pagination">
                                            <li class="page" v-show="currentPage !== 1 " @click="prevOrNext(-1)"><span class="fa fa-chevron-left" aria-hidden="true"></span></li>
                                            <li class="paginate_button" v-show="tabledata !==undefined && tabledata.length > 0" v-for="(item, index) in pages" :key="index" :class="{active: item === currentPage}" @click="select(item)">
                                                {% verbatim %}
                                                <span>{{item}}</span>
                                                {% endverbatim %}
                                            </li>
                                            <li class="page" v-show="currentPage !== totalPages" @click="prevOrNext(1)"><span class="fa fa-chevron-right" aria-hidden="true"></span></li>
                                        </ul>
                                    </div>

                                </div>
                            </div>
                        </div>
                    </div>
                    <!-- /.box-body -->
                </div>
                <!-- /.box -->
            </div>
            <!-- /.col -->
        </div>
        <!-- /.row -->
    </section>



{% endblock content-wrapper %}

{% block js %}
<script src="{% static "vue/vue.min.js" %}"></script>
<script src="{% static "vue/axios.min.js" %}"></script>
<script>
var vm = new Vue({
    el: '#visitor-table',
    data:{
        'page': '',
        'size': '',
        'tabledata': '',
        'currentPage': 1,//定义默认页面为1
        'totalPages': 1,//定义默认总页面为1
        'count': '',
        'loaddata': true,
    },
    mounted () {

        // 获取cookie,并加载第一页数据
        var value = '; ' + document.cookie;
        var parts = value.split('; ' + 'csrftoken' + '=');
        if (parts.length === 2)
            var getCookie = parts.pop().split(';').shift();
        axios
            .get('/ssityadmin/visitor/list/',{headers: {'X-CSRFToken': this.getCookie}})
            .then((response) =>{
                vm.loaddata = false;
                vm.tabledata = response.data.results;
                vm.count = response.data.count;
                console.log(vm.count);
                vm.currentPage = 1;
                vm.size = 10;
                if (vm.count === 0){
                    vm.totalPages = 1;
                    console.log(vm.totalPages)
                }else{
                    vm.totalPages = Math.ceil(vm.count/vm.size);
                    console.log(vm.totalPages);
                }
            })
        },
    computed: {
        //计算显示的页面
        pages() {
            const c = this.currentPage;
            const t = this.totalPages;
            var left = 1;
            var right = this.totalPages;
            var arr = [];
            if(this.totalPages>=7){
                if(this.currentPage>4 && this.currentPage<this.totalPages-3){
                    left = this.currentPage-3;
                    right = this.currentPage+3;
                }else if(this.currentPage<=4){
                    left=1;
                    right=7;
                }else{
                    left=this.totalPages-6;
                    right=this.totalPages;
                }
            }
            while(left<=right){
                arr.push(left);
                left++;
            }
            return arr;
        }
    },
    methods: {
        //选择页面,并加载数据
        select(n) {
            if (n === this.currentPage) return;
            if (typeof n === 'string') return;
            this.currentPage = n;
            console.log(this.currentPage);
            vm.tabledata = '';
            vm.loaddata = true;
            var value = '; ' + document.cookie;
            var parts = value.split('; ' + 'csrftoken' + '=');
            if (parts.length === 2)
                var getCookie = parts.pop().split(';').shift();
            axios
                .get('/ssityadmin/visitor/list/' + '?page=' + this.currentPage + '&size=' + this.size, {headers: {'X-CSRFToken': this.getCookie}})
                .then((response) => {
                    vm.loaddata = false;
                    console.log(response);
                    vm.tabledata = response.data.results;
                    console.log(vm.tabledata);
                    vm.count = response.data.count;
                    console.log(vm.count);
                    if (vm.count === 0){
                        vm.totalPages = 1;
                        console.log(vm.totalPages)
                    }else{
                        vm.totalPages = Math.ceil(vm.count/vm.size);
                        console.log(vm.totalPages);
                    }
                })
        },
        //左右两边的< > ,b=并加载数据
        prevOrNext(n) {
            this.currentPage += n;
            console.log(this.currentPage);
            vm.tabledata = '';
            vm.loaddata = true;
            var value = '; ' + document.cookie;
            var parts = value.split('; ' + 'csrftoken' + '=');
            if (parts.length === 2)
                var getCookie = parts.pop().split(';').shift();
            axios
                .get('/ssityadmin/visitor/list/' + '?page=' + this.currentPage + '&size=' + this.size, {headers: {'X-CSRFToken': this.getCookie}})
                .then((response) => {
                    vm.loaddata = false;
                    console.log(response);
                    vm.tabledata = response.data.results;
                    console.log(vm.tabledata);
                    vm.count = response.data.count;
                    console.log(vm.count);
                    if (vm.count === 0){
                        vm.totalPages = 1;
                        console.log(vm.totalPages)
                    }else{
                        vm.totalPages = Math.ceil(vm.count/vm.size);
                        console.log(vm.totalPages);
                    }
                })
        },
        // 选择每条条数,并加载数据
        changesize:function(){
            vm.tabledata = '';
            vm.loaddata = true;
            var value = '; ' + document.cookie;
            var parts = value.split('; ' + 'csrftoken' + '=');
            if (parts.length === 2)
                var getCookie = parts.pop().split(';').shift();
            axios
                .get('/ssityadmin/visitor/list/' + '?page=' + this.currentPage + '&size=' + this.size, {headers: {'X-CSRFToken': this.getCookie}})
                .then((response) => {
                    if (response.status === 200){
                        vm.loaddata = false;
                        console.log(response.status);
                        console.log(response);
                        vm.tabledata = response.data.results;
                        console.log(vm.tabledata);
                        vm.count = response.data.count;
                        console.log(vm.count);
                        if (vm.count === 0){
                            vm.totalPages = 1;
                            console.log(vm.totalPages)
                        }else{
                            vm.totalPages = Math.ceil(vm.count/vm.size);
                            console.log(vm.totalPages);
                        }
                    }else{
                        vm.tabledata = '';
                        console.log(response.status);
                        alert('无效页面')
                    }
                })
                .catch(error => {
                    vm.tabledata = '';
                    vm.loaddata = false;
                    if (error.response.status === 404){
                        console.log(error.response.status);
                        alert('无效页面')
                    }else{
                        alert('无效页面')
                    }
                });

        }
    }
})
</script>
{% endblock js %}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342