vue学习笔记(完结)

💕💕此笔记是狂神老师vue视频讲解笔记
下面直接是正文,目录一个在两侧中的一侧

vue

Vue 的核心库只关注视图层,方便与第三方库或既有项目整合。

什么是MVVM

MVVM (Model-View-ViewModel)源自于经典的MVC (ModI-View-Controller) 模式。MVVM的核心是ViewModel层,负责转换Model中的数据对象来让数据变得更容易管理和使用,其作用如下:

  • 该层向上与视图层进行双向数据绑定
  • 向下与Model层通过接口请求进行数据交互

img

MVVM已经相当成熟了,主要运用但不仅仅在网络应用程序开发中。当下流行的MVVM框架有Vue.js,Anfular JS

为什么要使用MVVM

MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model),有几大好处:

  • 低耦合:视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的View上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。

  • 可复用:你可以把一些视图逻辑放在一个ViewModel里面,让很多View重用这段视图逻辑。
    独立开发:开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计。

  • 可测试:界面素来是比较难于测试的,而现在测试可以针对ViewModel来写。
    img

  • Model : 模型层,在这里表示JavaScript对象

  • View : 视图层,在这里表示DOM (HTML操作的元素)

  • ViewModel : 连接视图和数据的中间件,Vue.js就是MVVM中的ViewModel层的实现者在MVVM架构中,是不允许数据和视图直接通信的,只能通过ViewModel来通信,而ViewModel就是定义了一个Observer观察者

  • ViewModel 能够观察到数据的变化,并对视图对应的内容进行更新

  • ViewModel 能够监听到视图的变化,并能够通知数据发生改变

Vue在线cdn

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>

Vue基本语法

v-bind

给组件绑定参数,简写 :

<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app">
    <span v-bind:title="message">鼠标悬停几秒钟查看此处动态绑定的提示信息!</span>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script>

    var vm = new Vue({
        el:"#app",
        data:{
            message:"hello,vue"
        }
    })
</script>
</body>
</html>

v-if、v-else-if

<!DOCTYPE html>
<html lang="en" xmlns:v-if="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app">
    <h1 v-if = "type ==='A'">A</h1>
    <h1 v-else-if = "type ==='B'">B</h1>
    <h1 v-else >a</h1>

</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script>

    var vm = new Vue({
        el:"#app",
        data:{
            type:'A'
        }
    })
</script>
</body>
</html>

v-for

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app">
    <li v-for="item in items">
        姓名:{{item.name}},年龄:{{item.age}}
    </li>
</div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script>

    var vm = new Vue({
        el:"#app",
        data:{
            items:[
                {name:"zz",age:1},
                {name:"xx",age:2},
                {name:"cc",age:3}
            ]
        }
    })
</script>

</html>

v-on

绑定事件,简写@

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<div id="app">
     <button v-on:click="sayHei">Cilck me</button>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script>

    var vm = new Vue({
        el:"#app",
        data:{
            message:"yayayaya"
        },
        methods:{
             sayHei: (function (event){
                 alert(this.message)
             })
        }
    })
</script>
</body>
</html>

Vue双向绑定 (v-model)

什么是双向绑定

Vue.js是一个MVVM框架,即数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化。这也算是Vue.js的精髓之处了。

在表单中使用双向数据绑定

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app">
    <select v-model="selected">
        <option value="" disabled>--请选择--</option>
        <option>1</option>
        <option>2</option>
        <option>3</option>
    </select>
    value:{{selected}}
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script>

    var vm = new Vue({
        el:"#app",
        data:{
            selected:""
        }
    })
</script>

</body>
</html>

Vue组件

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


<div id="app">
    <dun v-for="item in items" v-bind:wang="item" ></dun>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script>

    Vue.component("dun",{
        props:['wang'],
        template:'<li>{{wang}}</li>'
    })


    var vm = new Vue({
        el:"#app",
        data:{
            items:["linux","css","html"]
        }
    })
</script>

</body>
</html>

Axios异步通信

什么是Axios

