Vue初识

Vue初识

什么是Vue

在这里插入图片描述

小结

  1. Vue是一个渐进式的JavaScript框架
  2. Vue核心关注视图层
  3. Vue是一个MVVM模式的前端框架
渐进式
  1. 笔者理解的“渐进式框架”也非常简单,就是用你想用或者能用的功能特性,你不想用的部分功能可以先不用。VUE不强求你一次性接受并使用它的全部功能特性。
  2. 场景一:公司刚开始一个项目,技术人员对Vue的掌握也不足够。那么我们就不能使用VUE了么?当然不是,如果你只是使用VUE做些基础操作,如:页面渲染、表单处理提交功能,那还是非常简单的,成熟技术人员上手也就一两天。完全可以用它去代替jquery。并不需要你去引入其他复杂特性功能。
  3. 场景二:我们的项目规模逐渐的变大了,我们可能会逐渐用到前端路由、状态集中管理、并最终实现一个高度工程化的前端项目。这些功能特性我们可以逐步引入,当然不用也可以。
MVVM

MVVM是Model-View-ViewModel的缩写。MVVM是一种设计思想。

  1. View层是视图层,也就是用户界面。前端主要由HTML和CSS来构建;
  2. Model层 是指数据模型,泛指后端进行的各种业务逻辑处理和数据操控,对于前端来说就是后端的提供的API接口;
  3. ViewModel层是视图数据层,一个同步View和Model的对象。也就是之后Vue对象进行操作的地方
  4. 在MVVM架构下,View和Model之间并没有直接的联系,而是通过ViewModel进行交互,Model和ViewModel之间的交互是双向的,因此View数据的变化会同步到Model中,而Model数据的变化也会立即反应到View上。

第一个Vue程序

首先使用JavaScript技术都需要导入JavaScript的js文件

所以使用Vue也是同样要导入Vue的文件

导入方式可以是

  1. 直接导入文件
  2. 使用连接路径的形式
  3. 可以使用Vue-cli脚手架直接进行创建Vue的项目工程类似于后端的Maven技术
Vue.js分类
  1. 开发版本:包含完整的警告和调试模式
  2. 生产版本:删除了警告,体积更小

Vue对象

引入Vue.js文件之后可以在

<!DOCTYPE html>
<html lang="en">
<!--在HTML中引入Vue.js文件-->
<!--因为都是JavaScript所以操作类似-->
<script type="text/javascript" src="js/vue.js"></script>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<!--创建一个标签,使用id进行标识-->
<!--下面可以使用Vue对象进行指定-->
<div id="app">
    {{msg}}
</div>

</body>
</html>
<script type="text/javascript">

    // 创建Vue对象
    const vue = new Vue({
        el: "#app",
        data: {"msg":"HelloWord"}
    })
</script>

在这里插入图片描述

发现我们在

这里使用了const,当然我们还可以使用var,let创建,说一说创建对象的区别

var,let,const创建对象区别

在ES6(ES2015)出现之前,JavaScript中声明变量就只有通过 var 关键字,函数声明是通过 function 关键字,而在ES6之后,声明的方式有 var 、 let 、 const 、 function 、 class

具体可以自行了解一下

Vue对象

看到上面创建了Vue对象,还是用了Vue对象中的一些属性,下面介绍属性

el

用来指定Vue对象操作的对应HTML标签。

指定之后,Vue的操作指定在该范围中使用

<!--创建一个标签,使用id进行标识-->
<!--下面可以使用Vue对象进行指定-->
<div id="app">
    {{msg}}
</div>

{{msg}}

在这里插入图片描述

$mount
  • 作用和el一致,都是配置控制的元素,使用哪个都可以,二选一

      <div id="app"></div>
    1
    
      const vm = new Vue({})
      vm.$mount('#app');
    
data

存放要用到的数据,数据为响应式的

前面说过MVVM,这里我们可以发现在data中的数据可以通过 {{}} 插值表达式 显示在页面上,vm,指的就是Vue对象的操作

我们可以通过 {{}} 插值表达式 进行将data中存放的数据展示出来

{{}}插值表达式

