vue pagination axio full (ok)
https://github.com/bezkoder/vue-pagination-axios
Bước 1: Xây dụng db.json
C:\xampp\htdocs\api\db.json
{
"api": [
{
"id": 1,
"title": "json-server 1",
"description": "description"
},
{
"id": 2,
"title": "json-server 2",
"description": "description"
},
{
"id": 3,
"title": "json-server 3",
"description": "description"
},
{
"id": 4,
"title": "json-server 4",
"description": "description"
},
{
"id": 5,
"title": "json-server 5",
"description": "description"
},
{
"id": 6,
"title": "json-server 6",
"description": "description"
},
{
"id": 7,
"title": "json-server 7",
"description": "description"
},
{
"id": 8,
"title": "json-server 8",
"description": "description"
},
{
"id": 9,
"title": "json-server 9",
"description": "description"
},
{
"id": 10,
"title": "json-server 10",
"description": "description"
},
{
"id": 11,
"title": "json-server 11",
"description": "description"
},
{
"id": 12,
"title": "json-server 12",
"description": "description"
},
{
"id": 13,
"title": "json-server 13",
"description": "description"
},
{
"id": 14,
"title": "json-server 14",
"description": "description"
},
{
"id": 15,
"title": "json-server 15",
"description": "description"
},
{
"id": 16,
"title": "json-server 16",
"description": "description"
},
{
"id": 17,
"title": "json-server 17",
"description": "description"
},
{
"id": 18,
"title": "json-server 18",
"description": "description"
},
{
"id": 19,
"title": "json-server 19",
"description": "description"
},
{
"title": "json-server 20",
"description": "Test 1",
"createdAt": 1650692405517,
"id": 20
}
]
}
C:\xampp\htdocs\api\main.js
const jsonServer = require('json-server')
const server = jsonServer.create()
const router = jsonServer.router('db.json')
const middlewares = jsonServer.defaults()
// Set default middlewares (logger, static, cors and no-cache)
server.use(middlewares)
// Add custom routes before JSON Server router
server.get('/echo', (req, res) => {
res.jsonp(req.query)
})
// To handle POST, PUT and PATCH you need to use a body-parser
// You can use the one used by JSON Server
server.use(jsonServer.bodyParser)
server.use((req, res, next) => {
if (req.method === 'POST') {
req.body.createdAt = Date.now()
}
// Continue to JSON Server router
next()
})
// Use default router
server.use('/tutorials',router)
server.listen(8080, () => {
console.log('JSON Server is running')
})
C:\xampp\htdocs\api\package.json
{
"name": "api",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "node main.js"
},
"author": "",
"license": "ISC",
"dependencies": {
"json-server": "^0.17.0"
},
"devDependencies": {
"nodemon": "^2.0.15"
}
}
Bước 2: Áp dụng
C:\xampp\htdocs\vue-pagination-axios\src\router.js
import Vue from "vue";
import Router from "vue-router";
Vue.use(Router);
export default new Router({
mode: "history",
routes: [
{
path: "/",
alias: "/tutorials",
name: "tutorials",
component: () => import("./components/TutorialsList")
},
{
path: "/tutorials/:id",
name: "tutorial-details",
component: () => import("./components/Tutorial")
},
{
path: "/add",
name: "add",
component: () => import("./components/AddTutorial")
}
]
});
C:\xampp\htdocs\vue-pagination-axios\src\main.js
import Vue from 'vue'
import App from './App.vue'
import { BootstrapVue } from 'bootstrap-vue'
import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap-vue/dist/bootstrap-vue.css'
import router from './router'
Vue.config.productionTip = false
Vue.use(BootstrapVue)
new Vue({
router,
render: h => h(App),
}).$mount('#app')
C:\xampp\htdocs\vue-pagination-axios\src\http-common.js
import axios from "axios";
export default axios.create({
baseURL: "http://localhost:8080",
headers: {
"Content-type": "application/json"
}
});
C:\xampp\htdocs\vue-pagination-axios\src\App.vue
<template>
<div id="app">
<nav class="navbar navbar-expand navbar-dark bg-dark">
<a href="#" class="navbar-brand">bezKoder</a>
<div class="navbar-nav mr-auto">
<li class="nav-item">
<a href="/tutorials" class="nav-link">Tutorials</a>
</li>
<li class="nav-item">
<a href="/add" class="nav-link">Add</a>
</li>
</div>
</nav>
<div class="container mt-3">
<router-view />
</div>
</div>
</template>
<script>
export default {
name: "app"
};
</script>
C:\xampp\htdocs\vue-pagination-axios\src\services\TutorialDataService.js
import http from "../http-common";
class TutorialDataService {
getAll(params) {
return http.get("/tutorials/api", { params });
}
get(id) {
return http.get(`/tutorials/${id}`);
}
create(data) {
return http.post("/tutorials", data);
}
update(id, data) {
return http.put(`/tutorials/${id}`, data);
}
delete(id) {
return http.delete(`/tutorials/${id}`);
}
deleteAll() {
return http.delete(`/tutorials`);
}
}
export default new TutorialDataService();
C:\xampp\htdocs\vue-pagination-axios\src\components\TutorialsList.vue
<template>
<div class="list row">
<div class="col-md-8">
<div class="input-group mb-3">
<input
type="text"
class="form-control"
placeholder="Search by title"
v-model="searchTitle"
/>
<div class="input-group-append">
<button
class="btn btn-outline-secondary"
type="button"
@click="page = 1; retrieveTutorials();"
>
Search
</button>
</div>
</div>
</div>
<div class="col-md-12">
<div class="mb-3">
Items per Page:
<select v-model="pageSize" @change="handlePageSizeChange($event)">
<option v-for="size in pageSizes" :key="size" :value="size">
{{ size }}
</option>
</select>
</div>
<b-pagination
v-model="page"
:total-rows="count"
:per-page="pageSize"
prev-text="Prev"
next-text="Next"
@change="handlePageChange"
></b-pagination>
</div>
<div class="col-md-6">
<h4>Tutorials List</h4>
<ul class="list-group" id="tutorials-list">
<li
class="list-group-item"
:class="{ active: index == currentIndex }"
v-for="(tutorial, index) in tutorials"
:key="index"
@click="setActiveTutorial(tutorial, index)"
>
{{ tutorial.title }}
</li>
</ul>
<button class="m-3 btn btn-sm btn-danger" @click="removeAllTutorials">
Remove All
</button>
</div>
<div class="col-md-6">
<div v-if="currentTutorial">
<h4>Tutorial</h4>
<div>
<label><strong>Title:</strong></label> {{ currentTutorial.title }}
</div>
<div>
<label><strong>Description:</strong></label>
{{ currentTutorial.description }}
</div>
<div>
<label><strong>Status:</strong></label>
{{ currentTutorial.published ? "Published" : "Pending" }}
</div>
<a
class="badge badge-warning"
:href="'/tutorials/' + currentTutorial.id"
>
Edit
</a>
</div>
<div v-else>
<br />
<p>Please click on a Tutorial...</p>
</div>
</div>
</div>
</template>
<script>
import TutorialDataService from "../services/TutorialDataService";
export default {
name: "tutorials-list",
data() {
return {
tutorials: [],
currentTutorial: null,
currentIndex: -1,
searchTitle: "",
page: 1,
count: 0,
pageSize: 3,
pageSizes: [3, 6, 9],
};
},
methods: {
getRequestParams(searchTitle, page, pageSize) {
let params = {};
if (searchTitle) {
params["title"] = searchTitle;
}
if (page) {
params["_page"] = page;
}
if (pageSize) {
params["_limit"] = pageSize;
}
return params;
},
retrieveTutorials() {
const params = this.getRequestParams(
this.searchTitle,
this.page,
this.pageSize
);
TutorialDataService.getAll(params)
.then((response) => {
// const { totalItems } = response.data;
var tutorials = response.data;
this.tutorials = tutorials;
this.count = 20;
console.log(response.data);
})
.catch((e) => {
console.log(e);
});
},
handlePageChange(value) {
this.page = value;
this.retrieveTutorials();
},
handlePageSizeChange(event) {
this.pageSize = event.target.value;
this.page = 1;
this.retrieveTutorials();
},
refreshList() {
this.retrieveTutorials();
this.currentTutorial = null;
this.currentIndex = -1;
},
setActiveTutorial(tutorial, index) {
this.currentTutorial = tutorial;
this.currentIndex = index;
},
removeAllTutorials() {
TutorialDataService.deleteAll()
.then((response) => {
console.log(response.data);
this.refreshList();
})
.catch((e) => {
console.log(e);
});
},
},
mounted() {
this.retrieveTutorials();
},
};
</script>
<style>
.list {
text-align: left;
max-width: 750px;
margin: auto;
}
</style>
C:\xampp\htdocs\vue-pagination-axios\src\components\Tutorial.vue
<template>
<div v-if="currentTutorial" class="edit-form">
<h4>Tutorial</h4>
<form>
<div class="form-group">
<label for="title">Title</label>
<input type="text" class="form-control" id="title"
v-model="currentTutorial.title"
/>
</div>
<div class="form-group">
<label for="description">Description</label>
<input type="text" class="form-control" id="description"
v-model="currentTutorial.description"
/>
</div>
<div class="form-group">
<label><strong>Status:</strong></label>
{{ currentTutorial.published ? "Published" : "Pending" }}
</div>
</form>
<button class="badge badge-primary mr-2"
v-if="currentTutorial.published"
@click="updatePublished(false)"
>
UnPublish
</button>
<button v-else class="badge badge-primary mr-2"
@click="updatePublished(true)"
>
Publish
</button>
<button class="badge badge-danger mr-2"
@click="deleteTutorial"
>
Delete
</button>
<button type="submit" class="badge badge-success"
@click="updateTutorial"
>
Update
</button>
<p>{{ message }}</p>
</div>
<div v-else>
<br />
<p>Please click on a Tutorial...</p>
</div>
</template>
<script>
import TutorialDataService from "../services/TutorialDataService";
export default {
name: "tutorial",
data() {
return {
currentTutorial: null,
message: ''
};
},
methods: {
getTutorial(id) {
TutorialDataService.get(id)
.then(response => {
this.currentTutorial = response.data;
console.log(response.data);
})
.catch(e => {
console.log(e);
});
},
updatePublished(status) {
var data = {
id: this.currentTutorial.id,
title: this.currentTutorial.title,
description: this.currentTutorial.description,
published: status
};
TutorialDataService.update(this.currentTutorial.id, data)
.then(response => {
this.currentTutorial.published = status;
console.log(response.data);
})
.catch(e => {
console.log(e);
});
},
updateTutorial() {
TutorialDataService.update(this.currentTutorial.id, this.currentTutorial)
.then(response => {
console.log(response.data);
this.message = 'The tutorial was updated successfully!';
})
.catch(e => {
console.log(e);
});
},
deleteTutorial() {
TutorialDataService.delete(this.currentTutorial.id)
.then(response => {
console.log(response.data);
this.$router.push({ name: "tutorials" });
})
.catch(e => {
console.log(e);
});
}
},
mounted() {
this.message = '';
this.getTutorial(this.$route.params.id);
}
};
</script>
<style>
.edit-form {
max-width: 300px;
margin: auto;
}
</style>
C:\xampp\htdocs\vue-pagination-axios\src\components\AddTutorial.vue
<template>
<div class="submit-form">
<div v-if="!submitted">
<div class="form-group">
<label for="title">Title</label>
<input
type="text"
class="form-control"
id="title"
required
v-model="tutorial.title"
name="title"
/>
</div>
<div class="form-group">
<label for="description">Description</label>
<input
class="form-control"
id="description"
required
v-model="tutorial.description"
name="description"
/>
</div>
<button @click="saveTutorial" class="btn btn-success">Submit</button>
</div>
<div v-else>
<h4>You submitted successfully!</h4>
<button class="btn btn-success" @click="newTutorial">Add</button>
</div>
</div>
</template>
<script>
import TutorialDataService from "../services/TutorialDataService";
export default {
name: "add-tutorial",
data() {
return {
tutorial: {
id: null,
title: "",
description: "",
published: false
},
submitted: false
};
},
methods: {
saveTutorial() {
var data = {
title: this.tutorial.title,
description: this.tutorial.description
};
TutorialDataService.create(data)
.then(response => {
this.tutorial.id = response.data.id;
console.log(response.data);
this.submitted = true;
})
.catch(e => {
console.log(e);
});
},
newTutorial() {
this.submitted = false;
this.tutorial = {};
}
}
};
</script>
<style>
.submit-form {
max-width: 300px;
margin: auto;
}
</style>
PreviousChỉnh sửa url mặc định của json-server ví dụ thêm /api vào đường dẫn (ok)Next[LARAVEL] Phân trang pagination full (ok)
Last updated