Axios是一个开源的可以用在浏览器端和Node JS的异步通信框架, 她的主要作用就是实现AJAX异步通信,其功能特点如下:

  • 从浏览器中创建XMLHttpRequests

  • 从node.js创建http请求

  • 支持Promise API[JS中链式编程]

  • 拦截请求和响应

  • 转换请求数据和响应数据

  • 取消请求

  • 自动转换JSON数据

  • 客户端支持防御XSRF(跨站请求伪造)

  • GitHub:https://github.com/axios/axios
      中文文档:http://www.axios-js.com/

为什么要使用Axios

由于Vue.js是一个视图层框架并且作者(尤雨溪) 严格准守SoC(关注度分离原则)所以Vue.js并不包含AJAX的通信功能, 为了解决通信问题, 作者单独开发了一个名为vue-resource的插件, 不过在进入2.0版本以后停止了对该插件的维护并推荐了Axios框架。少用jQuery, 因为它操作Dom太频繁!

第一个Axios应用程序

咱们开发的接口大部分都是采用JSON格式, 可以先在项目里模拟一段JSON数据, 数据内容如下:创建一个名为data.json的文件并填入上面的内容, 放在项目的根目录下

{
  "name": "狂神说Java",
  "url": "https://blog.kuangstudy.com",
  "page": 1,
  "isNonProfit": true,
  "address": {
    "street": "含光门",
    "city": "陕西西安",
    "country": "中国"
  },
  "links": [
    {
      "name": "bilibili",
      "url": "https://space.bilibili.com/95256449"
    },
    {
      "name": "狂神说Java",
      "url": "https://blog.kuangstudy.com"
    },
    {
      "name": "百度",
      "url": "https://www.baidu.com/"
    }
  ]
}

测试代码

导入cdn:

 <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>

<div id="vue">
    <li>姓名:{{info.name}}</li>
    <li>链接:<a v-binf:href="info.url" target="_blank"> {{info.url}} </a> </li>
    <li>地址:{{info.address.country}}</li>
</div>

<script>
    var vue = new Vue({
        el:"#vue",
        //data:属性:vue
        data(){
           return {
               info:{
                   name:null,
                   url:null,
                   address:{
                       country:null,
                       city:null,
                       street:null
                   }
               }
           }
         },
        mounted(){//钩子函数

            axios.get("../data.json").then(response=>(this.info=response.data));
        }
    });

</script>
</body>
</html>

说明:

  1. 在这里使用了v-bind将a:href的属性值与Vue实例中的数据进行绑定
  2. 使用axios框架的get方法请求AJAX并自动将数据封装进了Vue实例的数据对象中
  3. 我们在data中的数据结构必须和Ajax响应回来的数据格式匹配!

Vue的生命周期

官方文档:https://cn.vuejs.org/v2/guide/instance.html#生命周期图示
  Vue实例有一个完整的生命周期,也就是从开始创建初始化数据、编译模板、挂载DOM、渲染一更新一渲染、卸载等一系列过程,我们称这是Vue的生命周期。通俗说就是Vue实例从创建到销毁的过程,就是生命周期。
  在Vue的整个生命周期中,它提供了一系列的事件,可以让我们在事件触发时注册JS方法,可以让我们用自己注册的JS方法控制整个大局,在这些事件响应方法中的this直接指向的是Vue的实例。

img

计算属性、内容分发、自定义事件

计算属性

计算属性的重点突出在属性两个字上(属性是名词),简单点说,它就是一个能够将计算结果缓存起来的属性(将行为转化成了静态的属性),仅此而已;可以想象为缓存!

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--view层,模板-->
<div id="app">
    <p>currentTime1:{{currentTime1()}}</p>
    <p>currentTime2:{{currentTime2}}</p>
</div>

<!--1.导入Vue.js-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script type="text/javascript">
    var vm = new Vue({
        el:"#app",
        data:{
          message:"pan"
        },
        methods:{
            currentTime1:function(){
                return Date.now();//返回一个时间戳
            }
        },
        computed:{
            currentTime2:function(){//计算属性:methods,computed方法名不能重名,重名之后,只会调用methods的方法
                this.message;
                return Date.now();//返回一个时间戳
            }
        }
    });
</script>
</body>
</html>

注意:methods,computed方法名不能重名,重名之后,只会调用methods的方法

