1、创建组件并配置路由
创建 views/article/index.vue 组件
然后将该页面配置到根级路由
找到首页文章列表项组件配置路由跳转
2、页面布局
3、实现功能
获取文章数据:
在 api/article.js 中新增封装接口方法
export const getArticleById = articleId => {
return request({
method: 'GET',
url: `/v1_0/articles/${articleId}`
})
}/
export const getArticleById = articleId => {
return request({
method: 'GET',
url: `/v1_0/articles/${articleId}`
})
}
在组件article/index.vue中调用获取文章详情
// 1.导入请求方法
import { getArticleById } from '@/api/article'
export default {
name: 'ArticlePage',
components: {},
props: {
articleId: {
type: String,
required: true
}
},
data () {
return {
article: {} // 2.定义变量存储文章详情
}
},
computed: {},
watch: {},
created () {
// 4. 调用方法
this.loadArticle()
},
mounted () {},
methods: {
// 3. 定义获取数据请求方法
async loadArticle () {
try {
// 3.1 发送请求
const { data } = await getArticleById(this.articleId)
// 3.3 成功赋值
this.article = data.data
console.log(this.article) // 控制台查看数据输出
} catch (err) {
// 3.2 失败处理
console.log(err)
}
}
}
}
展示文章详情
处理内容加载状态
//
加载中,显示 loading
加载成功,显示文章详情
加载失败,显示错误提示
如果 404,提示资源不存在
其它的,提示加载失败,用户可以点击重试重新加载 //
// data定义变量
loading: true, // 加载中的 loading 状态
errStatus: 0 // 失败的状态码
处理正文样式:文章正文包括各种数据:段落、标题、列表、链接、图片、视频等资源。这里我们是直接将将 github-markdown-css样式文件下载到项目中直接导入使用的。
图片点击预览:vant里面有个ImagePreview 图片预览。
1、从文章内容中获取到所有的 img DOM 节点
2、获取文章内容中所有的图片地址
3、遍历所有 img 节点,给每个节点注册点击事件
4、在 img 点击事件处理函数中,调用 ImagePreview 预览
async loadArticle () {
// 数据驱动视图这件事儿不是立即的
this.article = data.data
// 初始化图片点击预览
console.log(this.$refs['article-content']) // 这里没有内容
// 这个时候其实找不到 这个refs引用的,原因是因为v-if的渲染其实需要时间,我们视图还没有立即更新完成。
// 使用定时器,延迟更新( setTimeout 0 会把要做的事情放在异步队列的最后面执行! )
setTimeout(() => {
console.log(this.$refs['article-content']) // 这里有内容
this.previewImage()
}, 0)
// 不使用定时器可以使用nextTick这个api方法
/*
this.loading = false
this.$nextTick(()=>{
this.previewImage()
})
*/
},
// 预览图片处理事件函数
previewImage () {
// 得到所有的 img 节点
const articleContent = this.$refs['article-content'] // 获取到了容器节点
const imgs = articleContent.querySelectorAll('img')
// 获取所有 img 地址
const images = []
imgs.forEach((img, index) => {
images.push(img.src)
// 给每个 img 注册点击事件,在处理函数中调用预览
img.onclick = () => {
ImagePreview({
// 预览的图片地址数组
images,
// 起始位置,从 0 开始
startPosition: index
})
}
})
}
————————————————