目录

一.vue简介 

1.概念

2.特性

(1)数据驱动视图

(2)双向数据绑定

3.MVVM

4.基本使用步骤

5.调试工具

二.vue基础

1.指令

(1)内容渲染指令

(2)属性绑定指令

(3)事件绑定指令

(4)双向绑定指令

​编辑(5)条件渲染指令

(6)列表渲染指令

2.过滤器

(1)概念

(2)分类

3. 侦听器

4.计算属性

5.vue-cli

(1)单页面应用程序

(2)vue-cli

(3)使用

6.组件

(1)组件化开发

(2)vue组件组成部分

(3)组件的使用

(4)props

(5)组件样式冲突

7.组件的生命周期

(1)概念

(2)分类

8.数据共享

(1)父向子组件数据共享

(2)子向父组件数据共享

(3) 兄弟组件数据共享

9.ref引用

10.动态组件

(1)概念

(2)keep-alive

(3)name

11.插槽

(1)概念

 (2)具名插槽

(3)作用域插槽

12.自定义指令 

(1)私有自定义指令

(2)全局自定义指令

三.路由

1.简介

(1)前端路由

(2)后端路由

2.vue-router基本用法

3.vue-router常见用法

(1)路由重定向

(2)嵌套路由

(3)动态路由匹配

(4)声明式导航&编程式导航

(5)vue-router编程式导航API

(6)导航守卫

一.vue简介 

1.概念

用于构建用户界面的前端框架

2.特性

vue两大特性: 数据驱动视图,双向数据绑定

(1)数据驱动视图

(2)双向数据绑定

Vue2-基础知识

3.MVVM

Vue2-基础知识

4.基本使用步骤

Vue2-基础知识

5.调试工具

6.{{ }}

二.vue基础

1.指令

指令(Directives)是vue为开发者提供的模板语法,用于辅助开发者渲染页面的基本结构,vue 中的指令按照不同的用途可以分为6 大类

(1)内容渲染指令

用来辅助开发者渲染DOM元素的文本内容。常用的内容渲染指令有如下 3 个

(2)属性绑定指令

(3)事件绑定指令

$event

vue 提供的特殊变量,表原生的事件参数对象event, 可解决事件参数对象event被覆盖的问题(点击按钮变色问题)

事件修饰符

方便对事件的触发控制  <a href=" " @click.prevent=" "></a>

Vue2-基础知识

按键修饰符

监听键盘事件时,判断详细的按键,可为键盘相关的事件添加按键修饰符

e.g:  <input @keyup.enter="submit"> 只有按键Enter时,调用submit()

(4)双向绑定指令

v-model: 双向数据绑定指令,不操作DOM的前提下,快速获取表单的数据

Vue2-基础知识(5)条件渲染指令

按需控制 DOM 的显示与隐藏

(6)列表渲染指令

  • v-for: 基于一个数组来循环渲染一个列表结构
  • 使用item in list形式特殊语法(item待循环数组, item被循环的每一项); 
  • 用索引时(item, index) in list ,  item项和index 索引都是形参,可重命名

使用key维护列表状态

  • 官方建议,使用v-for必须绑定属性key,且值通常为id 
  • 当列表的数据变化时,默认情况下,vue会尽可能的复用已存在的DOM元素,从而提升渲染的性能. 但这种默认的性能优化策略,会导致有状态的列表无法被正确更新
  • 为给vue一个提示,以便它能跟踪每个节点的身份,从而在保证有状态的列表被正确更新的前提下,提升渲染的性能,需要为每项提供一个唯一的key属性
  • e.g:<tr v-for="(item,index) in list" :key="item.id" :title="index + item.uname  ">

key的注意事项

  • key 的值只能是字符串或数字类型
  • key 的值必须具有唯一性(即:key的值不能重复)
  • 建议把数据项 id 属性的值作为key的值(id 属性的值具有唯一性)
  • 使用 index 的值当作key的值没有任何意义(index 的值不具有唯一性,与每一项无强制关系)
  • 建议使用v-for指令时一定要指定key的值(既提升性能、又防止列表状态紊乱)

