新闻客户端案例的实现,使用axios获取数据并渲染页面,路由传参(查询参数,动态路由),使用keep-alive实现组件缓存

文章目录

        • 0.页面要求
        • 1.功能要求
        • 2.开始路由配置
          • 2.1.嵌套二级路由如何配置?
          • 2.2.路由重定向,NotFound页面,去除"#"号
        • 3.实现底部导航栏的高亮效果
        • 4.渲染首页:使用axios请求数据
        • 5.路由传参
          • 5.1.回顾:查询参数传参或者动态路由传参
          • 5.2.具体代码
        • 6.渲染详情页
        • 7.解决请求过程中出现空白页的bug
          • 出现原因
          • 解决方法
        • 7.组件缓存
          • 问题描述
          • 原因分析
          • 解决方法
        • 拓展:keep-alive介绍
          • 1.keep-alive 是什么?
          • 2.keep-alive的优点是什么?
          • 3.keep-alive的三个属性
          • 4.keep-alive的两个生命周期

0.页面要求

一共两个页面:首页和详情页(一级路由),
其中,首页由新闻列表组成,点其中一个可以进入详情页,详情页有返回首页的按钮
底部导航能切换:列表,收藏,喜欢,我的(嵌套二级路由)

1.功能要求
  • 配置路由
  • 渲染首页
  • 路由传参:首页带参数跳转详情页
  • 渲染详情页
  • 优化性能:组件缓存
2.开始路由配置

views目录下创建:

  • 一级路由:首页Home.vue,详情页Detail.vue
  • 嵌套在首页中的二级路由:列表List.vue,收藏Collect.vue,喜欢Like.vue,我的User.vue
2.1.嵌套二级路由如何配置?
  • step1:在首页的配置项中添加children属性
routes:[{path:"/home",component:Home,children:[{path:"/list",component:List},...{path:"/user",component:User}]}
]
  • step2:准备二级路由出口
    一级路由出口写在App.vue中,同理嵌套在首页的二级路由的出口可以写在首页Home.vue中
//Home.vue
<router-view><router-view>
2.2.路由重定向,NotFound页面,去除"#"号
routes:[...(接上面代码)...{path:"/",redirect:"/list"},//路由重定向{path:"*",component:NotFound};//再新建一个NotFound.vue
],
mode:"history",//去除井号
3.实现底部导航栏的高亮效果
  • step1:用router-link标签替换a标签(一开始直接不用a标签)
  <div class="h5-wrapper"><!-- 内容区域 --><div class="content"><router-view></router-view></div><!-- 底部导航栏 --><nav class="tabbar"><router-link to="/list">列表</router-link><router-link to="/collect">收藏</router-link><router-link to="/like">喜欢</router-link><router-link to="/user">我的</router-link></nav></div>
  • step2:利用高亮类名实现高亮效果
/* 基础布局 */
.h5-wrapper {height: 100vh;display: flex;flex-direction: column;
}.content {flex: 1;overflow-y: auto;
}/* 底部导航栏样式 */
.tabbar {position: fixed;bottom: 0;left: 0;right: 0;height: 50px;background: #fff;display: flex;border-top: 1px solid #eee;box-shadow: 0 -2px 10px rgba(0,0,0,0.05);
}.tabbar a {flex: 1;display: flex;justify-content: center;align-items: center;color: #666;text-decoration: none;font-size: 14px;transition: all 0.3s;
}/* 激活状态样式 */
.tabbar a.router-link-active {color: orange;font-weight: bold;
}/* 点击反馈效果 */
.tabbar a:active {background: rgba(0,0,0,0.05);
}

效果:
在这里插入图片描述

4.渲染首页:使用axios请求数据

*由于路由重定向,此处首页的渲染请求,实际上就是对嵌套二级路由List.vue的渲染

  • 安装axiosnpm install axios -g
  • 查看接口文档,确认请求方式、请求地址、请求参数
  • 在created钩子发送请求,获取数据后在data中存起来
//List.vue
import axios from "axios"export default from {
async created(){const res=await axios.get("https://mock.boxuegu.com/mock/3083/articles")//console.log(res);this.newsList=res.data.result.rows//根据res的结构逐渐获取想要的数据
}
data(){return{newsList:[]}}
}
  • 用获取到的数据渲染首页
    <div v-for="item in newsList" :key="item.id"@click="$router.push(`/detail/${item.id}`)">//传参,后面讲<img :src="item.img" alt=""><h3 class="title">{{item.title}}</h3><div class="body">{{item.source}}</div><div class="meta-info">文章点击量:{{item.cmtcount}}&nbsp;&nbsp;|&nbsp;&nbsp;编辑于{{item.time}}</div></div>