除了填写data之外,还可以直接填写数据值(数字、字符串、布尔值、undefined、null、数组、对象)

<!--创建一个标签,使用id进行标识-->
<!--下面可以使用Vue对象进行指定-->
<div id="app">
    {{msg}}

    <!-- 运算表达式 -->
    {{ 'you' + 'me' }}
    {{ 10 - 5 }}
    {{ 100 * 7 }}
    {{ 1000 / 12 }}
    <!-- 逻辑表达式 -->
    {{ liu || li }}
    {{ deng && liu }}
    {{ !wang }}
    <!-- 三元表达式 -->
    {{ 1 + 1 === 3 ? '邓旭明' : '正常人' }}
    <!-- 函数调用也是表达式,也可以使用,这个以后再学哈... -->


</div>
{{msg}}

在这里插入图片描述

computed

计算属性,与methods类似都是放置方法执行,但是不同的是

methods每次都会进行调用,从而得到返回值

computed,如果没有改变值的情况下,内部的不会进行调用,直接返回原来的返回值,减少消耗

methods

将我们编写的函数写在这里,可以进行调用

<!DOCTYPE html>
<html lang="en">
<!--在HTML中引入Vue.js文件-->
<!--因为都是JavaScript所以操作类似-->
<script type="text/javascript" src="js/vue.js"></script>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<!--创建一个标签,使用id进行标识-->
<!--下面可以使用Vue对象进行指定-->
<div id="app">
   <button v-on:click="bkone()">点我</button>
</div>

</body>
</html>
<script type="text/javascript">

    // 创建Vue对象
    const vue = new Vue({
        el: "#app",
        data: {"msg":"HelloWord"},
        // 该属性将写方法,可以进行调用
        methods:{

            bkone(){
                alert("bkone");
            }

        }
    })
</script>

在这里插入图片描述

这里发现我们绑定方法使用Vue的指令,现在进行Vue的指令学习

Vue相关指令

  • 具有特殊含义、拥有特殊功能的特性
  • 指令带有v-前缀,表示它们是Vue提供的特殊特性
  • 指令可以直接使用data中的数据
v-text

更新元素的 textContent

<span v-text="msg"></span>
<!-- 和下面的一样 -->
<span>{{msg}}</span>

v-text替换元素中所有的文本,Mustache只替换自己,不清空元素内容

<!-- 渲染为:<span>杉杉最美</span> -->
<span v-text="msg">----</span>
<!-- 渲染为:<span>----杉杉最美----</span> -->
<span>----{{msg}}----</span>

条件渲染相关指令

v-if

和java中if判断一样,如果条件为真,显示指定标签,为假不显示

<div id="app">

    <span v-if="true" >BkTwo 1</span>
    <span v-if="false" >BkTwo 2</span>
</div>

<script type="text/javascript">
    const vue = new Vue({
        el: "#app",
        data: {
        }
    })
</script>

在这里插入图片描述

v-else
  • 为 v-if 或者 v-else-if 添加“else 块”。
  • 注意:前一兄弟元素必须有 v-if 或 v-else-if
<div id="app">

    <span v-if="true" >BkTwo 1</span>
    <span v-else>BkTwo 1-1</span>

    <span v-if="false" >BkTwo 2</span>
    <span v-else>BkTwo 2-2</span>
</div>

<script type="text/javascript">
    const vue = new Vue({
        el: "#app",
        data: {
        }
    })
</script>

在这里插入图片描述

v-else-if
  • 表示 v-if 的 “else if 块”。可以链式调用。
  • 注意:前一兄弟元素必须有 v-if 或 v-else-if
v-show
  • 根据表达式之真假值,切换元素的 display CSS 属性。

  • 与v-if一样都可以隐藏指定的元素

    <h1 v-show="true">Hello!</h1>
    
v-if VS v-show

v-if 是惰性的,如果在初始渲染时条件为假,则什么也不做,直到条件第一次变为真时,才会开始渲染条件块。v-show则不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。
v-if 有更高的切换开销,v-show 有更高的初始渲染开销,如果需要非常频繁地切换,则使用 v-show 较好,如果在运行时条件很少改变,则使用 v-if 较好
v-show不支持元素
v-show不支持v-else/v-else-if

