vue.js 分页查询实例

分页工具
vuejs-paginate

https://github.com/lokyoung/vuejs-paginate

安装 npm install vuejs-paginate
(需安装bootstrap)

Page组件:


<template>
<div id="page">
  <div class="form-group">
    <input v-model="findmessage" placeholder="搜索">
    <button v-on:click="loadData(CurrentPage)">Submit</button>
<i class="iconfont">&#xe645;</i>
  </div>
  <ul>
    <li v-for='item in items'>{{ item.name }}</li>
  </ul>
  <paginate
    :page-count="20"
    :click-handler="loadData"
    :prev-text="'Prev'"
    :next-text="'Next'"
    :container-class="'pagination'">
  </paginate>
</div>
</template>


<script>
import Paginate from 'vuejs-paginate'

export default {
  name: 'page',
  data () {
    return {
      items: [],
      perpage: 2,
      findmessage: '',
      CurrentPage: 1
    }
  },
  methods: {
    loadData (PageNum) {
      this.CurrentPage = PageNum
      const options = {
        params: {
          find: this.findmessage,
          limit: this.perpage,
          offset: this.perpage * (PageNum - 1),
          emulateJSON: true
          /* additional parameters */
        }
      }
      this.$http.jsonp('http://localhost/test_json/text.php?flag=showmessage', options).then(function (response) {
        // 这里是处理正确的回调
        console.log(response.data.comments)
        this.items = response.data.comments
        // this.articles = response.data["subjects"] 也可以
      },
      function (response) {
        // 这里是处理错误的回调
        console.log(response)
      })
    }
  },
  created: function () {
    this.loadData(1)
  },
  components: {
    Paginate
  }
}
</script>
<style>
@font-face {font-family: "iconfont";
  src: url('../assets/iconfont.eot?t=1509605424186'); /* IE9*/
  src: url('../assets/iconfont.eot?t=1509605424186#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAV8AAsAAAAACBwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFZW7kgvY21hcAAAAYAAAABeAAABhppMBr5nbHlmAAAB4AAAAakAAAIE2jGiq2hlYWQAAAOMAAAALwAAADYPYQZcaGhlYQAAA7wAAAAcAAAAJAfeA4RobXR4AAAD2AAAAAwAAAAMC+kAAGxvY2EAAAPkAAAACAAAAAgAdgECbWF4cAAAA+wAAAAfAAAAIAETAGVuYW1lAAAEDAAAAUUAAAJtPlT+fXBvc3QAAAVUAAAAJgAAADdM3kXmeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2Bk/sE4gYGVgYOpk+kMAwNDP4RmfM1gxMjBwMDEwMrMgBUEpLmmMDgwVDxzZW7438AQw9zA0AAUZgTJAQAoewyxeJzFkMENgDAMAy9t6QMxCA/W6A68mKMTd41iQnkwQS05VhxLiQIsQBQPMYFdGA9OueZ+ZHU/eSZLjUBtpXf1nyqiWXYNKplpsHmr/9i87qPTV6iDOrGVl4Qb/7cMowAAeJx1kE1r1FAUhu97r0lm0nw0yc33fN2JM7FTEzCTzoyUTl24UboouFAXLvoD6rZQFFqoIuLChb9ABHGl4LaCa39Cd6J/Y6K3uLWXs3gO5+UcnksUQv78ZOcsIh65QW6Ru2SfEKibGFq0C5HXJd2ELxQ/5BbLs1xo2bBkOwiHKg+qWT0OVU21YaGHqahmeUlzbNVLuo0q6AJxmjxwRx2XvYUe5b0XzX36Hn4/69jLorl3c5dXA691ZLhu7LpvWqqitCi9Zls4DIO20tbV5oNiJ/55f4P2YcR5svfYHKTuwav6aXcUtoGTE3jpwPq46ySOrGdJ4Lmxtm62osTMrnMc/V6LPKM7/kXkU6XrZ/aD7ZMBmZCa3CF75JG0zbZK5MKC5meXVttwegjFEnNnWs3mJUb1bC56kN8hPTUhw55QVE2m5NgpMb2C2ZdvWEyai8mCftVt09iRHc03bmOq22Brq9MOx5h3mmNqIvBWF74Ao2fNOAZsfpl49x+i34vJAnJTYQX26uU/psemoa8XPAVSXqyehEMg4vT5a0TNJ8M0DTyUJ6/gvzEJUCAAAAB4nGNgZGBgAGLWZRa/4/ltvjJwszCAwDWFhwYI+v96FgbmACCXg4EJJAoAGCYJrAB4nGNgZGBgbvjfwBDDwgACQJKRARUwAwBHCQJsBAAAAAPpAAAEAAAAAAAAAAB2AQJ4nGNgZGBgYGaIZGBjAAEmIOYCQgaG/2A+AwAR1gF5AHicZY9NTsMwEIVf+gekEqqoYIfkBWIBKP0Rq25YVGr3XXTfpk6bKokjx63UA3AejsAJOALcgDvwSCebNpbH37x5Y08A3OAHHo7fLfeRPVwyO3INF7gXrlN/EG6QX4SbaONVuEX9TdjHM6bCbXRheYPXuGL2hHdhDx18CNdwjU/hOvUv4Qb5W7iJO/wKt9Dx6sI+5l5XuI1HL/bHVi+cXqnlQcWhySKTOb+CmV7vkoWt0uqca1vEJlODoF9JU51pW91T7NdD5yIVWZOqCas6SYzKrdnq0AUb5/JRrxeJHoQm5Vhj/rbGAo5xBYUlDowxQhhkiMro6DtVZvSvsUPCXntWPc3ndFsU1P9zhQEC9M9cU7qy0nk6T4E9XxtSdXQrbsuelDSRXs1JErJCXta2VELqATZlV44RelzRiT8oZ0j/AAlabsgAAAB4nGNgYoAALgbsgJmRiZGZkYWBsYIzJzErsyIzMS+dgQEAJBoEVQAA') format('woff'), url('../assets/iconfont.ttf?t=1509605424186') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ url('../assets/iconfont.svg?t=1509605424186#iconfont') format('svg'); /* iOS 4.1- */
}