5.路由传参
5.1.回顾:查询参数传参或者动态路由传参
    查询参数:父组件传参:@click="this.$router.push('/detail? 名1=值1&名2=值2')"子组件接收:this.$route.query.1动态路由:需先改造路由:{path:"/detail/:参数名",...}父组件传参:@click='this.$router.push("/detail/参数值")'子组件接收::this.$route.params.参数名    
5.2.具体代码
//父组件(首页):List.vue
<template><div class="wrapper div-list-page"><div v-for="item in newsList" :key="item.id"@click="$router.push(`/detail/${item.id}`)"><img :src="item.img" alt=""><h3 class="title">{{item.title}}</h3><div class="body">{{item.source}}</div><div class="meta-info">文章点击量:{{item.cmtcount}}&nbsp;&nbsp;|&nbsp;&nbsp;编辑于{{item.time}}</div></div></div>
</template><script>
export default {data() {return {newLists:null};},async created() {const res = await this.$axios.get(`http://hmajax.itheima.net/api/news`)this.newsList = res.data.data//console.log("新闻列表:",this.newsList);},
};
</script>
<style scoped>
/* 外层容器 */
.wrapper {max-width: 1200px;margin: 0 auto;padding: 20px;
}/* 单个新闻项 */
.list-page {background: #fff;border-radius: 8px;box-shadow: 0 2px 8px rgba(0,0,0,0.1);margin-top: 24px;padding: 20px;transition: box-shadow 0.3s ease;
}/* 悬停效果 */
.list-page:hover {box-shadow: 0 4px 12px rgba(0,0,0,0.15);
}/* 新闻图片 */
.list-page img {width: 100%;max-width: 600px;height: auto;border-radius: 4px;margin-bottom: 16px;
}/* 标题样式 */
.title {font-size: 1.5rem;color: #333;margin-bottom: 12px;font-weight: 600;line-height: 1.3;
}/* 正文内容 */
.body {color: #666;line-height: 1.6;margin-bottom: 16px;
}/* 页脚元信息 */
.meta-info {color: #999;font-size: 0.9rem;border-top: 1px solid #eee;padding-top: 12px;
}
</style>*********************************************************************
//子组件(详情页):Detail.vue
<nav class="nav" >//点击返回首页,用到了实例对象$router的back方法<span class="back" @click="$router.back()">首页</span><p>我是详情页</p>我获取到id了----{{$route.params.id}}
</nav>

效果:
在这里插入图片描述

6.渲染详情页

步骤和首页一样,略

7.解决请求过程中出现空白页的bug
出现原因

详情页组件在获取参数后需要异步加载数据,在数据返回前页面没有内容,除此之外,也受限于

  • 在哪个生命周期阶段发起数据请求
  • 网络延迟导致接口请求慢
  • 路由切换时的默认过渡效果可能导致视觉上的空白
解决方法
  • 方法一:越早发送请求越好(created)
  • 方法二:给详情页包裹一层v-if=list.id,如果没有数据则不渲染,没有数据时使用骨架屏内容
<div><div v-if="loading" class="skeloton"><!-- 骨架屏内容 --></div><div v-else><! -- 获取数据,渲染内容 --></div>
</div>
  • 其他:懒加载/预加载/keep-alive
7.组件缓存
问题描述

从首页进度条下拉的新闻列表中点击其中一条新闻,进入详情页然后返回首页,发现自动回到了首页的进度条顶部位置

原因分析

点进详情页又返回,首页数据重新加载了.即:路由跳转后,组件被销毁了,返回来后组件又重建了,导致数据被重新加载

解决方法

使用keep-alive将组件缓存下来

//App.vue
<keep-alive :include="['Home.vue']"><router-view></router-view>
</keep-alive>
拓展:keep-alive介绍
1.keep-alive 是什么?

keep-alive是Vue的内置组件,用来包裹动态组件,使其缓存不活动的组件实例,而非销毁组件
keep-alive是一个抽象组件,它自身不会渲染成一个DOM元素,也不会出现在父组件中

2.keep-alive的优点是什么?

在组件切换的过程中,把切换出去的组件保留在内存中,避免重复渲染DOM,
减少加载时间和性能消耗,提高用户体验

3.keep-alive的三个属性

在上例中,首页被缓存时我们所需要的,详情页却不是,此时需要用到keep-alive的属性对这两个一级路由选择性缓存

  • include:组件名数组[*],匹配的组件会缓存
  • exclude:组件名数组,匹配的组件不会缓存
  • max:最多可以缓存多少个组件实例

*注意组件名数组和文件名(Detail.vue)的不同,有些组件文件会配置name属性:name:DetailPage

4.keep-alive的两个生命周期

首先来验证一下keep-alive的缓存效果:

//Home.vue
created(){consol.log("组件被加载了...")},
mounted(){console.log("DOM渲染完了...")},
destroyed(){console.log("组件被销毁了...")}

结果:除第一次进入组件时触发前两个钩子外,第二次返回页面时不会再触发
接下来,写入actived和deactived看效果:

activeed(){console.log("组件激活了...")},
deactived(){console.log("组件失活了...")}

结果,组件切换的过程中会触发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件操作--文件包含漏洞

本文主要内容 脚本 ASP、PHP、JSP、ASPX、Python、Javaweb --# 各种包含函数 检测 白盒 代码审计 黑盒 漏扫工具、公开漏洞、手工看参数值及功能点 类型 本地包含 有限制、无限制 远程包含 无限制、有限制…

ActiveMQ 性能优化与网络配置实战(二)

五、性能优化实战 5.1 基础配置调整 5.1.1 增加并发消费者 在 ActiveMQ 中&#xff0c;增加并发消费者是提高消息处理效率的重要手段之一。通过配置多个消费者并行处理消息&#xff0c;可以充分利用系统资源&#xff0c;加快消息的消费速度&#xff0c;从而提高系统的整体吞…

C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 17)