v-bind 指令
  • 动态地绑定一个或多个属性
  • : 简写方式
<div id="app">
    <input v-bind:type="inputBk" value="点我1" >
    <input :type="inputBk" value="点我2" >
</div>

<script type="text/javascript">
    const vue = new Vue({
        el: "#app",
        data: {
            "inputBk":"button"
        }
    })
</script>

在这里插入图片描述

v-on
  1. 动态绑定事件
  2. @ 简写
<div id="app">

    <button v-on:click="show(1)" >点我1</button>
    <button @click="show(2)">点我2</button>
</div>

<script type="text/javascript">
    const vue = new Vue({
        el: "#app",
        data: {},
        methods:{
            show(msg){
                alert(msg)
            }

        }
    })
</script>

在这里插入图片描述

v-for

类似java中的forEach循环

<div id="app">
    <ul>
        <li v-for="(item,index) in array" >{{item}}</li>
    </ul>
</div>

<script type="text/javascript">
    const vue = new Vue({
        el: "#app",
        data: {
            "array":["123","234","345"]
        }
    })
</script>

在这里插入图片描述

v-model指令

可以在表单元素上创建双向数据绑定。即数据更新元素更新、元素更新数据也会更新。


<div id="app">
    <input v-model="msg" >{{msg}}
</div>

<script type="text/javascript">
    const vue = new Vue({
        el: "#app",
        data: {
            msg:""
        }
    })
</script>

在这里插入图片描述

双向数据绑定,两边任何数据改变,两边都会产生影响

组件开发

在上面我们了解了Vue的基本使用,下面一起来学习Vue的组件开发

组件是什么?

组件是可复用的Vue实例

将一部分内容设置为组件,类似于自定义标签,在需要的地方引入即可

小示例

这个示例演示的是局部组件

<!--创建Vue对象绑定的区域-->
<div id="app">
    <one></one>
</div>

<!--设定的组件指定内容-->
<template id="oneTemp">
    <div>
        {{msg}}
    </div>
</template>

<script type="text/javascript">
    const vue = new Vue({
        el: "#app",
        data: {},
        // componets指定组件的标签,组件的内容,数据
        components: {
            "one": {
                template: "#oneTemp",
                data: function () {
                    return {
                        'msg': "我是OneTemp"
                    }
                }
            }
        }
    })
</script>

在这里插入图片描述

通过上面示例发现,我们将一部分内容放在标签中

在使用Vue对象进行指定组件,设定名字,可以通过自定义标签进行指定

组件中还可以设置数据,等信息。组件可以重复利用

注意
  1. 标签下存在

    标签

  2. 组件中指定的data的格式是方法的返回值

组件开发分为

局部组件

上面示例中展示的是局部组件

全局组件
<!--创建Vue对象绑定的区域-->
<div id="app">
    <one></one>
    <two></two>
</div>

<!--设定的组件指定内容-->
<template id="oneTemp">
    <div>
        {{msg}}
    </div>
</template>

<template id="twoTemp">
    <div>
        {{msg}}
    </div>
</template>

<script type="text/javascript">

    // 通过Vue.component设置全局组件
    // 全局组件可以在所有的Vue对象中使用
    Vue.component("two",{
        template: "#twoTemp",
        data:function () {
           return {
               msg:"我是全局组件"
           }
        }
    })

    // 局部组件只能出现在创建该组件的Vue对象中
    const vue = new Vue({
        el: "#app",
        data: {},
        // componets指定组件的标签,组件的内容,数据
        components: {
            "one": {
                template: "#oneTemp",
                data: function () {
                    return {
                        'msg': "我是OneTemp"
                    }
                }
            }
        }
    })
</script>

在这里插入图片描述

全局组件和局部组件的区别
<!--创建Vue对象绑定的区域-->
<div id="app">
    这里是app组件
    <one></one>
    <two></two>
</div>

<hr/>
<!--再次创建Vue对象 将全局组件和局部组件都放入 -->
<!--看一看显示-->
<div id="abb">
    这里是abb组件
    <one></one>
    <two></two>
</div>

