2020-09-11、vue的路由与路有守卫简单认识

本文深入讲解Vue.js中作用域插槽的应用,组件Props的数据验证方法,以及VueRouter的全面使用指南,包括路由配置、导航控制、重定向、嵌套路由和参数传递等关键概念。

内容:作用域插槽、组件props验证、路由、路由守卫

日期:2020-09-11

一、作用域插槽

当我们希望数据由子组件提供,页面结构由父组件提供,这种情况下我们可以作用域插槽。

v-slot

子组件中有数据,但是需要在父组件中控制页面结构

子组件:

<template>
    <div>
        <h1>子组件</h1>
        <ul>
            <slot name="list" v-for="item of movies" :item="item"></slot>
        </ul>
    </div>
</template>

<script>
export default {
    data(){
        return{
            movies:[
                '怒火追凶','上海王2','谎言大师'
            ]
        }
    }
}
</script>
<style></style>

父组件:

<template>
    <div>
        <h1>父组件</h1>
        <hr>
        <v-child>
            <template v-slot:list="props">
                <li>{{ props.item }}</li>
            </template>
        </v-child>
    </div>
</template>
<script>
import vChild from './Child'
export default {
    components:{
        vChild
    }
}
</script>
<style></style>

二、props验证

如果需要在子组件接收父组件数据时,对数据进行一些验证,需要用到props验证。在子组件接收父组件传递的数据,要用对象的方式,在对象中可以设置相应的验证规则。

1.数据类型验证

写法一:

props:{
	'参数名':数据类型名称
}

写法二:

props:{
	'参数名':{
		type:数据类型名称
	}
}

如果支持多个数据类型,使用数组

props:{
	'参数名':{
		type:[数据类型名称1,数据类型名称2]
	}
}

2.必填

props:{
	'参数名':{
		type:数据类型名称,
		required:true//设置当前参数为必传值
	}
}

3.默认值

props:{
	'参数名':{
		type:数据类型名称,
		//default:"默认展示的内容"
		default:function(){
			return {
				msg:'默认展示的内容'
			}
		}
	}
}

4.自定义验证规则

props:{
	'参数名':{
		validator:function(形参){
			对形参的验证规则
			return 验证结果或者布尔值
		}
	}
}

示例代码:

父组件:

<template>
    <div>
        <h1>父组件</h1>
        <hr>
        <v-child :msg="msg" :num="num" :str="str"></v-child>
    </div>
</template>
<script>
import vChild from './Child'
export default {
    components:{
        vChild
    },
    data(){
        return{
            msg:"hello",
            num:500,
            str:"0824"
        }
    },
}
</script>
<style></style>

子组件:

<template>
    <div>
        <h1>子组件</h1>
        <p>父组件传递的数据是:{{ msg }}</p>
        <p>父组件传递的数据是:{{ num }}</p>
        <p>{{str}}</p>
    </div>
</template>

<script>
export default {
    props:{
        // msg:String//仅设置数据类型(数据类型名称首字母要大写)
        // msg:{
        //     type:String
        // }
        msg:{
            type:[String,Number]//接收多个数据类型 String、Number、Boolean、Object、function、Symbol、Null
        },
        num:{
            type:Number,//数据类型
            required:true,//设置为必填
            validator:function(val){//设置自定义验证规则
                return val>1 && val<100;
                //如果父组件传递的数据不在这个范围内,则会在控制台中出现一个警告
            }
        },
        str:{
            type:String,
            default:"父组件没有给传递此值,什么也没有"//设置默认值
        }
    }
}
</script>
<style></style>

三、路由【重点】

Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。包含的功能有:

  • 嵌套的路由/视图表
  • 模块化的、基于组件的路由配置
  • 路由参数、查询、通配符
  • 基于 Vue.js 过渡系统的视图过渡效果
  • 细粒度的导航控制
  • 带有自动激活的 CSS class 的链接
  • HTML5 历史模式或 hash 模式,在 IE9 中自动降级
  • 自定义的滚动条行为

1.基本使用

(1)安装

①初始化项目时选择安装vue-router

②手动安装

npm i vue-router --save

(2)基本使用

第一步:创建几个页面组件

第二步:在/src/main.js中引入vue-router插件,并引入页面组件、定义路由规则

import VueRouter from 'vue-router'
Vue.use(VueRouter)//在vue中使用插件【重要】
//引入页面组件
import Home from './components/Home'
import Movie from './components/Movie'
import Music from './components/Music'
var router = new VueRouter({
    //路由规则地址与页面组件的配置映射关系表
    routes:[
        { path:'/home',component:Home },
        { path:'/movie',component:Movie },
        { path:'/music',component:Music },
    ]
})

path属性表示浏览器地址关键词,要以斜杠开头

component属性表示路由地址关键词对应的页面组件

