Vue.js 框架源码与进阶 - NuxtJS案例 - Realworld项目 - 首页

本文详细介绍了如何在NuxtJS框架下实现Realworld项目的首页,包括公共文章列表、分页处理、文章标签、异步任务优化、导航栏状态处理、标签高亮、用户关注文章列表、用户Token统一设置、文章发布时间格式化以及文章点赞功能,同时展示了如何避免点赞过程中的错误处理。
摘要由CSDN通过智能技术生成

11.4 首页

公共文章列表

在这里插入图片描述

请求方法:GET

请求地址:/api/articles

查询参数:

  • 按标签筛选
    • ?tag=AngularJS
  • 按作者筛选
    • ?author=jake
  • 按用户筛选
    • ?favorited=jake
  • 文章分页数(默认20)
    • ?limit=20
  • 文章偏移/跳跃数(默认0)
    • ?offset=0

api/article.js

import request from '@/utils/request'

// 获取公共文章列表
export const getArticles = params => {
   
  return request({
   
    method: 'GET',
    url: '/api/articles',
    params
  })
}

pages/home/index.vue

import {
    getArticles } from '@/api/article'

export default {
   
  name: 'HomeIndex',
  async asyncData () {
   
    const {
    data } = await getArticles()
    console.log(data)
  }
}

在 这里插入图片描述
在这里插入图片描述

export default {
   
  name: 'HomeIndex',
  async asyncData () {
   
    const {
    data } = await getArticles()
    return {
   
      articles: data.articles,
      articlesCount: data.articlesCount
    }
  }
}

在这里插入图片描述

遍历数据:

<div
  class="article-preview"
  v-for="article in articles"
  :key="article.slug"
>
  <div class="article-meta">
    <!-- <a href="profile.html"><img src="http://i.imgur.com/Qr71crq.jpg" /></a> -->
    <nuxt-link :to="{
   
      name: 'profile',
      params: {
   
        username: article.author.username
      }
    }">
      <img :src="article.author.image" />
    </nuxt-link>
    <div class="info">
      <!-- <a href="" class="author">Eric Simons</a> -->
      <nuxt-link class="author" :to="{
   
        name: 'profile',
        params: {
   
          username: article.author.username
        }
      }">
        {
   {
    article.author.username }}
      </nuxt-link>
      <span class="date">{
   {
    article.createdAt }}</span>
    </div>
    <button class="btn btn-outline-primary btn-sm pull-xs-right"
      :class="{
   
          active: article.favorited
        }">
      <i class="ion-heart"></i> {
   {
    article.favoritesCount }}
    </button>
  </div>
  <!-- <a href="" class="preview-link"> -->
  <nuxt-link 
    class="preview-link" 
    :to="{
   
      name: 'article',
      params: {
   
        slug: article.slug
      }
    }">
    <h1>{
   {
    article.title }}</h1>
    <p>{
   {
    article.description }}</p>
    <span>Read more...</span>
  <!-- </a> -->
  </nuxt-link>  
</div>

列表分页-分页参数的使用

pages/home/index.vue

export default {
   
  name: 'HomeIndex',
  async asyncData () {
   
    const page = 1
    const limit = 10
    const {
    data } = await getArticles({
   
      // 文章分页数(默认20)
      limit,
      // 文章偏移/跳跃数(默认0)
      offset: (page - 1) * limit
    })
    return {
   
      articles: data.articles,
      articlesCount: data.articlesCount
    }
  }
}

列表分页-页码处理

添加页码,页码改变获取对应页码的数据:pages/home/index.vue

<!-- 分页列表 -->
<nav>
  <ul class="pagination">

    <li class="page-item active">

      <a class="page-link ng-binding" href="">1</a>

    </li>
  </ul>
</nav>

在这里插入图片描述

export default {
   
  name: 'HomeIndex',
  async asyncData ({
    query }) {
   
    const page = Number.parseInt(query.page || 1)
    const limit = 10
    const {
    data } = await getArticles({
   
      // 文章分页数(默认20)
      limit,
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值