当前位置: 首页 > news >正文

【Vue五分钟】 Vue Router的使用场景

📑博客主页:@丘比特惩罚陆

💖欢迎关注:点赞收藏⭐留言✒
💬系列专栏:web前端、嵌入式、笔记专栏
🎮 加入社区: 丘比特惩罚陆
🥇人生格言:选对方向,每走一步都是进步!
✒️欢迎大佬指正,一起学习!一起加油!

👏 希望大家能小手一动,帮忙点个赞!

😁资源邮箱:2237814512@qq.com

目录

1.Vue Router的使用场景

2.选择什么样的模式的路由和底层原理

3.Nuxt 用来解决什么问题

4.Nuxt核心原理

5.UI组件库的对比

6.提升开发效率和体验的常用工具

7.单元测试的重要性和使用 


1.Vue Router的使用场景

传统的开发模式:

www.xxx.com——index.html;

www.xxx.com/about——about.html;

www.xxx.com/xxx——xxx.html.

以前传统的开发就是每个 html 或其他文件对应一个 url ,但是每次切换 url 都需要重新加载页面,影响用户体验。
单页面(SPA)开发模式:
 
www.xxx.com——index.html;
www.xxx.com/about——index.html;
www.xxx.com/xxx——index.html
这种则是不管什么 url 都对应同一个文件(不是很严谨,依然可以定位到不同的文件,只不过没必要)。用户切换 url 不再是重新加载页面,而是通过一些逻辑找到对应接口返回不
同的数据 / 组件。
解决的问题:
监听URL的变化,并在变化前后执行相应的逻辑;
不同的URL对应不同的不同的组件;
提供多种方式概念URL的API(URL的改变不能导致浏览器刷新)
使用方法:
提供一个路由配置表,不同的URL对应不同组件的配置;
初始化路由实例new VueRouter();
挂载到Vue实例上面;
提供一个路由占位,用来挂载URL匹配的组件
main.js
import Vue from 'vue'
import VueRouter from 'vue-router"
import App from './App.vue'
import routes from './routes'

Vue.config.productionTip = false

vue.use(VueRouter)
const router =new VueRouter(
{
//mode: 'history',
routes,
})

new Vue({
router,
render: h > h(App),
}).$mount('#app')
安装引入使用 Vue router ,将路由表写到一个文件里实例化router 的时候把表丢进去就行。
<template>
<div id="app">
<h2>router demo</h2>
<router-view></router-view>
</div>
</template>

<script>
export default{name: 'app',components:{),
}
</script>
<style>#app{
font-family: 'Avenir', Helvetica,Arial, sans-serif;一webkit-font-smoothing: antialiased;
一moz-osx-font-smoothing: grayscale;text-align: center;
color:O#2c3e50;margin-top:60px;}
</style>

router.js

import RouterDemo from './components/RouterDemo'
import RouterChildrenDemo from './components/RouterChildrenDemo'

const routes =[
  { path: '/foo' , component: RouterDemo,name: '1'},
  { path: '/bar' , component: RouterDemo,name: '2'},
//当/user/:id匹配成功,
// RouterDemO会被渲染在App的<router-view/>中
{ path: '/user/:id',
  component: RouterDemo,
  name: '3',
  props: true,
children: [
    {
        //当/user/:id/profile匹配成功,
        // RouterchildrenDemo会被渲染在 RouterDemo的<router-view/>中
        path: 'profile',
          component: RouterchildrenDemo,
        name: '3-1'
    },
    {
        //当/user/: id/posts 匹配成功
        // RouterChildrenDemo 会被瀘染在RouterDemo 的<router-view/> 中
        path:'posts',
        component: RouterChildrenDemo
    }
]
}
        ,
        { path: '/a', redirect:'/bar' },
        { path: '*', component: RouterDemo, name: '404' }
]



export default routes

我们可以看到路由表引入了两个组件,匹配到对应的路由则使用对应组件,渲染到前面的 router-view 中。 props 的意思是运行动态路由作为一个参数传递给组件,组件通过props:[xxx]接受。路径为 * 是当前面都匹配不到才走的,一般是到 404 页面.

路由跳转可以有 router-link 也可以用 API 的方式($route.xxx)

2.选择什么样的模式的路由和底层原理

路由类型:

Hash模式:丑,没办法使用锚点定位;

History模式:需要后端配合,IE9不兼容(可以使用强制刷新处理)