第三步:在/src/App.vue中添加路由出口组件

<div id="app">
    <!-- 
        路由出口 
        根据当前浏览器中的地址与路由规则映射表进行匹配,匹配到之后,就把对应的组件模板内容展示在路由出口的位置上。
    -->
    <router-view></router-view>
</div>

2.路由导航

(1)内置组件

router-link 会在页面上生成一个超链接。

属性:

①to

需要设置一个to属性,它的值是设置路由映射规则时的path属性值。

to属性的值,必须以斜杠开头,不然会出现地址异常的现象。

②active-class

active-class 非必填项,模糊匹配的类名,可以用来设置激活的导航类名

写在router-view上方或者下方的router-link会一直在页面中显示。

③exact-active-class

精确匹配的类名,只有访问的路由规则地址和to属性中一模一样时才会设置上对应的类名

(2)编程式导航

vue-router类的实例中给提供了一些方法,可以实现页面跳转

push 此方法会把当前访问的页面作历史记录,然后跳转到指定的路由规则上

replace 此方法会用即将跳转的路由规则地址替换当前访问的页面路由规则地址

go 此方法可以进行页面路由地址的回退,一般写-1,表示回退到上一个访问的页面

<button @click="$router.push('/movie')">前往电影页面</button>

<button @click="toMusic">前往音乐页面</button>

<script>
export default {
    methods:{
        toMusic(){
            this.$router.replace('/music')
        }
    }
}
</script>

<button @click="$router.go(-1)">返回</button>

3.路由重定向

如果需要展示默认的一个页面或者当用户输入不存在的路由规则时,扔让用户看到一个默认的页面时,可以使用路由重定向(路由地址跳转)。

routes:[
	....,
	{ path:'*',redirect:'/home' }
]

*表示所有的路由规则都没有匹配到

redirect表示要重定向到的路由规则path属性值

4.路由嵌套

第一步:再创建几个页面组件

第二步:在一级路由规则中添加一个children属性,它的值和routes数据类型相同,都是一个数组。

routes:[
    { path:'/home',component:Home },
    { 
        path:'/movie',
        component:Movie,
        children:[
            { path : 'guonei' , component:Guonei},
            { path : 'guowai' , component:Guowai}
        ]
    },
    { path:'/music',component:Music },
    { path:'*',redirect:'/home' }
    // {path:'*',component:Home}
]

子级路由规则的path属性不需要添加斜杠

第三步:在子级路由的父级路由规则对应的页面组件中添加router-view组件,用来展示子级路由规则对应的页面组件内容。

<template>
    <div class="movie">
        <h1>movie页面</h1>
        <router-link to="/movie/guonei">国内</router-link>
        <router-link to="/movie/guowai">国外</router-link>
        <router-view class="content"></router-view>
    </div>
</template>

5.路由传参

(1)动态路由

动态路由规则定义:

{ path:'/关键词/:参数名' }

冒号后面是一个参数名,能够在进行路由规则匹配时,能够匹配到任意的字符或者数字。

第一步:创建一个详情页面

第二步:在路由配置文件中定义一个动态的路由规则

{
	path:'/movieinfo/:mid',component:MovieInfo
}

第三步:在电影列表页面通过编程式导航进行页面跳转

 methods:{
     toInfo(id){
     	this.$router.push('/movieinfo/'+id)
     }
 }

第四步:在电影详情页面获取路由地址中的参数

<p>编号:{{ $route.params.mid }}</p>
(2)query查询参数

如果路由地址中的参数数量不固定时,使用动态路由就不合适了。

第一步:定义一个固定的路由规则

{
    // path:'/movieinfo/:mid',component:MovieInfo
    path:'/movieinfo',component:MovieInfo
}

第二步:在电影列表页面通过编程式导航进行页面跳转

methods:{
    // toInfo(id){//动态路由
    //     // this.$router.push('/movieinfo/'+id)
    // }
    toInfo(obj){//查询参数
        // this.$router.push('/movieinfo/'+id)
        this.$router.push({
            path:'/movieinfo',
            query:{
                movieid:obj.id,
                title:obj.title
            }
        })
    }
}

第三步:在电影详情页面获取路由地址中的参数