<!--设定的组件指定内容-->
<template id="oneTemp">
    <div>
        {{msg}}
    </div>
</template>

<template id="twoTemp">
    <div>
        {{msg}}
    </div>
</template>

<script type="text/javascript">



    // 通过Vue.component设置全局组件
    // 全局组件可以在所有的Vue对象中使用
    Vue.component("two",{
        template: "#twoTemp",
        data:function () {
           return {
               msg:"我是全局组件"
           }
        }
    })

    // 局部组件只能出现在创建该组件的Vue对象中
    const vue = new Vue({
        el: "#app",
        data: {},
        // componets指定组件的标签,组件的内容,数据
        components: {
            "one": {
                template: "#oneTemp",
                data: function () {
                    return {
                        'msg': "我是OneTemp"
                    }
                }
            }
        }
    })

    const vm = new Vue({
        el:"#abb"
    });

</script>

在这里插入图片描述

注意

  1. 全局组件可以出现在其他的Vue中去使用
  2. 局部组件只能出现在创建自己的Vue中使用
  3. 组件只能在Vue中使用,其他地方不会显示

父子组件

<!--绑定父组件-->
<template id="one">
    <div>
        <span>这里是父组件</span>
        <child></child>
    </div>
</template>

<!--绑定子组件-->
<template id="child">
    <div>
        <span>这里是子组件</span>
        <button @click="fn1">子组件</button>
    </div>
</template>

<script type="text/javascript">

    const vue = new Vue({
        el: "#app",
        data: {},
        components: {
            "one": {
                template: "#one",
                components: {
                    "child": {
                        template: "#child",
                        methods: {
                            fn1() {
                                alert("我是子组件");
                            }
                        }
                    }
                }
            }
        }
    })
</script>

在这里插入图片描述

发现上面再组件中还可以创建出组件,这个组件指定再,创建该组件的范围中才可以使用

发现组件中也可以定制方法使用

父子组件传值

父传子
<!--这里是Vue对象示例-->
<div id="app">
    <parent></parent>
</div>
<!--这里是父组件,引入子组件并传入值-->
<template id="parent">
    <div>
        <span>父组件</span>
        <child cv='父传子'></child>
    </div>
</template>
<!--这里是子组件,展示子组件中的data数据-->
<template id="child">
    <div>
        <span>子组件</span>
        <span>{{cv}}</span>
    </div>
</template>

<!--父组件传值给子组件-->
<script type="text/javascript">
    const vue = new Vue({
        el: "#app",
        data: {},
        components:{
            "parent":{
                template:"#parent",
                components: {
                    "child":{
                        template: "#child",
                        data: function () {

                            return {
                                cv:"ss"
                            }
                        },
                        props:["cv"]

                    }
                }
            }
        }
    })
</script>

在这里插入图片描述

子传父
<!--子传父示例-->
<div id="app">
<ba></ba>
</div>

<template id="parent">
    <div>
        <h3>父组件接收的值{{parentmsg}}</h3>
        <zi @change="get" ></zi>
    </div>

</template>

<template id="child">
<div>
    <input type="button" value="点击传值" @click="fn1">
    <h4>准备传递的值{{childmsg}}</h4>
</div>
</template>

</body>
</html>

<script type="text/javascript">
    const vue = new Vue({
        el: "#app",
        data: {},
        components:{
            "ba":{
                template:"#parent",
                data:function () {

                    return {
                        parentmsg:""
                    }
                },
                components: {
                    "zi":{
                        template: "#child",
                        data: function () {

                            return {
                                childmsg:"100"
                            }
                        },
                        methods:{
                            fn1(){
                                this.$emit("change",this.childmsg)
                            }
                        }
                    }
                },
                methods: {
                    get(val){
                        this.parentmsg=val;
                    }
                }
            }
        }
    })
</script>

在这里插入图片描述

axion

  • 在浏览器中创建 XMLHttpRequests
  • 在 node.js 则创建 http 请求
  • 支持 Promise API
  • 支持拦截请求和响应
  • 转换请求和响应数据
  • 取消请求
  • 自动转换 JSON 数据
  • 客户端支持防御 XSRF

