Vue学习笔记——vue-router

视频资源来自:b站coderwhy王红元老师——最全最新Vue、Vuejs教程,从入门到精通
文章仅为个人观看视频后的学习心得笔记,用于个人查看和记录保存。文中定有疏漏错误之处,恳请指正。

==箭头函数==:一种定义函数的方式

//1.定义函数的方式:function
const aaa = function () {
}

//2.对象字面量中定义函数
const obj = {
  bbb: function () {
  },
  bbb() {
  }
}

//3.ES6中的箭头函数
//const ccc = (参数列表)=> {
//}
const ccc = () => {
}
  1. 参数问题

      //放入两个参数
      const sum = (num1,num2) => {
        return num1+num2
      }
      //放入一个参数,小括号省略
      const power = num => {
        return num * num
      }
    
  1.   //代码块中有多行代码
      const test = () => {
        console.log('Hello')
        console.log('World')
      }
      //代码块中只有一行代码,有没有返回值都行
      const nul = (num1,num2) => {
        return num1 +num2
      }
      const nul = (num1,num2) => num1 +num2
    
    

箭头函数的this

箭头函数的this是如何查找的?

向外层作用域中一层层查找this,直到有this的定义

Vuex认识路由

前端渲染,后端渲染

后端路由阶段

1.后端渲染

jsp:java server page

2.后端路由

后端处理URL和页面直接的映射关系

前后端分离阶段

后端只负责提供数据,不负责任何阶段的内容

前端渲染:浏览器中显示的网页中的大部分内容,都是由前端写的js代码在浏览器中执行,最终渲染出来的网页

移动端和网页端的后端不需要进行任何处理,使用同一套api

SPA页面

SPA:单页面富应用

整个网页只有一个html页面

每次交互都不用请求新的url。改变url,页面不进行整体的刷新

SPA最主要的特点就是在前后端分离的基础上加了一层前端路由

前端路由的规则

href ->hyper reference

控制台location.hash = 'bdd',可以改变url而不刷新。

history.pushState(data,title,?url)

history.pushState({},'','home'),可以改变url而不刷新。

↑不断push 入栈。history.back()=history.go(-1)出栈返回

go里面的数字表示指针移动多少个值

history.forward()=history.go(1)

history.replaceState({},'','home'),替换,不能返回

vue-router基础

下载:npm install vue-router --save

import router from './router'

如果是个目录(文件夹)会自动找该文件夹里的index文件

1.创建路由组件

import Vue from 'vue'
import VueRouter from 'vue-router'

import Home from '../components/Home'
import About from '../components/About'

//1.通过Vue.use(插件),安装插件
Vue.use(VueRouter)
//2.创建vueRouter对象
const routes =[
  {
    //协议头://host/
    path: '/home',
    component: Home
  },
  {
    path: '/about',
    component: About
  },
  //没有路径时,重定向到home(默认打开首页)
  {
    path: '',
    redirect: '/home'
  }
]
const router = new VueRouter({
  //配置路由器和组件直接的映射关系
  routes,
  //默认情况使用hash改变url,也可改成history
  //mode: 'history'
 // linkActiveClass: 'active'
})

//3.将router对象传入到Vue实例
export default router

配置组件和路径的映射关系

import Home from '../components/Home'
import About from '../components/About'
const routes =[
  {
    //协议头://host/
    path: '/home',
    component: Home
  },
  {
    path: '/about',
    component: About
  },
  //没有路径时,重定向到home(默认打开首页)
  {
    path: '',
    redirect: '/home'
  }
]

3.使用路由

    首页
    关于
    

关于——入口的显示

to:指定跳转的路径

tag:默认渲染成一个标签,="button"时渲染成buttton

replace:默认是可以返回的,加上这个标签(后面不用跟等于),以后就不能返回了

active-class:选择谁,谁的样式就改变为知道class

也可以在router里统一修改:linkActiveClass: 'active'

——组件的显示,占位

使用button代替link,用代码实现跳转

    
    
    
export default {
  name: 'App',
  data(){
    return{
      $router: ''
    }
  },
  methods: {
    homeClick(){
      //通过代码的方式修改路由vue-router
      //this.$router.push('/home')
      this.$router.replace('/home')
      console.log('homeClick')
    },
    aboutClick(){
      //通过代码的方式修改路由vue-router
      this.$router.push('/about')
      console.log('aboutClick')
    }
  }
}

route:(不是router)当前谁处于活跃就是谁

动态路由:

组件User:(两种写法)

    

{{$route.params.userId}}

    

{{userId}}

computed: { userId(){ return this.$route.params.userId } }