mounted(){
    console.log(this)
    // this.info = this.movies.find(item=>{
    //     return item.id == this.$route.params.mid
    // })
    this.info = this.movies.find(item=>{
    	return item.id == this.$route.query.movieid
    })
}
下载代码方式:https://pan.quark.cn/s/e6c2e312b658 在苹果公司的Mac操作系统环境中,当用户尝试安装非原厂驱动程序时,可能会遭遇系统无法正常启动的困境。这种情况常常源于名为.kext的内核扩展驱动程序存在兼容性问题或安装过程中出现失误。这份指南介绍了一种无需重新安装操作系统且能够保护所有用户数据的修复方法,这一方案对于先前许多面临类似挑战的用户而言,曾是极为棘手的情况。文档中提及的“用户模式启动”实际是指单用户模式,这种启动方式仅加载核心系统功能,而忽略图形用户界面及常规应用程序的加载。在单用户模式下,用户能够访问命令行界面,进而执行一系列修复指令。解决此问题的首要环节是验证存储设备是否存在故障,因为这是导致系统无法启动的常见诱因。借助终端指令`/sbin/fsck -f`,可以诊断并纠正文件系统层面的错误。倘若系统在启动过程中检测到文件系统异常,通常会自动执行`fsck`命令,然而,如果系统卡在进度条100%无法继续,手动运行该命令则显得尤为必要。指令`mount -uw /`的功能是将根目录切换为可读写状态,由于系统默认是以只读模式启动的。这一操作的目的是为了在不重新进入正常模式的前提下,对系统进行必要的调整。随后,文档提供了一个关键操作:对存在问题的驱动程序文件进行修改或更名。在Mac系统中,第三方驱动程序一般安装在`/Library/Extensions/`目录下。每个驱动程序都包含一个以.kext为后缀名的文件夹,例如在此案例中的AX88772.kext。通过命令行将故障的.kext文件更名(例如改为.kext.bak),可以临时禁用该驱动程序。这一操作需在命令行环境中完成,首先使用`cd /Library/Exte...
源码链接: https://pan.quark.cn/s/a4b39357ea24 海康威视NVR76/78N系列是一款为中小型企业及家庭用户量身打造的网络视频录像机(Network Video Recorder),其核心用途在于对来自网络摄像头的视频流进行管理和存储。该系列具备兼容萤石云服务的功能,这使得用户能够通过网络远程进行监控系统的访问、监控以及管理,借助互联网达成随时随地进行视频查看和录像回放的目标。在标题中提及的"海康NVR76/78N系列升级包"具体指代适用于这一系列录像机的软件更新套装。此类升级通常涵盖性能改进、新增功能、安全漏洞修正以及兼容性增强等多个方面,旨在保障设备始终处于最新状态,优化运行效能并改善用户使用感受。譬如,升级或许囊括了更为先进视频压缩技术的应用,用以降低网络带宽的消耗,或者为新型网络摄像头提供支持。产品说明中所列出的型号,如DS-7816N-SNH、DS-7816N-SHT、DS-7816N-SHT/N、DS-7816N-SHT/P,均属于海康威视NVR76/78N系列的特定版本。这些型号之间的不同之处可能体现在硬盘接口数量、视频通道数目、视频解码性能、网络接口规格以及是否集成内置电源等硬件参数。型号中的"DS-7816N"表明该设备能够同步处理16个视频通道,而后续的字母标识及后缀则可能象征着不同的功能或特性。"萤石云"是由海康威视开发的一套云服务解决方案,它提供了远程监控、即时视频浏览、录像保管和智能警报等多项服务。用户可借助萤石云App或网页版,便捷地监管和检视自身的监控装置,不受地理位置限制。相较于传统的本地存储方式,萤石云服务提供了一种更为方便且可靠的数据备份途径,特别是在拥有多个监控点或需防止设备失窃的情境下...
下载代码方式:https://pan.quark.cn/s/a4b39357ea24 在移动应用开发领域中,Android平台Unity3D引擎的整合是一项普遍存在的技术需求,特别是在游戏开发以及混合应用构建方面。本示例演示了如何在Android原生代码和Unity3D引擎之间建立高效的通信机制,以完成数据传递和功能执行的任务。为了有效运用此技术,必须充分认识Android和Unity3D各自的技术特性。 Android作为一个开源的移动操作系统,它提供了大量的应用程序接口和开发工具,适用于构建原生应用程序。而Unity3D则是一款支持多平台的游戏开发工具包,能够用来设计二维、三维游戏以及交互式体验。Unity3D具备卓越的图形渲染性能和便捷的编程接口,但有时需要Android系统的功能相融合,例如接入硬件设备、管理系统级事件等。 当在Android设备上启动Unity3D应用时,一般通过UnityPlayer类来完成。UnityPlayer是Unity系统在Android设备上的连接媒介,能够用来运行Unity的编程代码或获取Unity的用户界面。举例来说,可以定义一个Intent对象,将信息打包后经由UnityPlayer传输给Unity,然后在Unity的C#编程环境中接收并处理这些信息。 相对于Unity3D调用Android系统,通常需要借助Unity的插件架构。开发者需编写Java语言编写的Android插件,并实现特定的程序接口,随后在Unity环境中使用DllImport指令导入这个插件。Unity会自动将Java代码编译并整合到工程中。执行时,通过Unity的DllImport函数调用Android插件的方法,从而执行Android设备上...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值