.iconfont {
  font-family:"iconfont" !important;
  font-size:16px;
  font-style:normal;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
</style>

main.js:

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import 'bootstrap/dist/css/bootstrap.min.css'
import 'bootstrap/dist/js/bootstrap.min.js'
import App from './App'
import router from './router'
import VueResource from 'vue-resource'
import Paginate from 'vuejs-paginate'
Vue.component('paginate', Paginate)
Vue.use(VueResource)
Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  template: '<App/>',
  components: { App }
})

php文件:
test.php:

<?php  
    require_once('conn.php');  
    /* 
     *选择数据表  
     * */  
    $limit = $_GET['limit'];
    $offset = $_GET['offset'];
    $find = $_GET['find'];
    $sql = 'SELECT * from test where name like "%'.$find.'%" limit '.$offset.', '.$limit.'';  
    $result = $conn->query($sql);  
    $dataarr = array();  
    while($row = $result->fetch_array()){  
        $dataarr[]=$row;  
    }  

    // $id=$_GET['id'];  
    // if($id==1){  
    Response::json(1,'数据返回成功',$dataarr);  
    // }else if($id==2){  
    //     Message::json(0,'失败');  
    // }  
?>

conn.php:

<?php  
    header("charset=utf-8");  
    header("Access-Control-Allow-Origin: *");
    header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
    $servername="localhost";  
    $username="root";  
    $password="";  
    $dbname="test";  
    $conn = new mysqli($servername,$username,$password,$dbname);  
    if(!$conn){  
        echo "数据库连接失败!";  
    }  
    //mysqli_select_db($dbname);  
    class Response{  
        public static function json($code,$message="",$comments=array()){  
            $result=array(  
              'code'=>$code,  
              'message'=>$message,  
              'comments'=>$comments   
            );  
            //输出json  
            $b = json_encode($result);  
            echo "{$_GET['callback']}({$b})";
            exit;  
        }  
    }  

