Vue(三)

十二、路由

路由的使用Vue-router

  • Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面
    应用变得易如反掌。路由实际上就是可以理解为指向,就是我在页面上点击一个按钮需要跳
    转到对应的页面,这就是路由跳转.

  • 三个单词(route,routes,router):

    • route:首先它是个单数,译为路由,即我们可以理解为单个路由或者某一个路由;

    • routes:它是个复数,表示多个的集合才能为复数;即我们可以理解为多个路由的集合,JS中表示多种不同状态的集合的形式只有数组和对象两种,事实上官方定义routes是一个数组;所以我们记住了,routes表示多个数组的集合;

    • router:译为路由器,上面都是路由,这个是路由器,我们可以理解为一个容器包含上述两个或者说它是一个管理者,负责管理上述两个;举个常见的场景的例子:当用户在页面上点击按钮的时候,这个时候router就会去routes中去查找route,就是说路由器会去路由集合中找对应的路由;

客户端实例

步骤:

​ 1.下载vue-router.js

​ 2.页面引用

​ 3.创建组件

var login={
    template:'<p>登陆组件</p>'
}
var register={
    template:'<p>注册组件</p>'
}

​ 4.创建路由规则对象

var routerobj = new VueRouter({
    routers:[
        {path:'/login',component:login},
        {path:'/register',component:register},
    ]
})

​ 5.将路由规则对象挂载到vue实例上

var vue = new Vue({
	el:'#app',
    router:routerobj,
})

​ 6.在div中使用

<div id="app">
    <a href = "#/login">登录</a>
    <a href = "#/register">注册</a>
    <router-view></router-view>
</div>

属性

vue-router是vue单页面开发的路由,就是决定页面跳转的!
<router-link> 组件支持用户在具体有路由功能的应用中(点击)导航。通过to属性指定目标地址
属性如下:
1.to
表示目标路由的链接。当被点击后,内部会立刻把to的值传到router-push()

2.replace
设置replace属性的话,当点击时,会调用router.replace()而不是router.push(),所以导航后不会留下history记录,也就是不能回退到上一个页面

3.append
设置append属性后,则在当前路径前添加基路径,例如,我们从 /a导航到一个相对路径 b,如果没有配置 append,则路径为 /b,如果配了,则为 /a/b

4.tag
有时候想要<router-link>渲染成某种标签,例如<li>。于是我们使用tag prop 类指定何种标签,同样它还是会监听点击,触发导航。

5、active-class
设置链接激活时使用的css类名。默认值可以通过路由的构造选项linkActiveClass来全局配置, 默认值为 router-link-active

6、exact
“是否激活”,默认是false 。举个粟子,如果当前的路径是/a 开头的,那么<router-link to="/a"> 也会被设置css类名按照这个规则,<router-link to="/">将会点亮各个路由!想要链接使用"exact匹配模式",
则使用exact属性:

7、event
声明可以用来触发导航的事件(默认是click)。可以是一个字符串或者是一个包含字符串的数组

8、将"激活时的css类名"应用在外层元素
有时候我们要让"激活的css类名"应用在外层元素,而不是标签本身,那么可以用<router-link>渲染外层元素,包裹着内层的原生<a>标签

9、方法
router-link默认是触发router.push(location),如果设置replace 则触发router.replace(location)区别是:

  • router.push() :导航跑到不同的URL,这个方法会向history栈添加一个新的记录,所以,当用户点击浏览器后退按钮时,则回到之前的url.
  • router.replace(): 跟router.push作用是一样的,但是,它不会向history添加新记录,而是跟它的方法名一样替换掉当前的history记录.
  • router.go(n): 这个方法的参数是一个整数,意思是在history记录中向前或者后退多少步,类似window.history.Go(n)

10.hashbang

  • 只在 hash 模式下可用

  • 将路径格式化为#!开头 : 默认值为true

11.history
启用HTML5 history模式,可以使用pushState和replaceState来管理记录,默认值是false。

