如何在没有刷新页面的情况下使Laravel分页

时间:2019-09-01 11:01:05

标签: laravel laravel-5 laravel-pagination

我正在进行在线考试,我想在不同页面上分页回答问题,但是问题是,当我转到下一页时,以前的答案消失了,因为页面刷新了,那么我如何在不刷新的情况下使Laravel分页?

运行Laravel 5.8

控制器代码:

$questions = $exam->questions()->paginate(1);
return view('exam.exam',compact('questions','exam'));
$questions = $exam->questions()->paginate(1);
return view('exam.exam',compact('questions','exam'));

查看代码

   {!! $questions->render() !!}

2 个答案:

答案 0 :(得分:1)

可悲的是,如果没有一点异步javascript,就无法实现-除非您要预载所有页面。

您最好的选择是创建一个以json格式返回分页条目的API,然后使用javascript加载它。

答案 1 :(得分:0)

最后我使用vue.js和axios做到了

app.js代码:

print
data: {
        posts: {},
        pagination: {
            'current_page': 1
        }
    },

     methods: {
        fetchPosts() {
            axios.get('posts?page=' + this.pagination.current_page)
                .then(response => {
                    this.posts = response.data.data.data;
                    this.pagination = response.data.pagination;
                })
                .catch(error => {
                    console.log(error.response.data);
                });
        }
    },

    mounted() {
        this.fetchPosts();
    }
    
并提出一条使分页信息成为: 注意:此路由将仅用于将分页数据返回到json

//and i added the pagination in a Component:

<template>
    <nav class="pagination is-centered" role="navigation" aria-label="pagination">
        <a class="pagination-previous" @click.prevent="changePage(1)" :disabled="pagination.current_page <= 1">First page</a>
        <a class="pagination-previous" @click.prevent="changePage(pagination.current_page - 1)" :disabled="pagination.current_page <= 1">Previous</a>
        <a class="pagination-next" @click.prevent="changePage(pagination.current_page + 1)" :disabled="pagination.current_page >= pagination.last_page">Next page</a>
        <a class="pagination-next" @click.prevent="changePage(pagination.last_page)" :disabled="pagination.current_page >= pagination.last_page">Last page</a>
        <ul class="pagination" style="display:block">
             <li v-for="page in pages">
                <a class="pagination-link" :class="isCurrentPage(page) ? 'is-current' : ''" @click.prevent="changePage(page)">{{ page }}</a>
            </li>
        </ul>
    </nav>
</template>

<style>
    .pagination {
        margin-top: 40px;
    }
</style>

<script>
    export default {
        props: ['pagination', 'offset'],

        methods: {
            isCurrentPage(page) {
                return this.pagination.current_page === page;
            },

            changePage(page) {
                if (page > this.pagination.last_page) {
                    page = this.pagination.last_page;
                }

                this.pagination.current_page = page;
                this.$emit('paginate');
            }
        },

        computed: {
            pages() {
                let pages = [];

                let from = this.pagination.current_page - Math.floor(this.offset / 2);

                if (from < 1) {
                    from = 1;
                }

                let to = from + this.offset - 1;

                if (to > this.pagination.last_page) {
                    to = this.pagination.last_page;
                }

                while (from <= to) {
                    pages.push(from);
                    from++;
                }

                return pages;
            }
        }
    }
</script>


<!-- begin snippet: js hide: false console: true babel: false -->

并在控制器中创建一个函数以返回分页信息:

Route::get('/posts', 'postContoller@pagination');

现在创建一个新视图并将其粘贴到

public function pagination(\App\post $post){
    $posts = $post->paginate(1);
    $response = [
        'pagination' => [
            'total' => $posts->total(),
            'per_page' => $posts->perPage(),
            'current_page' => $posts->currentPage(),
            'last_page' => $posts->lastPage(),
            'from' => $posts->firstItem(),
            'to' => $posts->lastItem()
        ],
        'data' => $posts
    ];
    return response()->json($response);
}      

并为其创建路线

<div id="app">
 <div  v-for="post in posts">
    <div class="font-weight-bold p-4"> @{{post.qname}}</div>
 </div>
</div>