可以发布异步请求,将请求的结果得到,从而进行操作

示例

通过SpringBootHttp请求

使用axios进行发送异步请求,从得到结果进行操作

@RequestMapping(value = "/axiosTest")
    @ResponseBody
    @CrossOrigin
    public List<GoodsSort> Axios(){
//        从数据库中获取信息
        List<GoodsSort> goodsSorts = goodsSortService.selectAll();
        return goodsSorts;
    }

在这里插入图片描述

<div id="app">
    <button @click="axiosTest()" >点我异步请求</button>
</div>

<script type="text/javascript">
    const vue = new Vue({
        el: "#app",
        data: {},
        methods:{
            axiosTest(){
                axios.get("http://localhost:8080/axiosTest",{
                    // 这个属性指定请求带入的参数
                    params:{}
                    // then()成功之后的返回值
                }).then(res=>{
                    console.log(res.data)
                    // catch()出现异常返回error错误
                }).catch(err=>{

                })
            }
        }
    })
</script>

在这里插入图片描述

再发送异步请求可能会出现异常

@CrossOrigin 可以解决跨域问题
@CrossOrgin

出于安全原因,浏览器禁止Ajax调用驻留在当前原点之外的资源。例如,当你在一个标签中检查你的银行账户时,你可以在另一个选项卡上拥有EVILL网站。来自EVILL的脚本不能够对你的银行API做出Ajax请求(从你的帐户中取出钱!)使用您的凭据。

跨源资源共享(CORS)是由大多数浏览器实现的W3C规范,允许您灵活地指定什么样的跨域请求被授权,而不是使用一些不太安全和不太强大的策略,如IFRAME或JSONP。

插槽

插槽需要定义在组件中使用

在组件中放入一个插槽,在使用的Vue实例中不指定插槽,将展示默认情况,就是组件中插槽怎么写就是怎么样的

在调用组件时候,重新指定插槽内容,展示时候将展示重新指定后的内容

<!--在Vue实例中-->
<!--可以重新指定插槽中的内容-->
<div id="app">
    <one>
        <div slot="one" >
            <input type="button" value="插one">
            <span>代替了name=one的插槽</span>
        </div>
    </one>
</div>

<!--组件中放入插槽 默认展示插槽的内容-->
<template id="one">
    <div>
        <slot name="one">我插1</slot>
        <slot name="two">我插2</slot>
        <slot name="three">我插3</slot>
        <slot name="four">我插4</slot>
        <slot>我插5</slot>
    </div>
</template>

<script type="text/javascript">
    const vue = new Vue({
        el: "#app",
        data: {},
        components:{
            "one":{
                template:"#one"
            }
        }
    })
</script>

在这里插入图片描述

脚手架创建Vue项目

现在的Vue脚手架已经升级到3.x版本,即vue-cli3。 脚手架升级之后,安装的命令发生了变化,所以这篇文章会跟大家演示新旧版本的脚手架安装过程,以及使用新旧版本脚手架创建项目的过程。 下面的安装过程均是在window平台下安装。

Vue的脚手架是依赖于node.js的,所以无论是安装新版本还是旧版本,我们都要安装node.js

我们可以直接到node.js官网下载,然后像安装普通软件一样安装node.js。

img

node.js成功安装之后,npm一并安装成功,这个时候我们可以打开cmd窗口,输入 node -vnpm -v 来查看node.js和npm的版本,如果能够显示出版本,说明已经安装成功。
在这里插入图片描述

安装淘宝镜像

为什么要安装淘宝镜像呢?因为我们使用npm来搭建脚手架的时候,是从国外的npm服务器上下载需要的文件,这就导致下载过程会很漫长。我们安装了淘宝镜像之后,就可以从国内的镜像服务器下载搭建脚手架所需的文件,可以很快的完成下载任务。

我们在cmd窗口中输入以下命令来安装淘宝镜像。安装完成之后,我们可以使用命令cnpm -v来查看其版本,如果能够显示版本说明安装成功。

npm install -g cnpm --registry=https://registry.npm.taobao.org

在这里插入图片描述

使用node.js安装webpack,vue-cli