Url 里面有 # 就是哈希模式。无法使用锚点定位是因为哈希是在路由。
import Vue from 'vue '
import VueRouter from 'vue- router'
import App from ' ./App. vue '
import routes from ' ./ routes'

Vue.config. productionTip = false
Vue.use (VueRouter)
const router = new
VueRouter({
node: 'history',
routes,
})
new Vue({
router,
render: h => h(App),
}). $mount( '#app' )
解决哈希存在的问题就是改用 history ,只需要在配置表那加 上 mode history 就行。 关于 IE9 的不兼容是可以解决,只不过就无法使用这种单页的形式了。就是当 url 修改的话不再是通过 ajax 拿到数据去渲染而是选择强制刷新当前 url
底层原理

 其实路由是通过蓝色那边的 API router 的信息变成一个响应式的,触发 router-view 的更新


3.Nuxt 用来解决什么问题

并不是官方维护的,用的也比较少,实战也不会用,但是可以了解。
SPA 缺点:
不利于SEO;服务端渲染SSR;首次屏渲染时间长;预渲染Prerenderirng
SEO 就是搜索引擎优化(因为内容都是通过接口获取的,搜索引擎爬取我们的网页即 index.html 是没有什么内容的,就很难出现在搜索结果排名中)。 因为我们需要加载数据请求接口所以白屏时间会长一些。解决的方法就是 SSR 和 Prerendering.
Prerendering

 静态站点比如联系我们、关于我们等一些不常变动的页面.SSR 的话生命周期钩子一些是不能用的,路由配置、webpack 配置也都有所不同,所以是比较繁琐。

Nuxt:

静态站点;动态渲染;简化配置

Nuxt 就是帮我们解决这些问题。


4.Nuxt核心原理

Nuxt的核心原理是什么,或者是SSR的核心原理/流程是什么?

Nuxt(SSR)

 打包业务代码的时候,提供两个入口文件,一个给服务端使用(返回新创建的 Vue 实例)一个给客户端/浏览器使用(将 Vue 实例挂载到指定的 DOM 上)。 经过 webpack 打包后会生成两个 bundle 文件,服务器的bundle 渲染了 html 什么的到我们页面上,但是具体的点击什么的还要靠客户端的 bundle 混合将 html 完全由 Vue 管理托管为 DOM,响应后续的变化。(所以不管服务端搞什么,客户端都是要渲染的)。

流程图

 上面是不用 SSR 只返回一个空壳的 html,下面是使用 SSR,根据 url 返回对应字符串什么的给客户端。


5.UI组件库的对比

Element UI、Ant Design Vue、View组件库的对比;

 建议是使用单测比较高覆盖率的,这些都是组件库,里面包含一个个组件,然后合起来做一个模板的就是 admin 了。


6.提升开发效率和体验的常用工具

一般有:ESLint、Prettier、Veter、vue-devtools;

Vuter:

  • 语法高亮;
  • 标签补全、模版生成;
  • Lint检查;
  • 格式化

 这个其实是 vscode 的插件。

ESLint:

  • 代码规范;
  • 错误检查
安装 eslint 相关的包然后做一下配置(建议开那个被注释了的强烈建议)即可。
Prettier:
  • 格式化

 可以看到我们配置 eslint 的时候也顺便配了个 prettier 就是防止两者冲突。直接按下保存即可更改。

module.export = {
  singleQuote:ture,
//trailingComma:'all'
};

Vue DevTools:

  • 集成Vuex
  • 可远程调试
  • 性能分析

7.单元测试的重要性和使用 

开源一般都是要覆盖到所有的代码,底层组件库什么的单测也是很重要,而业务的话可以选择性的单测部分代码。短期来看,单测会影响开发速度,但是后续迭代需求什么的还可以及时更改问题。

重要性:

  • 保证研发质量
  • 提高项目的稳定性
  • 提高开发速度 

使用方法:

  • jest或mocha
  • @vue/test-utils
  • sinon
