【Vue】Re14 Router 第一部分(入门案例)

一、箭头函数(Lambda匿名函数)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script type="text/javascript">

    /* 创建函数一 */
    const aaa = function () {
        // todo ....
    };

    const object = {
        /* 创建函数二 */
        bbb : function () {
            // todo ...
        },

        /* 创建函数三 */
        ccc () {
            // todo ...
        }
    };

    /* 创建函数四 */
    const ddd = () => {
        // todo ...
    };

    /**
     * 箭头函数可理解为Lambda表达式,亦可称为匿名表达式,或者匿名函数
     * 函数不再具有名称,只留下参数和函数逻辑,
     * 可以调用和声明一体式编写
     *
     * 语法Syntax
     * const fun = (参数列表) => {
     *     // todo ...
     * }
     *
     * 无参箭头函数
     * const fun2 = () => { // todo ... }
     *
     * 一个参数
     * const fun2 = (param) => { // todo ... with param }
     * 可以缩写,不需要括号
     * const fun2 = param => { // todo ... with param }
     *
     * 多参数
     * const fun2 = (param1, param2) => { // todo ... with params }
     *
     *
     * 如果函数逻辑只有一行语句,可以不需要大括号
     * 一行语句
     * const oneLine = (n1, n2) => {
     *     return n1 + n2 ;
     * }
     * 直接缩写成
     * const oneLine = (n1, n2) => n1 + n2 ; // 省略函数体与return关键字
     */

     // 箭头函数与this关键字的问题
     const object2 = {
        method1 () {
            setTimeout(function () {
                console.log(this); // 这个this是window对象
            }, 1000);
            setTimeout(() => console.log(this), 1000); // 这个this是这个object2对象
        }
     }
     object2.method1();
     // 结论:箭头函数会向外层作用域中一层层查找this,直到This定义并引用this对象【也就是查找最近的this对象】
</script>
</body>
</html>

二、创建案例环境

先使用Vue2方式进行创建:

三、路由概述

路由更像是音译过来的词语 Routing

维基百科给出的解释是:

通过互联网把信息从源地址传输的目的地址的活动

生活概念:路由器

两种机制:路由和转送

路由决定数据包从来源到目的地的路径

转送将输入端的数据转移到合适的输出端

路由表的概念

本质是一个映射表,决定了数据包的指向

四、前端渲染 & 后端渲染

1、网页发展阶段历史:

第一阶段:后端渲染
jsp\php\asp\
html + css + javascript
页面跳转由后端的控制器实现

第二阶段:前后端分离
ajax 技术实现
数据转API传输,维护方便
还是多个页面组成处理

第三阶段:SPA
单页面应用

详细说明:

https://www.bilibili.com/video/BV15741177Eh?p=100

2、URL的Hash & H5的History

首先运行之前创建的案例项目

npm run dev

我们清空浏览器的请求资源再次更改会发现,网页只更新了favicon.icon

其他资源不发生请求,但是URL地址发生了变化

使用HTML5的History对象操作也是一样可以的

pushState是类似压栈的形式操作url

可以使用back回退上一个url,push和back相当于压栈和弹栈的关系

也可以使用fowward

但是使用replaceState跳转,是无法回退的

如果不希望一个一个的回退,可以使用go回退指定索引的url

五、Vue - Router

安装

之前已经在创建案例项目时勾选了router安装,

如果没有也没关系,使用命令进行手动安装

npm install vue-router --save

使用

1、导入路由,调用Vue.use注入
2、创建路由实例,传入映射配置
3、在实例中挂在路由实例

目录

这个router目录就是创建项目时自动生成的

里面的index.js文件:

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld
    }
  ]
})

path表示url路径

name表示路由名称

component表示挂载的组件

不过我们一般的写法会进行拆分解耦,这样解析步骤:

/* 1、 首先引用Vue依赖 */
import Vue from "vue/types/vue";
/* 2、 然后是VueRouter */
import VueRouter from "vue-router";

/* 3、 调用Vue.use方法注册VueRouter */
Vue.use(VueRouter);

/* 4、配置需要的路由映射 */
const routerList = [
  /* 配置映射关系 url -> component */
]

/* 5、创建VueRouter实例 */
const router = new VueRouter({
  routes : routerList
});

/* 6、把此router实例挂载到Vue实例中,所以需要导出 */
export default router;

配置映射关系:

第一个案例项目就作为模板保留

创建第二个案例项目,把router目录的index.js文件换成上面的内容【router/index.js】

import Vue from 'vue';
import Router from 'vue-router';

Vue.use(Router);

const routerList = [

]
const router = new Router({
  routes : routerList
});
export default router;

移除components的Helloworld.vue组件文件

移除App.vue的标签:

<template>
  <div id="app">
    <img src="./assets/logo.png">
    <router-view/>
  </div>
</template>

<script>
export default {
  name: 'App'
}
</script>

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

创建Home组件

<template>
  <div>
    <h3>这是首页Home组件</h3>
    <p>首页Home组件的内容</p>
  </div>
</template>

<script>
export default {
  name: "Home"
}
</script>

<style scoped>

</style>

创建About组件

<template>
  <div>
    <h3>这是关于About组件</h3>
    <p>关于About组件的内容</p>
  </div>
</template>

<script>
export default {
  name: "About"
}
</script>

<style scoped>

</style>

配置路由:

import Vue from 'vue';
import Router from 'vue-router';
import Home from "../components/Home";
import About from "../components/About";

Vue.use(Router);

const routerList = [
  {
    path : '/home', /* 为什么这里是path不是url? 因为完整的url还包括 项目根url(协议头 + 域名(或者IP地址) + 端口号 + 项目根名称路径(可选))  */
    name : 'home', /* 名字可以不加 */
    component : Home
  },
  {
    path : '/about',
    name : 'about',
    component : About
  },
]
const router = new Router({
  routes : routerList
});
export default router;

App.vue配置路由标签

<template>
  <div id="app">
    <router-link to="/home">去首页</router-link>
    <router-link to="/about">去关于</router-link>
  </div>
</template>

<script>
export default {
  name: 'App'
}
</script>

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

运行预览后可以发现其实link标签就是a标签

但是为什么没有显示出来,原因是因为我们还没写view标签

<template>
  <div id="app">
    <router-link to="/home">去首页</router-link>
    <router-link to="/about">去关于</router-link>
    <router-view></router-view>
  </div>
</template>

上面的URL地址可以看到是

#/home

这种#加路径就是hash的路由方式

 

posted @ 2020-11-01 13:07  emdzz  阅读(115)  评论(0编辑  收藏  举报