说明:

  • methods:定义方法, 调用方法使用currentTime1(), 需要带括号
  • computed:定义计算属性, 调用属性使用currentTime2, 不需要带括号:this.message是为了能够让currentTime2观察到数据变化而变化
  • 如何在方法中的值发生了变化,则缓存就会刷新!可以在控制台使用vm.message=”q in jiang", 改变下数据的值,再次测试观察效果!
  • 结论:
  • 调用方法时,每次都需要讲行计算,既然有计算过程则必定产生系统开销,那如果这个结果是不经常变化的呢?此时就可以考虑将这个结果缓存起来,采用计算属性可以很方便的做到这点,计算属性的主要特性就是为了将不经常变化的计算结果进行缓存,以节约我们的系统开销;

内容分发 (slot插槽)

在Vue.js中我们使用 元素作为承载分发内容的出口,作者称其为插槽,可以应用在组合组件的场景中;

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
</head>
<body>
<div id="app">
    <todo>
        <todo-title slot="todo-title" v-bind:name="title"></todo-title>
        <todo-items slot="todo-items" v-for="item in todoItems" v-bind:item="item"></todo-items>
    </todo>
</div>

<!--1.导入vue.js-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script>
    //slot 插槽 这个组件要定义在前面不然出不来数据
    Vue.component("todo", {
        template: '<div>\
                <slot name="todo-title"></slot>\
                <ul>\
                <slot name="todo-items"></slot>\
                </ul>\
                <div>'
    });
    Vue.component("todo-title", {
        //属性
        props: ['name'],
        template: '<div>{{name}}</div>'
    });
    Vue.component("todo-items", {
        props: ['item'],
        template: '<li>{{item}}</li>'
    });
    let vm = new Vue({
        el: "#app",
        data: {
            //标题
            title: "图书馆系列图书",
            //列表
            todoItems: ['三国演义', '红楼梦', '西游记', '水浒传']
        }
    });
</script>
</body>
</html>

自定义事件内容分发

通以上代码不难发现,数据项在Vue的实例中, 但删除操作要在组件中完成, 那么组件如何才能删除Vue实例中的数据呢?此时就涉及到参数传递与事件分发了, Vue为我们提供了自定义事件的功能很好的帮助我们解决了这个问题;

使用this.$emit(‘自定义事件名’, 参数) , 操作过程如下:

img

第一个vue-cli项目

什么是vue-cli

vue-cli 官方提供的一个脚手架,用于快速生成一个 vue 的项目模板;

预先定义好的目录结构及基础代码,就好比咱们在创建 Maven 项目时可以选择创建一个骨架项目,这个骨架项目就是脚手架,我们的开发更加的快速;

主要功能:

  • 统一的目录结构
  • 本地调试
  • 热部署
  • 单元测试
  • 集成打包上线

需要的环境

  • Node.js : http://nodejs.cn/download/

    安装就无脑下一步就好,安装在自己的环境目录下

  • Git : https://git-scm.com/downloads
    镜像:https://npm.taobao.org/mirrors/git-for-windows/

确认nodejs安装成功

  • cmd 下输入 node -v,查看是否能够正确打印出版本号即可!
  • cmd 下输入 npm-v,查看是否能够正确打印出版本号即可!1

淘宝镜像加速器(cnpm)

这样子的话,下载会快很多~

# -g 就是全局安装
npm install cnpm -g

# 若安装失败,则将源npm源换成淘宝镜像
# 因为npm安装插件是从国外服务器下载,受网络影响大
npm config set registry https://registry.npm.taobao.org

# 然后再执行
npm install cnpm -g

安装的位置:C:\Users\Administrator\AppData\Roaming\npm

第一个 vue-cli 应用程序

创建一个Vue项目,创建在自己平时放idea代码的文件夹里面即可。

创建一个基于 webpack 模板的 vue 应用程序

# 这里的 myvue 是项目名称,可以根据自己的需求起名
vue init webpack myvue

一路都选择no即可,这样就可以自己安装,感受一下

初始化并运行

cd myvue
npm install
npm run dev

执行完成后,目录多了很多依赖

Webpack

WebPack 是一款模块加载器兼打包工具,它能把各种资源,如 JS、JSX、ES6、SASS、LESS、图片等都作为模块来处理和使用。

npm install webpack -g
npm install webpack-cli -g

测试安装成功: 输入以下命令有版本号输出即为安装成功

webpack -v
webpack-cli -v