父组件App

    用户
    
 data(){
    return{
      userId:'zhangsan'
    }

路由文件index

  {
    path: '/user/:userId',
    component: User
  }

路由懒加载

一个路由打包一个js文件,用到哪个加载哪个

方法一:结合Vue的异步组件和Webpack的代码分析

方法二:AMD写法

==方法三==:在ES6中, 我们可以有更加简单的写法来组织Vue异步组件和Webpack的代码分割.

const Home = () =>import('../components/Home')
const About = () =>import('../components/About')
const User = () =>import('../components/User')

路由嵌套

子路由:用children

path: '/home',
component: Home,
children: [
  {
  path: '',
 //不加斜杠就默认从上一个路径后面接下去     
  redirect:'news'
},
  {
  path: 'news',
  component:HomeNews
},
{
  path: 'message',
  component:HomeMessage
}]

传递参数

Profile -> 档案

加了冒号:即v-bind,就把to=""里面的东西当成语法解析,否则还是字符串。

to="字符串"等价于:to="'字符串'"

URL: 协议://主机:端口/路径?查询

scheme://localhost(:port)/path?query#fragment

传递参数的方式

params的类型:

动态路由

配置路由格式: /router/:id
传递的方式: 在path后面跟上对应的值
传递后形成的路径: /router/123, /router/abc

query的类型:

配置路由格式: /router, 也就是普通配置
传递的方式: 对象中使用query的key作为传递方式
传递后形成的路径: /router?id=123, /router?id=abc

档案
    

{{$route.query.name}}

{{$route.query.age}}

所有组件都继承着Vue的原型。父类中的方法,子类继承了

导航守卫

生命周期函数

跳转函数实现在指定组件页显示指定title

routes配置都加上

meta——元数据(;描述数据的数据)

meta:{
      title:'档案'
    },
//前置守卫
router.beforeEach((to,from,next) =>{
  //从from跳转到to
  document.title =to.matched[0].meta.title
  //下一步,默认原本就有,重写的话也得加上
  next()
})

matched[0]——如果一个父组件有多个子组件,title的元素不会在父组件里,会在子组件里,所以找第一个子组件(一般)的title元素

//后置守卫,不需要主动调用next函数
router.afterEach((to,from) =>{
  console.log('-----')
})

先调用前置守卫。后调用后置守卫

  • 全局守卫

  • 路由独享守卫

    beforeEnter: (to,from,next) =>{}
    
  • 组件内的守卫

keep-alive遇见vue-router

标签在切换时,被反复创建和销毁(用[生命周期函数](# 生命周期函数)来验证)。可以用keep-alive使其保持活性


  

keep-alive的状态下才能使用 activated/deactived和beforeRouteLeave这两个函数

首页中使用path属性记录离开时的路径,在beforeRouteLeave中记录

//这两个函数,只有该组件被保持了状态,使用了keep-alive时,才是有效的
activated() {
  this.$router.push(this.path);
},
beforeRouteLeave(to,form,next){
  console.log(this.$route.path);
  this.path = this.$route.path;
  next()
}

keep-alive属性:

  1. include - 字符串或正则表达,只有匹配的组件会被缓存
  2. exclude - 字符串或正则表达式(不要随便加空格),任何匹配的组件都不会被缓存

TabBar练习

在组件里的

如果在js里就不用加@了。因为在style里,就要加@。但是子组件。。。。

样式:

.tab-bar{
  display: flex;
}
.tab-bar-item{
  flex: 1;
  text-align: center;
}

class="tab-bar"放在大div里,class="tab-bar-item"放在选项div。

flex布局(display)

position: fixed;布局位置,left和right都等于0是为了让tab-bar完全盖住页面

box-shadow:水平方向x 垂直方向y 模糊度 阴影的距离 颜色

image-20210711144532777

其中颜色:rgba(红,绿,蓝,透明度)。透明度用小数,0不用鞋,直接写.8

flex: 1表示项目等分

text-align: center;在自己的领域居中

一般来说,tab-bar高度为49px。

webpack.base配置

alias: {
  '@': resolve('src'),
  'assets': resolve('src/assets'),
  'components': resolve('src/components'),
  'views': resolve('src/views'),
}

alias

使用时

 src="~assets/img/tabbar/home.svg"
 import TabBar from '@/components/tabbar/TabBar'

总目录:
邂逅Vuejs
Vue基础语法
组件化开发
前端模块化
webpack详解
Vue CLI详解
vue-router
Promise的使用
Vuex详解
网络模块封装
项目实战

你可能感兴趣的:(Vue学习笔记——vue-router)