路由对象和路由匹配

  • 路由对象,即$route会被注入每个组件中,可以利用它进行一些信息的获取,也可以在自己定义路由规则(map)的时候自定义字段,用以特殊目的。
  • 全匹配片段的语法是使用通配符* 如,/user/*any就会匹配到任何以/user为开头的路径,并给params对象中赋值一个属性any
  • 动态片段的语法就是使用 : 作为标志。

使用路径名称

在定义路径规则的时候,如果你给它提供了一个name属性,则可以在后续使用这条路径规则的时候,直接引用。

第一种用法: 通过name属性,为一个页面中不同的router-view渲染不同的组件,

<router-view></router-view>
<router-view name="Hello"></router-view>
<router-view name="text"></router-view>

第二种用法: 可以用name传参 使用$route.name获取组件name值

<p>{{$router.name}}</p> //可以获取到渲染进来的组件的name值
<router-view></router-view>

第三种用法: 用于pramas传参的引入 pramas必须用name来引入; query可以用name或者path来引入

var router = new VueRouter({
    routes:[{name:'register',path:'/reister/:id/:name',component:register}]
})
<router-link :to="{name:'register',params:{id:10,name:'lili'}}">注册</router-link>

query传参和params传参的使用和区别

1.用法上:
query可以用name或path来引入
params必需要用name来引入,接收参数都是类似的,分别是:
this.$route.query.name和this.$route.params.name
2.地址栏表现形式上:

query: 
	/login?id=10&name=zs
params:
	/login/12/ls

vue-router的嵌套

<router-view>是最顶层的出口,渲染最高级路由匹配到的组件。同样地,一个被渲染组件同样可以包含自己的嵌套 <router-view>。例如,在 User 组件的模板添加一个 <router-view>

<div id="app">
    <router-view></router-view>
</div>
const User={
    template:`
    <div class="user">
        <h2> User {{$router.params.id}}</h2>
        <router-view></router-view>
    </div>`
}

要在嵌套的出口中渲染组件,需要在 VueRouter 的参数中使用 children 配置:

const router = new VueRouter({
    routes:[
        {
            path:'/user/:id',
            component:User,
            children:[
                {path:'profile',
                 component:UserProfile}
            ]
        }
    ]
})

以 / 开头的嵌套路径会被当作根路径

十三、vue-cli脚手架

vue-cli解释

​ vue-cli是vue官方提供的脚手架工具。脚手架工具简单讲就是自动将项目需要的环境、依赖等信息都配置好。

全局安装

全局安装命令:

npm install -g @vue/cli
# OR
yarn global add @vue/cli

检查版本:

vue --version

升级版本:

npm update -g @vue/cli
# 或者
yarn global upgrade --latest @vue/cli

创建项目

命令行窗口方式
  1. 进入想创建项目的目录然后执行命令:
vue create hello-world
  1. 初始化项目:
npm install
  1. 启动项目:
npm run serve
  1. 浏览器访问:

http://localhost:8080/

  1. 项目打包上线:
npm run build
图形界面方式创建

(vue 3.0及以上版本支持)

  1. 打开ui界面:
vue ui

自动跳转到图形化创建界面

  1. 点击创建新项目
    填写项目名(尽量小写,大写会自动转为小写),选择npm或其他包管理器。

  2. 选择默认即可

十四、vue的ajax请求

1)vue本身不支持发送AJAX请求,需要使用vue-resource、axios等插件实现。

2) axios是一个基于Promise的HTTP请求客户端,用来发送请求,也是vue2.0官方推荐的,同时不再对vue-resource进行更新和维护

安装axios并引入

1)npm的方式: $ npm install axios -S

2)bower的方式:$ bower install axios

3)cdn的方式:<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

基本用法

1)axios([options])

2)axios.get(url[,options]);
传参方式:
(1)通过url传参axios(‘url?key=value&key1=val2’).then();
(2)通过params选项传参 axios(‘url’,{params:{key:value}}).then();

3)axios.post(url,data,[options]);
axios默认发送数据时,数据格式是Request Payload,并非常用的Form Data格式,
所以参数必须要以键值对形式传递,不能以json形式传。
传参方式:
(1)自己拼接为键值对
axios.post(‘url’,‘key=value&key1=value1’).then();

​ (2)使用transformRequest,在请求发送前将请求数据进行转换

​ (3)如果使用模块化开发,可以使用qs模块进行转换
​ 简单来说,qs 是一个增加了一些安全性的查询字符串解析和序列化字符串的库

十五、跨域请求

跨域概念

1、跨域
  指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。
2、同源策略
   是指协议,域名,端口都要相同,其中有一个不同都会产生跨域,在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。
3、跨域问题怎么出现的
  开发一些前后端分离的项目,比如使用 SpringBoot + Vue 开发时,后台代码在一台服务器上启动,前台代码在另外一台电脑上启动,此时就会出现问题。
  比如:后台 地址为 http://192.168.70.77:8081
     前台 地址为 http://192.168.70.88:8080
  此时 ip 与 端口号不一致, 不符合同源策略,造成跨域问题。
(axios本身并不支持发送跨域的请求,没有提供相应的API,作者也暂没计划在axios添加支持发送跨域请求,所以只能使用第三方库)

十六、动画

Vue 在插入、更新或者移除 DOM 时,提供多种不同方式的应用过渡效果。包括以下工具:

  • 在 CSS 过渡和动画中自动应用 class
  • 可以配合使用第三方 CSS 动画库,如 Animate.css
  • 在过渡钩子函数中使用 JavaScript 直接操作 DOM
  • 可以配合使用第三方 JavaScript 动画库,如 Velocity.js
    **示例:**当插入或删除包含在 transition 组件中的元素时,Vue 将会做以下处理:
    • 自动嗅探目标元素是否应用了 CSS 过渡或动画,如果是,在恰当的时机添加/删除 CSS 类名。
    • 如果过渡组件提供了 JavaScript 钩子函数,这些钩子函数将在恰当的时机被调用。
    • 如果没有找到 JavaScript 钩子并且也没有检测到 CSS 过渡/动画,DOM 操作 (插入/删除) 在下一帧中立即执行。(注意:此指浏览器逐帧动画机制,和 Vue 的 nextTick 概念不同)
在进入/离开的过渡中,会有 6 个 class 切换
  1. v-enter:定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除。
  2. v-enter-active:定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。
  3. v-enter-to:2.1.8 版及以上定义进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 v-enter 被移除),在过渡/动画完成之后移除。
  4. v-leave:定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除。
  5. v-leave-active:定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函 数。
  6. v-leave-to:2.1.8 版及以上定义离开过渡的结束状态。在离开过渡被触发之后下一帧生效 (与此同时 v-leave 被删除),在过渡/动画完成之后移除

注意:

  • 对于这些在过渡中切换的类名来说,如果你使用一个没有名字的 <transition>,则 v- 是这些类名的默认前缀。
    如果你使用了 <transition name="my-transition">,那么 v-enter 会替换为 my-transition-enter

  • -v-enter-activev-leave-active 可以控制进入/离开过渡的不同的缓和曲线

  • CSS 动画用法同 CSS 过渡,区别是在动画中 v-enter 类名在节点插入 DOM 后不会立即删除,而是在 animationend 事件触发时删除。

自定义过渡类名

以通过以下 attribute 来自定义过渡类名:

  • enter-class
  • enter-active-class
  • enter-to-class (2.1.8+)
  • leave-class
  • leave-active-class
  • leave-to-class (2.1.8+)

它们的优先级高于普通的类名,这对于 Vue 的过渡系统和其他第三方 CSS 动画库,如 Animate.css 结合使用十分有用。

十七、性能优化

一、均衡页面加载文件的大小和数量

1、项目中小图片图片转base64,通过工具如webpack进行图片压缩,文件进行压缩混淆等

2、vue-router 懒加载,异步路由

3、第三方依赖按需加载,比如使用element-ui框架,但是里面的组件只用到了其中一部分,可以单独建一个引入element组件的文件,在里面引入我们项目中需要的组件,然后vue.use它

4、通过webpack进行处理,有一个externals属性,可以在里面设置不需要打包的文件,比如可以设置将vue、vue-router、element-ui等等设置进去,打包的时候就不会打包他们,然后将vue、vue-router、element-ui等资源在html中引入

5、可以借助开启gzip压缩文件,减小文件大小;

6、生产环境build时不生成map文件

二、减少等待通过xhr获取数据的时间

1、在redis中添加缓存

2、在并发允许且数据量较多的情况下,分页可以交给后端做,利用数据库进行排序后取出需要的分页内容,这样虽然增加了xhr请求,但是单次请求耗费时间会大大降低;后端分页每次取数据不一定是仅取当前分页的数据,可以一次性取当前页以及当前页的前后各两页的数据,这样用户进行前后页的切换时,不需要重新继续发起xhr请求。

3、一些内容固定的数据(但又需要进行管理),可以将这些数据的获取合并为一个请求,每次刷新只需要取一次

4、提前发起xhr请求:可以在dom渲染完成之前就发起xhr请求,而不是等待dom渲染完成之后才进行。created时,或者beforeRouteEnter时就调用。

三、通过交互,在视觉效果上提升

1、可以通过一些加载loading动画,以及资源加载完成前,可以通过占位符占位的方式,避免渲染时出现空白页,视觉上提升加载速度

2、优先加载当前用户可视区域的内容,其他内容待用户切换tab或者滚动鼠标或者可视区域加载完成后再继续加载

3、图片预渲染,可以在当前页上根据页面上的跳转链接(或者tab页可能的切换),预渲染一些图片

四、善用vue的一些属性

1、v-if与v-show根据具体业务场景适当选取

2、善用kee-alive

五、将项目根据业务和模块,改造为多页面,而不是紧靠单页面支撑

六、代码优化

1、一些前端能做的事情,可以在前端本地做,比如当分页是前端分页的时候,伴随的一些排序、筛选等,也可以由前端实现,节省xhr请求,减少时间损耗

2、通用方法封装为模块,减少代码冗余

3、写一些性能高的代码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值