前言
Vue.js 是用于构建交互式的 Web 界面的库。它提供了 MVVM 数据绑定和一个可组合的组件系统,具有简单、灵活的 API。
axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,我们将使用它来请求api。
WordPress REST API为WordPress数据类型提供API端点,允许开发人员通过发送和接收JSON(JavaScript Object Notation)对象与站点进行远程交互 。
demo需要实现功能
- 获取全部的文章列表
- 点击查看详情进入文章详情页展示文章内容
- 实现文章列表的分页功能
- 获取所有的文章分类
- 点击分类获取不同分类下的文章列表
环境搭建
vue-cli单页应用的脚手架构建:
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
测试 API 的工具
https://www.getpostman.com/
Wordpress REST API手册
https://developer.wordpress.org/rest-api/
新建两个.vue文件分别显示文章列表和文章详情
文章列表:articleList.vue
文章详情:article.vue
并在src/router.js中设置页面路由如下:
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结构:
<template> <el-row> <el-col> <el-col class="article"> <ul> <li> <h1>文章标题</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结构:
<template> <el-row> <el-col class="article"> <h1>标题</h1> <p class="p"><span>作者:</span><span>发布时间:</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';
定义请求事件,并在页面加载时执行事件,最后定义一个数组来存放请求回来的数据
data () { return { articleData: [{ title: { rendered: '' }, excerpt: { rendered: '' } }], } }, mounted: function () { this.getarticlelist() this.getcategories() }, methods: { getarticlelist(){ getArticleList().then(res => { this.articleData = res.data }) }, }
使用v-for将数据渲染到页面
<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>
到这里一个简单的显示文章列表功能就完成了
文章详情页
为文章列表中的查看详情绑定事件:
当点击时获取当前点击文章id,根据不同id跳转到响应的详情页
<span @click="article(index)">查看详情</span> article(index){ let ids = this.articleData[index].id this.$router.push({ path: '../article/' + ids }) },
现在已经实现了点击跳转到article详情页,接下来要做的是在详情页中显示当前id下文章的内容,我们需要在当前详情页载入的时候执行事件获取文章内容
在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去请求api getArticle(ids).then(res => { this.articleData = res }) },
绑定事件并渲染出文章结构
<el-col class="article"> <h1 v-html="articleData.title.rendered"></h1> <p class="p"><span>作者:{{articleData.author}}</span><span>发布时间:{{articleData.date}}</span></p> <div v-html="articleData.content.rendered"></div> </el-col>
文章列表分页的实现
element-ui分页组件:
<el-pagination layout="prev, pager, next" :page-size="per_page" :total="total" @current-change="handleCurrentChange"> </el-pagination>
上面的组件中定义了handleCurrentChange事件,用于在点击不同的页数时去为请求的api带上不同的参数
请求所需参数
page:指定要返回的结果页面。
例如,/wp/v2/posts"htmlcode">
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]) })
在分页事件中调用
handleCurrentChange(val) { this.loading = true this.page = val this.getarticlelist() },
获取所有的文章分类
获取所有分类比较简单,获取数据使用v-for渲染就可以了
api.js
//获取文章分类 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 }) } }
点击分类获取不同分类下的文章列表
添加点击事件
为每一个分类添加点击事件,并为选中的分类添加样式
<ul> <li v-for="(item,index) in categoriesData" @click="categorie(index)" :class="{ 'active': active == index }">{{item.name}} </li> </ul>
改造文章列表请求api
为文章列表请求api添加categories字段,这个字段为所需分类的id
let params = { page: this.page, per_page: this.per_page, categories: this.categories }
编写事件
点击事件时需要做以下几件事情:
- 获取当前点击分类id
- 为当前分类添加选中样式
- 让请求中的page字段为1
- 获取请求结果重新渲染文章列表
categorie(index){ this.categories = this.categoriesData[index].id this.page = 1 this.active = index this.getarticlelist() }
服务器部署
根目录下执行npm run dev生成dist静态文件夹,将dist文件夹中内容部署到http服务器上即可通过域名访问
demo地址
https://github.com/qianxiaoduan/Vue-WordPress-Rest-API
http://vue-blog.qianxiaoduan.com/
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]