使用Webpack

  1. 在平时放idea文件的文件加下创建:webpack-study文件, 用idea打开 会生成一个.idea文件 那么就说明该文件就交由idea负责

  2. 在项目下创建modules文件,再创建hello.js

    //暴露一个方法
    exports.sayHi = function () {
        document.write("<h1>狂神说ES6</h1>>")
    }
    
  3. 在项目下创建modules文件,再创建main.js

    //当作是js主入口 , main.js 请求hello.js 调用sayHi()方法
    var hello = require("./hello");
    hello.sayHi()
    
  4. 在主目录创建webpack.config.js

    //webpack-config.js 这个相当于webpack的配置文件
    //enrty请求main.js的文件
    //output是输出的位置和名字
    module.exports = {
        entry: './modules/main.js',
        output: {
            filename: './js/bundle.js'
        }
    }
    
  5. 在idea命令台输入webpack命令(idea要设置管理员启动)

  6. 完成上述操作之后会在主目录生成一个dist文件 生成的js文件夹路径为/ dist/js/bundle.js

  7. 在主目录创建index.html ,在里面导入bundle.js,然后就可以看见

    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="dist/js/bundle.js"></script>
    </head>
    <body>
    </body>
    </html>
    

    在这里插入图片描述

    文件目录,可以参照

    在这里插入图片描述

vue-router路由

vue-router是一个插件包,首页我们需要员工nmp/cnmp进行安装,但是版本很重要,看看自己的myvue项目中package.json中的vue-router是什么版本就安装什么版本,我的是"vue-router": "^3.1.3"

所以我的安装命令为:

npm install vue-router@3.1.3 --save-dev

安装完之后去node_modules路径看看是否有vue-router信息 有的话则表明安装成功。

vue-router demo实例

  1. 将前面创建的myvue打开

  2. 找到src文件夹下面的asserts和components,分别删除里面内容,删除完后这两个文件夹下面为空

  3. 在components文件夹下面创建,Content.vue

    <template>
       <div>
            <h1>内容页</h1>
       </div>
    </template>
    
    <script>
    export default {
      name: "Content"
    }
    </script>
    
  4. 在components文件夹下面创建,Main.vue

    <template>
       <div>
           <h1>首页</h1>
       </div>
    </template>
    
    <script>
    export default {
      name: "Main"
    }
    </script>
    
  5. 在src文件夹下面,创建router文件夹,然后在里面创建index.js

    import Vue from 'vue'
    //导入路由插件
    import Router from 'vue-router'
    //导入上面定义的组件
    import Content from '../components/Content'
    import Main from "../components/Main";
    
    //安装路由
    Vue.use(Router);
    
    //配置路由
    export default new Router({
      routes:[
        {
          //路由路径
          path:'/content',
          //路由名称
          name:Content,
          //跳转到组件
          component:Content
        },
        {
          //路由路径
          path:'/main',
          //路由名称
          name:Main,
          //跳转到组件
          component:Main
        }
      ]
    })
    
    
  6. 修改src文件夹下面mian.js

    import Vue from 'vue'
    import App from './App'
    
    //导入创建的路由配置
    import router from './router'
    
    Vue.config.productionTip = false;
    
    new Vue({
      el: '#app',
      router,
      components: { App },
      template: '<App/>'
    })
    
  7. 修改src文件夹下面App.vue

    <template>
      <div id="app">
        <!--
                router-link:默认会被渲染成一个<a>标签,to属性为指定链接
                router-view:用于渲染路由匹配到的组件
            -->
        <h1>Vue-Router</h1>
        <router-link to="/main">首页</router-link>
        <router-link to="/content">内容</router-link>
        <router-view></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>
    
  8. 然后在idea的下面,点击Terminal输入npm run dev,首先要保证idea以管理员身份运行

    在这里插入图片描述

  9. 运行成功后,会出现一个地址,去网站即可查看

在这里插入图片描述

  1. 结果

    在这里插入图片描述

