基于Vue.js與WordPress Rest API構(gòu)建單頁(yè)應(yīng)用詳解
前言
Vue.js 是用于構(gòu)建交互式的 Web 界面的庫(kù)。它提供了 MVVM 數(shù)據(jù)綁定和一個(gè)可組合的組件系統(tǒng),具有簡(jiǎn)單、靈活的 API。
axios 是一個(gè)基于Promise 用于瀏覽器和 nodejs 的 HTTP 客戶端,我們將使用它來(lái)請(qǐng)求api。
WordPress REST API為WordPress數(shù)據(jù)類(lèi)型提供API端點(diǎn),允許開(kāi)發(fā)人員通過(guò)發(fā)送和接收J(rèn)SON(JavaScript Object Notation)對(duì)象與站點(diǎn)進(jìn)行遠(yuǎn)程交互 。
demo需要實(shí)現(xiàn)功能
- 獲取全部的文章列表
- 點(diǎn)擊查看詳情進(jìn)入文章詳情頁(yè)展示文章內(nèi)容
- 實(shí)現(xiàn)文章列表的分頁(yè)功能
- 獲取所有的文章分類(lèi)
- 點(diǎn)擊分類(lèi)獲取不同分類(lèi)下的文章列表
環(huán)境搭建
vue-cli單頁(yè)應(yīng)用的腳手架構(gòu)建:
https://cn.vuejs.org/v2/guide/installation.html
Axios引入
https://www.kancloud.cn/yunye/axios/234845
element-ui引入
http://element-cn.eleme.io/2.0/#/zh-CN/component/installation
測(cè)試 API 的工具
https://www.getpostman.com/
Wordpress REST API手冊(cè)
https://developer.wordpress.org/rest-api/
新建兩個(gè).vue文件分別顯示文章列表和文章詳情
文章列表:articleList.vue
文章詳情:article.vue
并在src/router.js中設(shè)置頁(yè)面路由如下:
import Vue from 'vue'
import Router from 'vue-router'
import ArticleList from '@/components/articleList'
import Article from '@/components/article'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
name: 'ArticleList',
component: ArticleList
},
{
path: '/article/:id',
name: 'Article',
component: Article
},
]
})
articleList.vue結(jié)構(gòu):
<template>
<el-row>
<el-col>
<el-col class="article">
<ul>
<li>
<h1>文章標(biāo)題</h1>
<div>文章描述</div>
<span>查看詳情</span>
</li>
</ul>
</el-col>
</el-col>
</el-row>
</template>
<script>
export default {
data () {
return {
}
},
}
</script>
<style lang="less">
</style>
article.vue結(jié)構(gòu):
<template>
<el-row>
<el-col class="article">
<h1>標(biāo)題</h1>
<p class="p"><span>作者:</span><span>發(fā)布時(shí)間:</span></p>
<div></div>
</el-col>
</el-row>
</template>
<script>
export default {
data () {
return {
}
},
}
</script>
<style lang="less">
</style>
文章列表api獲取:
在src目錄下新建api/api.js文件,注意替換域名
import axios from 'axios';
let base = 'http://example.com/wp-json/wp/v2';
//獲取文章列表
export const getArticleList = params => {
return axios.get(`${base}/posts`, params).then();
};
在articleList.vue中引入api.js:
import {getArticleList,getCategories} from '../api/api';
定義請(qǐng)求事件,并在頁(yè)面加載時(shí)執(zhí)行事件,最后定義一個(gè)數(shù)組來(lái)存放請(qǐng)求回來(lái)的數(shù)據(jù)
data () {
return {
articleData: [{
title: {
rendered: ''
},
excerpt: {
rendered: ''
}
}],
}
},
mounted: function () {
this.getarticlelist()
this.getcategories()
},
methods: {
getarticlelist(){
getArticleList().then(res => {
this.articleData = res.data
})
},
}
使用v-for將數(shù)據(jù)渲染到頁(yè)面
<ul>
<li v-for="(item,index) in articleData">
<h1 v-html="item.title.rendered"></h1>
<div v-html="item.excerpt.rendered"></div>
<span>查看詳情</span>
</li>
</ul>
到這里一個(gè)簡(jiǎn)單的顯示文章列表功能就完成了
文章詳情頁(yè)
為文章列表中的查看詳情綁定事件:
當(dāng)點(diǎn)擊時(shí)獲取當(dāng)前點(diǎn)擊文章id,根據(jù)不同id跳轉(zhuǎn)到響應(yīng)的詳情頁(yè)
<span @click="article(index)">查看詳情</span>
article(index){
let ids = this.articleData[index].id
this.$router.push({
path: '../article/' + ids
})
},
現(xiàn)在已經(jīng)實(shí)現(xiàn)了點(diǎn)擊跳轉(zhuǎn)到article詳情頁(yè),接下來(lái)要做的是在詳情頁(yè)中顯示當(dāng)前id下文章的內(nèi)容,我們需要在當(dāng)前詳情頁(yè)載入的時(shí)候執(zhí)行事件獲取文章內(nèi)容
在api.js中定義獲取文章詳情的api
//獲取單篇文章
export const getArticle = ids => {
return axios.get(`${base}/posts/${ids}`).then(res => res.data);
};
article.vue中引入并定義事件:
import {getArticle} from '../api/api';
getarticle(){
//獲取id
let ids = this.$route.params.id
//使用獲取到的id去請(qǐng)求api
getArticle(ids).then(res => {
this.articleData = res
})
},
綁定事件并渲染出文章結(jié)構(gòu)
<el-col class="article">
<h1 v-html="articleData.title.rendered"></h1>
<p class="p"><span>作者:{{articleData.author}}</span><span>發(fā)布時(shí)間:{{articleData.date}}</span></p>
<div v-html="articleData.content.rendered"></div>
</el-col>
文章列表分頁(yè)的實(shí)現(xiàn)
element-ui分頁(yè)組件:
<el-pagination layout="prev, pager, next" :page-size="per_page" :total="total" @current-change="handleCurrentChange"> </el-pagination>
上面的組件中定義了handleCurrentChange事件,用于在點(diǎn)擊不同的頁(yè)數(shù)時(shí)去為請(qǐng)求的api帶上不同的參數(shù)
請(qǐng)求所需參數(shù)
page:指定要返回的結(jié)果頁(yè)面。
例如,/wp/v2/posts?page=2是帖子結(jié)果的第二頁(yè)
per_page:指定要在一個(gè)請(qǐng)求中返回的記錄數(shù),指定為從1到100的整數(shù)。
例如,/wp/v2/posts?per_page=1只會(huì)返回集合中的第一個(gè)帖子,為了確定有多少頁(yè)的數(shù)據(jù)可用,API返回兩個(gè)標(biāo)題字段,每個(gè)分頁(yè)響應(yīng)
api返回頭部帶的參數(shù):
X-WP-Total:集合中的記錄總數(shù)
X-WP-TotalPages:包含所有可用記錄的總頁(yè)數(shù)
前面定義了請(qǐng)求文章列表api的方法,只需要將它修改下調(diào)用即可,需要給api傳遞兩個(gè)參數(shù)page和per_page,page的值需要從分頁(yè)組件中拿到,per_page看需要設(shè)定就可以
api請(qǐng)求成功后可以在頭部找到X-WP-Total字段,就是我們需要的文章列表總數(shù),因?yàn)樽侄蝀-WP-Total的格式不能直接取到值,需要先將它轉(zhuǎn)為數(shù)組然后取value
修改后api請(qǐng)求的方法:
let params = {
page: this.page,
per_page: this.per_page,
}
getArticleList({params}).then(res => {
let headerData = Object.values(res.headers)
this.articleData = res.data
this.total = parseInt(headerData[2])
})
在分頁(yè)事件中調(diào)用
handleCurrentChange(val) {
this.loading = true
this.page = val
this.getarticlelist()
},
獲取所有的文章分類(lèi)
獲取所有分類(lèi)比較簡(jiǎn)單,獲取數(shù)據(jù)使用v-for渲染就可以了
api.js
//獲取文章分類(lèi)
export const getCategories= params => {
return axios.get(`${base}/categories`, params).then(res => res.data);
};
html
<ul>
<li v-for="item in categoriesData">{{item.name}}
</li>
</ul>
js
mounted: function () {
getcategories(){
getCategories().then(res => {
this.categoriesData = res
})
}
}
點(diǎn)擊分類(lèi)獲取不同分類(lèi)下的文章列表
添加點(diǎn)擊事件
為每一個(gè)分類(lèi)添加點(diǎn)擊事件,并為選中的分類(lèi)添加樣式
<ul>
<li v-for="(item,index) in categoriesData" @click="categorie(index)"
:class="{ 'active': active == index }">{{item.name}}
</li>
</ul>
改造文章列表請(qǐng)求api
為文章列表請(qǐng)求api添加categories字段,這個(gè)字段為所需分類(lèi)的id
let params = {
page: this.page,
per_page: this.per_page,
categories: this.categories
}
編寫(xiě)事件
點(diǎn)擊事件時(shí)需要做以下幾件事情:
- 獲取當(dāng)前點(diǎn)擊分類(lèi)id
- 為當(dāng)前分類(lèi)添加選中樣式
- 讓請(qǐng)求中的page字段為1
- 獲取請(qǐng)求結(jié)果重新渲染文章列表
categorie(index){
this.categories = this.categoriesData[index].id
this.page = 1
this.active = index
this.getarticlelist()
}
服務(wù)器部署
根目錄下執(zhí)行npm run dev生成dist靜態(tài)文件夾,將dist文件夾中內(nèi)容部署到http服務(wù)器上即可通過(guò)域名訪問(wèn)
demo地址
https://github.com/qianxiaoduan/Vue-WordPress-Rest-API
http://vue-blog.qianxiaoduan.com/
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue環(huán)境如何實(shí)現(xiàn)div?focus?blur焦點(diǎn)事件
這篇文章主要介紹了vue環(huán)境如何實(shí)現(xiàn)div?focus?blur焦點(diǎn)事件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
mpvue微信小程序開(kāi)發(fā)之實(shí)現(xiàn)一個(gè)彈幕評(píng)論
這篇文章主要介紹了mpvue小程序開(kāi)發(fā)之 實(shí)現(xiàn)一個(gè)彈幕評(píng)論功能,本文通過(guò)實(shí)例講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11
vue?跳轉(zhuǎn)頁(yè)面$router.resolve和$router.push案例詳解
這篇文章主要介紹了vue?跳轉(zhuǎn)頁(yè)面$router.resolve和$router.push案例詳解,這樣實(shí)現(xiàn)了既跳轉(zhuǎn)了新頁(yè)面,又不會(huì)讓后端檢測(cè)到頁(yè)面鏈接不安全之類(lèi)的,需要的朋友可以參考下2023-10-10
Vue如何使用ElementUI對(duì)表單元素進(jìn)行自定義校驗(yàn)及踩坑
有一些驗(yàn)證不是通過(guò)input select這樣的受控組件來(lái)觸發(fā)驗(yàn)證條件的 ,可以通過(guò)自定義驗(yàn)證的方法來(lái)觸發(fā),下面這篇文章主要給大家介紹了關(guān)于Vue如何使用ElementUI對(duì)表單元素進(jìn)行自定義校驗(yàn)及踩坑的相關(guān)資料,需要的朋友可以參考下2023-02-02
vue2和vue3的v-if與v-for優(yōu)先級(jí)對(duì)比學(xué)習(xí)
這篇文章主要介紹了vue2和vue3的v-if與v-for優(yōu)先級(jí)對(duì)比學(xué)習(xí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
頁(yè)面tooltip組件限制工具函數(shù)使用示例詳解
這篇文章主要為大家介紹了頁(yè)面tooltip組件的限制工具函數(shù)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09