&#x1f381;个人主页&#xff1a;工藤新一 &#x1f50d;系列专栏&#xff1a;C面向对象&#xff08;类和对象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;终会照亮我前方的路 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 文章目录 二…

贪心算法精解(Java实现):从理论到实战

一、贪心算法概述 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取当前状态下最优决策的算法策略。它通过局部最优选择来达到全局最优解&#xff0c;具有高效、简洁的特点。 核心特点&#xff1a; 局部最优选择&#xff1a;每一步都做出当前看…

深度学习框架:PyTorch使用教程 !!

文章目录 一、PyTorch框架简介 1.1 什么是PyTorch 1.2 PyTorch的优势 二、从入门到精通的PyTorch使用教程 2.1 入门阶段 2.1.1 环境安装与配置 2.1.2 Tensor基础操作 2.1.3 自动求导&#xff08;Autograd&#xff09; 2.1.4 构建神经网络&#xff08;nn模块&#xff09; 2.1.5 …

系统架构设计师:设计模式——创建型设计模式

一、创建型设计模式 创建型模式抽象了实例化过程&#xff0c;它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类&#xff0c;而一个对象创建型模式将实例化委托给另一个对象。 随着系统演化得越来越依赖于对象复合而不是类…

Dinero.js - 免费开源的 JavaScript 货币处理工具库,完美解决 JS 浮点数精度丢失问题

今天介绍一个在前后端处理货币的工具库&#xff0c;logo 很可爱&#xff0c;是一只蓝色的招财小猫。 本文封面图底图来自免费 AI 图库 StockCake。 Dinero.js 是一个用于货币计算的 JavaScript 工具库&#xff0c;解决开发者在金融、电商、会计等场景中处理货币时的精度丢失、…

HNUST湖南科技大学-嵌入式考试选择题题库(109道纠正详解版)

HNUST嵌入式选择题题库 1.下面哪点不是嵌入式操作系统的特点。(B) A.内核精简 B.功能强大 C.专用性强 D.高实时性 解析&#xff1a; 嵌入式操作系统特点是内核精简、专用性强、高实时性&#xff0c;而"功能强大"通常指的是通用操作系统&#x…

【工具】Windows批量文件复制教程:用BAT脚本自动化文件管理

一、引言 在日常开发与部署过程中&#xff0c;文件的自动化复制是一个非常常见的需求。无论是在构建过程、自动部署&#xff0c;还是备份任务中&#xff0c;开发者经常需要将某个目录中的 DLL、配置文件、资源文件批量复制到目标位置。相比使用图形界面的复制粘贴操作&#xf…

xray-poc编写示例