vue + ElementUI

  1. 到平时放vue项目的文件夹下面,cmd,然后创建项目

    vue init webpack hello-vue
    
  2. 安装依赖

    # 进入工程目录
    cd hello-vue
    
    # 安装 vue-router
    npm install vue-router@3.1.3 --save-dev
    
    # 安装 element-ui
    npm i element-ui -S
    
    # 安装依赖
    npm install
    
    # 安装 SASS 加载器
    cnpm install sass-loader@7.3.1 sass@1.26.5 --save-dev
    # 启动测试
    npm run dev	
    
  3. 在idea中打开刚刚创建的hello-vue项目

  4. 找到src文件夹下面的asserts和components,分别删除里面内容,删除完后这两个文件夹下面为空

  5. 在src目录下创建views文件夹,创建Main.vue

    <template>
       <h1>首页</h1>
    </template>
    
    <script>
    export default {
      name: "Main"
    }
    </script>
    
    <style scoped>
    
    </style>
    
  6. 在views中创建Login.vue视图组件

    <template>
      <div>
        <el-form ref="loginForm" :model="form" :rules="rules" label-width="80px" class="login-box">
          <h3 class="login-title">欢迎登录</h3>
          <el-form-item label="账号" prop="username">
            <el-input type="text" placeholder="请输入账号" v-model="form.username"/>
          </el-form-item>
          <el-form-item label="密码" prop="password">
            <el-input type="password" placeholder="请输入密码" v-model="form.password"/>
          </el-form-item>
          <el-form-item>
            <el-button type="primary" v-on:click="onSubmit('loginForm')">登录</el-button>
          </el-form-item>
        </el-form>
    
        <el-dialog
          title="温馨提示"
          :visible.sync="dialogVisible"
          width="30%"
          :before-close="handleClose">
          <span>请输入账号和密码</span>
          <span slot="footer" class="dialog-footer">
            <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
          </span>
        </el-dialog>
      </div>
    </template>
    
    <script>
    export default {
      name: "Login",
      data() {
        return {
          form: {
            username: '',
            password: ''
          },
    
          // 表单验证,需要在 el-form-item 元素中增加 prop 属性
          rules: {
            username: [
              {required: true, message: '账号不可为空', trigger: 'blur'}
            ],
            password: [
              {required: true, message: '密码不可为空', trigger: 'blur'}
            ]
          },
    
          // 对话框显示和隐藏
          dialogVisible: false
        }
      },
      methods: {
        onSubmit(formName) {
          // 为表单绑定验证功能
          this.$refs[formName].validate((valid) => {
            if (valid) {
              // 使用 vue-router 路由到指定页面,该方式称之为编程式导航
              this.$router.push("/main");
            } else {
              this.dialogVisible = true;
              return false;
            }
          });
        }
      }
    }
    </script>
    
    <style lang="scss" scoped>
    .login-box {
      border: 1px solid #DCDFE6;
      width: 350px;
      margin: 180px auto;
      padding: 35px 35px 15px 35px;
      border-radius: 5px;
      -webkit-border-radius: 5px;
      -moz-border-radius: 5px;
      box-shadow: 0 0 25px #909399;
    }
    
    .login-title {
      text-align: center;
      margin: 0 auto 40px auto;
      color: #303133;
    }
    </style>
    
  7. 在src下创建: router

    在router目录下创建一个名为 index.js 的 vue-router 路由配置文件

    import Vue from 'vue';
    import Router from 'vue-router';
    import Main from "../views/Main";
    import Login from "../views/Login";
    
    Vue.use(Router);
    
    
    export default new Router({
      routes:[
        {
          path:'/main',
          component:Main
        },
        {
          path:'/login',
          component:Login
        }
      ]
    })
    
  8. 修改src目录下的main.js

    import Vue from 'vue'
    import App from './App'
    //扫描路由配置
    import router from './router'
    //导入elementUI
    import ElementUI from "element-ui"
    //导入element css
    import 'element-ui/lib/theme-chalk/index.css'
    
    
    Vue.use(router);
    Vue.use(ElementUI);
    new Vue({
      el: '#app',
      router,
      render: h => h(App),//ElementUI规定这样使用
    })
    
  9. 在App.vue中配置显示视图

    <template>
      <div id="app">
        <router-link to="/login">login</router-link>
        <router-view></router-view>
      </div>
    </template>
    
    <script>
    
    export default {
      name: 'App',
    }
    </script>
    
  10. 测试运行

    npm run dev
    

    在这里插入图片描述

路由嵌套

嵌套路由又称子路由,在实际应用中,通常由多层嵌套的组件组合而成。