使用以下代码在全局下来安装webpack和vue-cli,因为vue脚手架搭建的项目是依赖webpack的,所以一定要安装webpack。

cnpm install webpack -g

cnpm install -g vue-cli

安装完成之后,我们可以使用vue -V和webpack -v命令来查看两者的版本,如果成功显示版本号,说明已经安装成功,注意vue -V中使用大写字母V。

在这里插入图片描述

完成安装Vue,就可以通过Vue来创建项目

vue创建项目

找到存放项目文件夹

通过cmd执行命令

在这里插入图片描述

在这里插入图片描述

进入vue创建的项目使用

//启动项目
cpm run dev

在这里插入图片描述

在这里插入图片描述

点击连接可以进行查看首页

在这里插入图片描述

使用Vue编写代码

创建出来的项目结构

在这里插入图片描述

main.js是主程序
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

开始引入了Vue,App,router等组件

进行绑定app,并引入App组件

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>

这个本身就是组件,可以被其他地方进行引用

同时也是main.js 程序的入口绑定的主页面

vue文件的结构

看到分为三个标签

  1. template 组件内容
  2. script js内容
  3. style 样式内容
HelloWord.vue

当然这个也是一个组件

默认是首页部分的内容

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
    }
  ]
})

路由的文件管理

路由,其实就是指向的意思,当我点击页面上的home按钮时,页面中就要显示home的内容,如果点击页面上的about 按钮,页面中就要显示about 的内容。Home按钮 => home 内容, about按钮 => about 内容,也可以说是一种映射. 所以在页面上有两个部分,一个是点击部分,一个是点击之后,显示内容的部分。

下面会进行路由的介绍

路由的学习

通过上面我们发现使用脚手架创建Vue项目的时候会生成很多文件

通过main.js指定了主组件APP,并指定了Vue需要的一些js文件和路由的文件

APP.vue中使用了进行路由页面的导入,从而引入了Helloword.vue达到了展示首页的目的

index.js对路由进行了同一的管理等操作

路由可以实现,页面的跳转功能,通过不同路径的访问,访问不同的组件

Vue框架本身并没有提供路由机制,但是官方以插件(vue-router)的形式提供了对路由的支持

官方地址:https://router.vuejs.org/zh/

使用NPM方式来安装路由插件

npm install vue-router

使用Vue-cli脚手架搭建项目,会提示是否需要vue-router,一般

情况都是需要路由功能,所以在此时就已经安装了路由插件

在这里插入图片描述

使用脚手架创建项目展示

展示示例

首先创建一个组件,通过脚手架创建出来的项目一个文件就表示一个组件

.vue结尾表示一个组件

创建的Vue文件,相当于一个组件

<template>
  <div>
    <span>
      {{title}}
    </span>
    <p>{{context}}</p>
    <router-link>二</router-link>
    <router-view></router-view>
  </div>
</template>

<script>
  export default {
    name: "One",
    data() {
      return {
        title:'一级路由',
        context:'改变router-view中展示的内容'
      }
    }
  }
</script>

<style scoped>

</style>

在index.js中进行组件的绑定路径,下面就可以通过指定的路径进行访问组件

index.js中编写内容

  1. import导入组件
  2. 在router数组中添加组件,指定path,component,name属性
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import One from '@/components/One'

Vue.use(Router)

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

在App.vue中编写如何使用组件

使用和

来展示当前选中的展示路由,通过路径来指定选择的是哪一个组件

<template>
  <div id="app">

    <router-link to="/one">one</router-link>
    <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>

页面展示

在这里插入图片描述

当点击时候进行跳转组件,默认指定的路径是/所以刚开始加载的是 path为 / 的组件页面

上面表示的是一级路由,下面介绍一下二级路由

一级路由,通过多个连接进行跳转页面,二级路由在一级路由中在设置一层路由(相当于父子)

二级路由页面展示

  1. 首次创建二级路由页面
  2. 放入index.js中进行绑定
  3. 如果是一级路由因为实在主页面上展示内容所以和放在App中,现在放在指定的一级路由中

一个路由页面中嵌入另一个路由页面

<template>
    <div>
      <p>这里是二级路由页面</p>
      <div>通过在一级路由页面中展示内容</div>
    </div>