jest mocha 是两个测试运行环境 / 测试运行器,jest 比较全, 配置也比较少。 mocha vue 提供的,比较实用。 sinon 是辅助测试库,不是必要的。vue create 创建一个 test1-demo,选择自定义,勾上 unit Testing 单测,选上 prettier,选择 jest,可以放到独立的文件不要让 package.json 太大.
   
   创建完成我们发现多了一个 tests 文件夹和 jest 的配置,配置的话第一个是指定测试的文件类型,第二个是类似 loade r 通过各种包处理我们的一些文件),第三个是要忽略测试的文件,第四个是类似那个指定快捷键符号的(@ 符号),第五个是快照的格式化,第六个是对哪些文件走单测,第七个是给js DOM 使用的,本质上它还是跑在浏览器的环境中。
   
   我们看看给的单测例子,是对 hello 组件的测试, describe 就是定义一个测试集,第一个参数是名称,每一个 it 是单测的最小集,里面第一个参数是名称,第二个就是函数了,里面写我们的校验。里面是用 shallowMount 浅渲染(就是只是渲染这一层,里面还有东西就不管了),正常渲染就是 mount(第一个是组件,第二个是参数)。这个太简单了,我们写一个计数器 Counter.vue 来丰富一下测试,能够加就行了。
   
    建一个属于 counter 的测试,无需接收参数只需要组件渲染后的 html () .toMatchSnapshot ()。生成快照就是自动在文件夹下新建一个快照储存的地方(就无需一个个去 test 了, 如果修改了代码我们再次生成快照就会失败,因为已经与之前的 html 不一样了,所以就很方便对比代码),里面就是具体渲染的内容.
   
   当然单测是可以监听的, run 的时候加上 -- -- watchAll 就会每次修改都自动 watch 。 当然这个还不行,肯定不能只是测试一下我的快照,核心功能是要测试点击后数据的变化,再写一个 it ,要执行点击的话需要找到按钮(通过渲染后组件的 find API ),按钮通过点击触发,然后拿到这个值希望是 xxx 。还希望再复杂一点,在组件那再加一个点击事件,修改 count 值同时$emit 抛出一个事件和参数,回到测试,我们想要监听这个事件是否被抛出了,可以在组件渲染的时候加一个listeners 对象,里面监听抛出的事件,在外面起一个标志位,抛出的事件中改变这个标志位,判断的话是希望我们的标志位被改变了,从而判断是否走了这个事件。 但是如果是想要判断点击的次数,可以在外面定义一个变量来存储,不过这样子不是很友好,我们可以利用刚才提到的辅助库 sinon ,在测试中引入,利用 spy ()生成一个替身指向我们抛出的事件,其它关于事件的就可删掉了,最后是期望事件的 called true 。希望事件的 callCount 次数为 xxx
    
   

相关文章:

  • sftpgo集成minio 测试
  • SPI总线协议详解
  • 【产品设计】产品外观设计的特点与优势
  • SpingBoot自动装配原理
  • qt编程中的一些技巧
  • 刷题记录:NC146615简单的数据结构
  • 2022.10月11月todo
  • Pytorch混合精度训练
  • 不会代码(实操能力弱一点)的我如何快速开发出一个Android/Web/IOS/小程序
  • 【博客503】kubelet device plugin如何管理与分配device
  • 第4章-4 验证“哥德巴赫猜想”
  • 嗨购商业模式赋能消费者、创业者和实体商家,助力中小微企业
  • 1469_TC275串口字符串输出例程中的中断功能分析
  • 360面试——计算机视觉面试
  • CentOS6.9更换yum源镜像网站方法大汇总
  • [Vue CLI 3] 配置解析之 css.extract
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • C++入门教程(10):for 语句
  • egg(89)--egg之redis的发布和订阅
  • js算法-归并排序(merge_sort)
  • Leetcode 27 Remove Element
  • Node项目之评分系统(二)- 数据库设计
  • 解决iview多表头动态更改列元素发生的错误
  • 你真的知道 == 和 equals 的区别吗?
  • 漂亮刷新控件-iOS
  • 使用parted解决大于2T的磁盘分区
  • 正则与JS中的正则
  • 智能合约Solidity教程-事件和日志(一)
  • 走向全栈之MongoDB的使用
  • 2017年360最后一道编程题
  • ionic入门之数据绑定显示-1
  • #Linux(Source Insight安装及工程建立)
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (C语言)共用体union的用法举例
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (过滤器)Filter和(监听器)listener
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (力扣题库)跳跃游戏II(c++)
  • (三) diretfbrc详解
  • (算法)Game
  • (一)kafka实战——kafka源码编译启动
  • (转载)(官方)UE4--图像编程----着色器开发
  • (转载)深入super,看Python如何解决钻石继承难题
  • *** 2003
  • .mysql secret在哪_MySQL如何使用索引
  • .NET BackgroundWorker
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .net反编译的九款神器
  • .net反混淆脱壳工具de4dot的使用
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .py文件应该怎样打开?