实例

  1. 创建用户信息组件,在 views/user 目录下创建 Profile.vue 的视图组件;

    <template>
      <h1>个人信息</h1>
    </template>
    <script>
      export default {
        name: "UserProfile"
      }
    </script>
    <style scoped>
    </style>
    
  2. 在用户列表组件在 views/user 目录下创建List.vue 的视图组件;

    <template>
      <h1>用户列表</h1>
    </template>
    <script>
      export default {
        name: "UserList"
      }
    </script>
    <style scoped>
    </style>
    
  3. 修改首页视图,我们修改 Main.vue 视图组件,此处使用了 ElementUI 布局容器组件,代码如下:

    <template>
      <div>
        <el-container>
          <el-aside width="200px">
            <el-menu :default-openeds="['1']">
              <el-submenu index="1">
                <template slot="title"><i class="el-icon-caret-right"></i>用户管理</template>
                <el-menu-item-group>
                  <el-menu-item index="1-1">
                    <!--插入的地方-->
                    <router-link to="/user/profile">个人信息</router-link>
                  </el-menu-item>
                  <el-menu-item index="1-2">
                    <!--插入的地方-->
                    <router-link to="/user/list">用户列表</router-link>
                  </el-menu-item>
                </el-menu-item-group>
              </el-submenu>
              <el-submenu index="2">
                <template slot="title"><i class="el-icon-caret-right"></i>内容管理</template>
                <el-menu-item-group>
                  <el-menu-item index="2-1">分类管理</el-menu-item>
                  <el-menu-item index="2-2">内容列表</el-menu-item>
                </el-menu-item-group>
              </el-submenu>
            </el-menu>
          </el-aside>
    
          <el-container>
            <el-header style="text-align: right; font-size: 12px">
              <el-dropdown>
                <i class="el-icon-setting" style="margin-right: 15px"></i>
                <el-dropdown-menu slot="dropdown">
                  <el-dropdown-item>个人信息</el-dropdown-item>
                  <el-dropdown-item>退出登录</el-dropdown-item>
                </el-dropdown-menu>
              </el-dropdown>
            </el-header>
            <el-main>
              <!--在这里展示视图-->
              <router-view />
            </el-main>
          </el-container>
        </el-container>
      </div>
    </template>
    <script>
      export default {
        name: "Main"
      }
    </script>
    <style scoped lang="scss">
      .el-header {
        background-color: #B3C0D1;
        color: #333;
        line-height: 60px;
      }
      .el-aside {
        color: #333;
      }
    </style>
    
  4. 配置嵌套路由修改 router 目录下的 index.js 路由配置文件,使用children放入main中写入子模块,代码如下

    import Vue from 'vue';
    import Router from 'vue-router';
    import Main from "../views/Main";
    import Login from "../views/Login";
    import UserProfile from "../views/user/Profile";
    import UserList from "../views/user/List";
    
    Vue.use(Router);
    
    
    export default new Router({
      routes:[
        {
          path:'/main',
          component:Main,
          children:[
            {path:'/user/profile',component:UserProfile},
            {path:'/user/list',component:UserList}
          ]
        },
        {
          path:'/login',
          component:Login
        }
      ]
    })
    
  5. 路由嵌套效果图

在这里插入图片描述

参数传递

用的还是上述例子的代码 修改一些代码 这里不放重复的代码了

第一种取值方式

  1. 修改路由配置, 主要是router下的index.js中的Main的 path 属性中增加了 :id 这样的占位符
{
    path: '/user/profile/:id', 
    name:'UserProfile', 
    component: UserProfile
}
  1. 传递参数

    此时我们在Main.vue中的route-link位置处 to 改为了 :to,是为了将这一属性当成对象使用,注意 router-link 中的 name 属性名称 一定要和 路由中的 name 属性名称 匹配,因为这样 Vue 才能找到对应的路由路径;

    <!--name是组件的名字 params是传的参数 如果要传参数的话就需要用v:bind:来绑定-->
    <router-link :to="{name:'UserProfile',params:{id:1}}">个人信息</router-link>
    
  2. 在要展示的组件Profile.vue中接收参数 使用 {{$route.params.id}}来接收Profile.vue 部分代码

    <template>
    <!--  所有的元素必须在根节点下,否则报错-->
      <div>
        <h1>个人信息</h1>
        {{ $route.params.id }}
      </div>
    </template>
    