2.过滤器

(1)概念

  • 过滤器(Filters)常用于文本的格式化, 过滤器可以用在插值表达式和v-bind属性绑定中
  • 过滤器应该被添加在JS表达式的尾部,由管道符( | )进行调用, 可连续多个调用,前边的处理结果传递给后边的过滤器
  • 本质是js函数,可接受参数

兼容性

仅在vue 2.x和1.x中支持,在 vue 3.x 的版本中剔除了过滤器相关的功能(官方建议使用计算属性或方法代替被剔除的过滤器功能 )

(2)分类

私有过滤器
  • 在 filters 节点下定义的过滤器, 只能在当前 vm 实例所控制的 el 区域内使用

全局过滤器

  • 多个 vue 实例之间共享过滤器
  • Vue.filter('过滤器名', (参1, 参2,参3)=>{  }) 必须定义在vue实例之前
  • 参数1永远为管道符| 前边待处理的值, 第二个参数开始,才是调用过滤器传递的参数

3. 侦听器

4.计算属性

5.vue-cli

(1)单页面应用程序

Single Page Application简称 SPA,指一个Web网站中只有唯一的一个HTML页面,所有的功能与交互都在这唯一的一个页面内完成

(2)vue-cli

(3)使用

6.组件

(1)组件化开发

(2)vue组件组成部分

template

script  

style

(3)组件的使用

关系

使用步骤

私有子组件

全局组件 

(4)props

(5)组件样式冲突

根本原因是:

解决:

7.组件的生命周期

(1)概念

(2)分类

Vue2-基础知识

8.数据共享

(1)父向子组件数据共享

使用自定义属性

Vue2-基础知识

(2)子向父组件数据共享

使用自定义事件

Vue2-基础知识

(3) 兄弟组件数据共享

在 vue2.x 中,兄弟组件之间数据共享的方案是 EventBus (eventBus.js)

Vue2-基础知识

9.ref引用

this.$nextTick(callback) 方法

10.动态组件

(1)概念

(2)keep-alive

keep-alive 对应的生命周期函数

属性

(3)name

11.插槽

(1)概念

 (2)具名插槽