</template>

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

<style scoped>

</style>

index.js

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


Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld
    },
    {
      path: '/one',
      name: 'One',
      component: One,
      children: [
        {
          path: 'two',
          name: 'Two',
          component: Two,
        }
      ]
    }
  ]
})

one页面

<template>
  <div>
    <span>
      {{title}}
    </span>
    <p>{{context}}</p>
    <router-link to="/one/two" >二</router-link>
    <router-view></router-view>

  </div>
</template>

<script>
  export default {
    name: "One",
    data() {
      return {
        title:'一级路由',
        context:'改变router-view中展示的内容'
      }
    }
  }
</script>

<style scoped>

</style>

这里注意语法,和二级路由路径

路由之间的跳转传值

在我们页面跳转有的时候需要进行跳转传值,才能更好的进行控制器的操作

下面就介绍页面传值

index.js中的path属性进行编写格式

export default new Router({
  routes: [
    {
      path: '/news/:id',
      component: NewsDetail
    }
  ]
})

调用地方的展示


<ul>
  <li>
     <router-link to="/news/1">第一条新闻</router-link>
  </li>
// 省略其他代码
</ul>

取值地方的编写

this.$route.params.指定的属性

上面是一种方式,下面在介绍一种方式

编程时路由,就是写代码的方式进行指定路由传值。上面是直接添加属性

语法:router.push(location)
// 一般使用方式
router.push('home')  // 字符串
router.push({ path: ‘home’ }) // 对象
// 命名的路由 -> /user/123
router.push({ name: 'user', params: { userId: 123 }})   
// 带查询参数 ->  /register?plan=private
router.push({ path: 'register', query: { plan: 'private' }})

示例展示

<!--编程式导航-->
<button @click="goHome">去首页</button>
<button @click="goList">去列表页</button>
goHome() {
  //带查询参数
  this.$router.push({ path: "home", query: { plan: "private" } });
},
goList() {
  //字符串形式
  this.$router.push("list");
}

编程式路由的其他方法

在这里插入图片描述

导航守卫

导航守卫的作用是路由在跳转前做一些验证,比如登录验证

在跳转页面前后进行的操作,可以进行判断,输出一些语句等信息

基本上就是在方法中进行编写

导航守卫分类

  1. 全局守卫
  2. 全局前置守卫
  3. 全局后置守卫
  4. 路由独享守卫
  5. 组件内的守卫

全局守卫出现在mian.js中进行全局设置

在这里插入图片描述

全局前置守卫

const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {
 // to: Route  即将要进入的目标路由对象
// from: Route 当前导航正要离开的路由
// next: Function 要调用该方法来执行钩子函数
})

全局前置守卫示例

在main.js中使用
router.beforeEach((to, from, next) => {
  if (to.path == "/login") {
    next();
  } else {
    //是否登录
    let islogin=false 
    if (islogin) {
    next()
    } else {
      console.log("没有登录,请先登录")
      next({ path: "/login" })
    }  }
});

全局后置守卫

const router = new VueRouter({ ... })
router.afterEach((to, from) => {
// to: Route  即将要进入的目标路由对象
// from: Route 当前导航正要离开的路由
})

路由独享守卫

  1. 使用方法与全局守卫相同,不同的是全局守卫可以作用于全局,路由独享守卫只作用于被设置守卫的路由
  2. 路由独享守卫与全局前置守卫的方法参数是完全一样
{
  path: '/login',
  name: 'Login',
  component: Login,
  //路由独享守卫
  beforeEnter: (to, from, next) => {
    console.log('登录页面')
    next()
  }   
}

组件内的守卫

在这里插入图片描述

组件内的守卫需要注意与methods同级,组件守卫分类
beforeRouteEnter 在渲染该组件的对应路由被 confirm 前调用
beforeRouteUpdate 在当前路由改变,但是该组件被复用时调用
beforeRouteLeave 导航离开该组件的对应路由时调用

beforeRouteUpdate(to, from, next) {
    // 在当前路由改变,但是该组件被复用时调用
      console.log("该组件被复用时调用");
    next();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值