第二种取值方式

使用props 减少耦合

  1. 修改路由配置 , 主要在router下的index.js中的路由属性中增加了 props: true 属性

    {
        path: '/user/profile/:id', 
        name:'UserProfile', 
        component: UserProfile, 
        props: true
    }
    
  2. 传递参数和之前一样 在Main.vue中修改route-link地址

    <!--name是组件的名字 params是传的参数 如果要传参数的话就需要用v:bind:来绑定-->
    <router-link :to="{name:'UserProfile',params:{id:1}}">个人信息</router-link>
    
  3. 在Profile.vue接收参数为目标组件增加 props 属性Profile.vue

    <template>
      <div>
        个人信息
        {{ id }}
      </div>
    </template>
    <script>
        export default {
          props: ['id'],
          name: "UserProfile"
        }
    </script>
    <style scoped>
    </style>
    

重定向组件

Vue 中的重定向是作用在路径不同但组件相同的情况下,比如:在router下面index.js的配置

{
  path: '/main',
  name: 'Main',
  component: Main
},
{
  path: '/goHome',
  redirect: '/main'
}

说明:这里定义了两个路径,一个是 /main ,一个是 /goHome,其中 /goHome 重定向到了 /main 路径,由此可以看出重定向不需要定义组件;

使用的话,只需要在Main.vue设置对应路径即可

<el-menu-item index="1-3">
    <router-link to="/goHome">回到首页</router-link>
</el-menu-item>

路由模式与 404

路由模式有两种

  • hash:路径带 # 符号,如 http://localhost/#/login
  • history:路径不带 # 符号,如 http://localhost/login

修改路由配置,index.js下增加代码如下:

export default new Router({
  mode: 'history',
  ......
});

404 demo

  1. 在view下创建一个NotFound.vue视图组件

    <template>
        <div>
          <h1>404,你的页面走丢了</h1>
        </div>
    </template>
    <script>
        export default {
            name: "NotFound"
        }
    </script>
    <style scoped>
    </style>
    
  2. 修改路由配置index.js

    1. import NotFound from '../views/NotFound'
    
    2.
     {
          path: '*',
          component: NotFound
       }
    
  3. 效果图

    img

路由钩子与异步请求

beforeRouteEnter:在进入路由前执行
beforeRouteLeave:在离开路由前执行

在Profile.vue中写

export default {
    name: "UserProfile",
    beforeRouteEnter: (to, from, next) => {
      console.log("准备进入个人信息页");
      next();
    },
    beforeRouteLeave: (to, from, next) => {
      console.log("准备离开个人信息页");
      next();
    }
  }

参数说明:
to:路由将要跳转的路径信息
from:路径跳转前的路径信息
next:路由的控制参数
next() 跳入下一个页面
next(’/path’) 改变路由的跳转方向,使其跳到另一个路由
next(false) 返回原来的页面
next((vm)=>{}) 仅在 beforeRouteEnter 中可用,vm 是组件实例

在钩子函数中使用异步请求

1、安装 Axios

cnpm install --save vue-axios

到后面运行的时候可能会出错,然后再运行

npm install --save axios

2、main.js引用 Axios

import axios from 'axios'
import VueAxios from 'vue-axios'
Vue.use(VueAxios, axios)

3、准备数据 : 只有我们的 static 目录下的文件是可以被访问到的,所以我们就把静态文件放入该目录下。

在static下创建:mock文件夹,然后再创建data.json,该数据上面axios中有。

4.在 beforeRouteEnter 中进行异步请求
Profile.vue

  export default {
    //第二种取值方式
    // props:['id'],
    name: "UserProfile",
    //钩子函数 过滤器
    beforeRouteEnter: (to, from, next) => {
      //加载数据
      console.log("进入路由之前")
      next(vm => {
        //进入路由之前执行getData方法
        vm.getData()
      });
    },
    beforeRouteLeave: (to, from, next) => {
      console.log("离开路由之前")
      next();
    },
    //axios
    methods: {
      getData: function () {
        this.axios({
          method: 'get',
          url: 'http://localhost:8080/static/mock/data.json'
        }).then(function (response) {
          console.log(response)
        })
      }
    }
  }

5.路由钩子和axios结合图
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小墩墩~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值