禁止未授权扫描和测试行为&#xff01;&#xff01;&#xff01; 1. SQL 时间盲注检测 (Time-Based Blind SQLi) name: generic/time-based-sqli rules:- method: GETpath: "/product?id1 AND (SELECT 1 FROM (SELECT SLEEP(5))a)--"expression: |response.status…

【Day 14】HarmonyOS分布式数据库实战

一、分布式数据库基础 1. 核心概念速记表 术语解释示例场景分布式数据库数据自动同步到同账号设备手机添加商品→平板立即显示KV数据模型键值对存储&#xff08;类似JSON&#xff09;{"cart_item1": {"name":"牛奶","price":10}}数据…

【数据结构】- 栈

前言&#xff1a; 经过了几个月的漫长岁月&#xff0c;回头时年迈的小编发现&#xff0c;数据结构的内容还没有写博客&#xff0c;于是小编赶紧停下手头的活动&#xff0c;补上博客以洗清身上的罪孽 目录 前言&#xff1a; 栈的应用 括号匹配 逆波兰表达式 数制转换 栈的实…

TDA4VM SDK J721E (RTOS/Linux) bootloaders梳理笔记

文章目录 1. 前言2. RTOS BootLoader2.1 引导模式2.2 启动序列2.2.1 流程框图2.2.2 Memory map2.3 镜像格式详解3. Linux BootLoader镜像格式详解启动流程参考1. 前言 TDA4VM的BootLoader包含两部分:RTOS的和Linux的。 2. RTOS BootLoader 这是在SoC上的所有内核运行FreeRTO…

Spring Boot + MyBatis-Plus 的现代开发模式

之前的Maven项目和本次需要的环境配置并不一样 之前使用的是&#xff1a; 传统的 MyBatis 框架&#xff08;非 Spring Boot 环境&#xff09; 手动管理 SqlSession 使用了 .xml 的 Mapper 映射文件 没有 Spring 容器管理&#xff08;没有 Service / RestController 等&…

【Quest开发】极简版!透视环境下抠出身体并能遮挡身体上的服装

前两天发了一个很复杂的版本&#xff0c;又鼓捣了一下发现完全没有必要。我之前的理解有点偏&#xff08;不是错误的但用法错了&#xff09;&#xff0c;但是有一些小伙伴收藏了&#xff0c;害怕里面的某些东西对谁有用&#xff0c;所以写了一篇新的&#xff0c;前两步配置环境…

vue 常见ui库对比(element、ant、antV等)

Element UI 1. 简介 Element UI 是一个基于 Vue 2 和 Vue 3 的企业级 UI 组件库&#xff0c;提供了丰富的组件和主题定制功能。官方网站&#xff1a;Element UI 2. 主要特点 丰富的组件&#xff1a;包括表单、表格、布局、导航、弹窗等多种组件。主题定制&#xff1a;支持主…

MATLAB画一把伞

% 伞的参数num_ribs 5; % 伞骨数量修改为5R 1; % 伞的半径height 0.5; % 伞的高度handle_length 2; % 伞柄长度semicircle_radius 0.26; % 伞柄末端半圆的半径% 生成伞叶网格theta linspace(0, 2*pi, 100);phi linspace(0, pi/2, 50);[Theta, Phi] meshgrid(theta, phi…

如何在 Go 中实现各种类型的链表?

链表是动态内存分配中最常见的数据结构之一。它由一组有限的元素组成&#xff0c;每个元素&#xff08;节点&#xff09;至少占用两块内存&#xff1a;一块用于存放数据&#xff0c;另一块用于存放指向下一个节点的指针。本文教程将说明在 Go 语言中如何借助指针和结构体类型来…

新一代机载相控阵雷达的发展

相控阵雷达以其优越的性能在军事领域中有着广阔的应用前景&#xff0c;但由于复杂的技术、昂贵的造价使其应用范围还存在一定的局限性。然而&#xff0c;国内外对相控阵技术的研究非常重视&#xff0c;并取得了丰硕的成果。 军用相控阵雷达主要分为陆基、海基和空基几种类型。 …

多数元素题解(LC:169)

169. 多数元素 核心思想&#xff08;Boyer-Moore 投票算法&#xff09;&#xff1a; 解题思路&#xff1a;可以使用 Boyer-Moore 投票算法、该算法的核心思想是&#xff1a; 维护一个候选元素和计数器、初始时计数器为 0。 遍历数组&#xff1a; 当计数器为 0 时、设置当前元…