?>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先,需要准备好Vue和axios,然后创建一个Vue实例,在实例中定义一个data函数,用于存储分页查询的信息,包括当前页数、每页的数量和总数量等。在created函数中,调用axios来发送请求,获取分页数据。在mounted函数中,初始化分页器。在methods函数中,添加分页器的处理函数,实现点击分页器时触发axios来获取分页数据。 ### 回答2: Vue.js是一种用于构建用户界面的JavaScript框架。它具有简单易用、高效灵活的特点,因此非常适合用来开发前端分页查询程序。 首先,我们需要安装Vue.js和Vue Router插件。然后创建一个Vue实例,并在该实例中定义一个组件用于处理分页查询功能。 在组件中,我们可以使用Vue的响应式数据来存储查询结果和当前页码。我们还可以使用计算属性来根据总记录数和每页显示的数据量计算总页数。 接下来,我们需要在模板中定义一个表格来显示查询结果。可以使用v-for指令来遍历查询结果数组,并显示每条记录的相关信息。 为了实现分页功能,我们可以添加两个按钮或链接,一个用于切换到上一页,另一个用于切换到下一页。当点击按钮时,我们可以调用方法来更新当前页码,并重新查询数据。 为了实现数据的异步加载和渲染,我们可以使用Axios或Fetch等工具来发送HTTP请求,并接收服务器返回的数据。 最后,我们可以在Vue实例的mounted钩子函数中调用查询方法,来初始化数据并显示第一页的查询结果。 整个过程中,我们可以使用Vue的生命周期钩子函数来管理组件的生命周期,以便在适当的时候加载数据、监听事件、更新状态等。 通过以上步骤,我们就可以构建一个基本的Vue前端分页查询程序了。当用户输入查询条件并点击查询按钮时,程序将发送请求到后端服务器并获取分页查询结果,然后将结果显示在前端界面中。用户还可以通过按钮或链接来切换不同的页码,以便查看更多的查询结果。 ### 回答3: Vue是一个用于构建用户界面的渐进式JavaScript框架。使用Vue可以轻松地构建交互式的前端应用程序。下面是一个使用Vue实现前端分页查询的示例程序。 1. 在HTML文件中引入Vue和axios,axios是一个用于进行HTTP请求的库。 ```html <html> <head> <title>前端分页查询</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> </head> <body> <div id="app"> <h1>前端分页查询</h1> <table> <thead> <tr> <th>ID</th> <th>Name</th> <th>Age</th> </tr> </thead> <tbody> <tr v-for="person in persons" :key="person.id"> <td>{{person.id}}</td> <td>{{person.name}}</td> <td>{{person.age}}</td> </tr> </tbody> </table> <div> <button @click="previousPage">上一页</button> <span>{{currentPage}}</span> <button @click="nextPage">下一页</button> </div> </div> <script src="script.js"></script> </body> </html> ``` 2. 在JavaScript文件中编写Vue实例和相关的方法。 ```javascript let app = new Vue({ el: '#app', data: { currentPage: 1, // 当前页码 pageSize: 10, // 每页显示的记录数 totalRecords: 0, // 总记录数 persons: [] // 查询结果 }, mounted() { this.loadData(); // 初始化时加载数据 }, methods: { loadData() { let startIndex = (this.currentPage - 1) * this.pageSize; // 计算查询起始位置 let url = `https://example.com/api/persons?startIndex=${startIndex}&pageSize=${this.pageSize}`; axios.get(url) .then(response => { this.persons = response.data; // 将查询结果赋值给persons数组 this.totalRecords = response.headers['x-total-count']; // 获取总记录数 }) .catch(error => { console.log(error); }); }, previousPage() { if (this.currentPage > 1) { this.currentPage--; this.loadData(); // 加载上一页数据 } }, nextPage() { let totalPages = Math.ceil(this.totalRecords / this.pageSize); if (this.currentPage < totalPages) { this.currentPage++; this.loadData(); // 加载下一页数据 } } } }); ``` 以上示例程序实现了一个简单的前端分页查询功能。用户可以点击“上一页”和“下一页”按钮来切换分页,并且查询结果会根据当前页码和每页记录数进行动态加载。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值