v-slot:(#)指令:

(3)作用域插槽

12.自定义指令 

(1)私有自定义指令

  • directives 节点下声明
  • 使用时, 加v-前缀即可, template 结构中可以通过=为当前指令动态绑定参数值
		// 私有自定义指令节点
		directives:{
			/* color:{ // 定义名为color的自定义指令, 指向一个配置对象
				// 当指令首次被绑定到元素上时,会立即触发bind函数, 若DOM更新时,不会触发
				// 形参el为当前被绑定的DOM对象  binding接收data传的值
				bind(el, binding){
					el.style.color = binding.value;
				},	
				update(el, binding){  // DOM更新时触发
					el.style.color = binding.value;
				},
			} */
			// 简写 
			color(el, binding){
				el.style.color = binding.value;
			},
		},

(2)全局自定义指令

// 全局自定义指令  定义在main.js中   通常使用全局自定义指令, 私有的意义不大
Vue.directive('col',(el, binding)=>{
	el.style.color = binding.value;
})

三.路由

1.简介

router, 就是对应关系

(1)前端路由

  • 前端路由Hash地址与组件之间的对应关系
  • Hash地址: 锚链接, url地址中 #及#之后的内容就是hash地址
  • SPA与前端路由: SPA(单页面程序)项目中,不同功能之间的切换,依赖于前端路由

工作方式:

  • 用户点击页面上的路由链接, 导致URL地址栏中的 Hash值发生变化
  • 前端路由监听了到 Hash地址的变化, 把当前 Hash 地址对应的组件渲染到浏览器中

实现简易前端路由:

  • 可通过<component>标签, 绑定动态属性渲染组件
  • 通过<a>添加对象的hash值 
  • 在created()中用 window.onhashchange = () => { }来监听hash地址的变化,并动态切换要展示的组件

(2)后端路由

  • 请求方式,请求地址与function处理函数之间的对应关系
  • 在node.js中,express路由即为后端路由

2.vue-router基本用法

基本用法

3.vue-router常见用法

(1)路由重定向

(2)嵌套路由

(3)动态路由匹配

(4)声明式导航&编程式导航

(5)vue-router编程式导航API

其中最常用的导航 API 分别是:

(6)导航守卫

控制路由的访问权限

全局前置守卫  router.beforEach( (to, from, next)=>{ } )
// src->router-> index.js
// 1.装vue-router@3.5.2包
// 2.导入Vue, 路由模块, 以及所需要的组件
import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '@/components/Router/Home.vue'
// 3.将VueRouter装为项目插件
Vue.use(VueRouter)
// 4.创建实例对象
const router = new VueRouter({
	// 7. 定义哈希地址与组件的对应关系  { path: '哈希地址#之后的内容', component: 组件名  }
	routes:[
		// 重定向的路由规则  在/路径下显示主页
		{  path: '/', redirect: '/home' },
		// 路由规则
		{  path: '/home', component: Home }, 
		// 父级路由规则, Mine页面
		{  
			path: '/mine',  //父级地址
			component: Mine,  //父级组件名
			// redirect: '/mine/mineabout1',  //可使用路由重定向, 当访问mine时,直接展示MineAbout1上,  也可使用默认子路由
			children: [  //通过children属性, 嵌套声明子级路由规则 子路由不使用/
			// 默认子路由: children数组中, 某个路由规则的path为空字符串, 打开时,直接展示该子组件上
				{ path: 'mineabout1', component: MineAbout1 },
				{ path: '', component: MineAbout2 }
			]
		},	
		// 动态参数   在World组件中,根据参数值, 展示对应组件    变化部分写 :参数
		// 方式1  this.$route.params.mid 拿到mid
		// {  path: '/world/:mid', component: World },	
		// 方式2  设置 props: true  ,在组件中用props接收
		{  path: '/world/:mid', component: World , props: true },	
		{  path: '/main', component: Main }, 
		{  path: '/login', component: Login }, 
	]
})
// 8.为router实例对象, 声明全局前置守卫  发生路由跳转,必然触发beforeEach指定的回调函数  to将要访问的路由信息对象, from将要离开的路由信息对象, next()函数 , 表放行
router.beforeEach( (to, from , next) => {
	if(to.path === '/main'){  //判断用户将要访问的哈希地址是否为/main  
        //等于,则需要登录才能访问   获取localStorage中的token
		const token = localStorage.getItem('token')   //如果在浏览器Application->localStorage中有token,就可访问到main
		if(token){  //有token,则放行
			next()
		}else{  // 无token, 则强制跳转到/login
			next('/login')
		}
	}else{   //访问的不是后台主页,直接放行
			next() 
	}
})
// 5.向外共享
export default router
// 6. main.js中挂载
// 导入路由模块 拿到实例对象
import router from '@/router/index.js' 
new Vue({
  render: h => h(App2),
	// Vue中使用路由, 必须将路由实例对象router进行挂载 
	 router,   //router : router  属性名属性值一样,可简写为router
}).$mount('#app')
//App.vue组件中    项目中安装和配置了vue-router,就可以使用 <router-view>组件来占位  和 <router-link>替代普通a链接 自动加# -->
		<router-link to="/home">主页</router-link> 
		<router-link to="/mine">我的</router-link> <hr>
//<!-- 动态参数  哈希地址中. /后的参数项,叫路径参数; 在路由参数对象中,用this.$route.params访问路径参数;   ?后的参数项,叫查询参数,用this.$route.query访问;    this.$route中, path只是路径部分 e.g:/world/2,  fullPath是完整路径 e.g: /world/2?name=mm&age=18 -->
		<router-link to="/world/1">W1.vue</router-link>
		<router-link to="/world/2?name=mm&age=18">W2.vue</router-link> <hr>
		<router-view ></router-view>
//<!-- 行内使用编程式导航跳转时,省略this,否则报错 -->
		<button @click="$router.back()">back</button>
		<button @click="$router.forward()">forward前进</button>

发表回复