Vue2入门教程,简单易懂
Vue基础
MVVM💥💥
本质:一种架构模式(编写代码的方式)。
理解:不需要操作dom的代码编写方式。
特点:(需要记忆)
- 数据驱动视图: 数据变化,页面会自动变化。 (我们不操作dom)
- 数据双向绑定:页面变化, 数据会自动变化。 (我们不操作dom)
组件
本质:一个.vue文件,就是一个组件
特点:由三部分组成
-
template:书写html代码
- 注意:必须有一个根节点
-
script:书写JS代码
-
style:书写样式代码
插值表达式
作用: 给标签设置内容
语法:{ { 表达式 } }
v-on
作用:绑定事件
语法:v-on:事件名="..."
推荐:👍@事件名="..."
<button @click="少量的代码" > 123 <button>
<button @click="函数名" > 123 <button>
<button @click="函数名(参数)" > 123 <button>
事件对象获取
// 函数通过形参获取
<button @click="函数名" > 123 < /button>
// 通过$event传入事件对象
<button @click="函数名(参数1, $event)" > 123 </button>
鼠标事件修饰符
作用:给事件增强功能
语法:@鼠标事件.修饰符="..."
种类(常用):
-
.prevent
:阻止默认行为 -
.stop
:阻止事件冒泡
按键修饰符
作用:给事件增强功能
语法:@键盘事件.修饰符="..."
种类:
.enter
:监听回车按键触发.esc
: 监听Esc按键触发
v-if和v-show
作用:控制标签的显示和隐藏
语法:v-if="布尔值"
。 布尔为true
,标签显示。 为false
,标签不显示
区别:
v-show
:通过样式display:none
控制隐藏v-if
:通过创建或销毁, 控制显示与隐藏
场景:
-
频繁创建,用
v-show
,节省性能 -
不频繁数据,敏感数据,使用
v-if
v-if 和 v-else-if 和v-else
语法:
v-if="布尔值"
v-else-if="布尔值"
v-else
注意:
v-if
、v-else-if
、v-else
三者之间,不能放入其它标签
v-model 💥💥💥
作用: 数据双向绑定
语法: v-model="变量名"
双向绑定:
- 数据变化,页面自动变化。
- 页面变化, 数据自动变化。
场景:💥💥
- 收集用户输入内容
- 回填表单数据
v-model修饰符
语法:v-model.修饰符="变量名"
种类:
- .number: 将收集的数据,转为数字格式,再存给变量
- .trim:去除首尾空白字符
- .lazy:失去焦点时,才收集数据
v-for
作用:创建多个标签
口诀:需要生成多个谁,就写在谁身上
语法:
v-for="item in 数组" :key="数据.id"
v-for="(item, index) in 数组" :key="数据.id"
key属性
作用: 提高dom更新效率
口诀: 💥💥💥有id用id,没id用唯一,没唯一用索引
:style 和 :class👍
作用:给标签添加样式
语法::class="{类名:布尔值}"
为ture
添加类名, 为false
去除类名
语法: style="{css属性名: 值, 小驼峰属性名:值, '连字符属性名': 属性值}"
计算属性
作用: 根据其它的数据, 计算得来一个新的值
优势:
-
只有依赖的数据变化, 才会重新计算
-
计算属性,自带缓存效果
注意💥:计算属性名称,不能和data数据 methods方法 其它的计算属性成名
语法:
- 简写写法:只读不改,用简写
computed: {
xxx(){
return ... // 💥💥 必须有返回值
}
}
- 完整写法: 需要对计算属性赋值时,用完整
computed: {
xxx: {
get() { // 💥💥 必须有返回值
return ...
},
set(val) { // 形参val,是计算属性接收到的值
}
}
}
侦听器
- 简写写法 - 基本数据类型
watch:{
被监听的数据名(){
}
}
- 完整写法 - 引用数据类型
watch: {
被监听的数据名: {
immediate: true
deep: true,
handler(){
}
}
}
组件注册
规范:
-
注册的组件:大驼峰,如
HmButton
-
使用组件:小写+连字符, 如
<hm-button>
-
文件名:
- 小写+连字符,如
hm-button.vue
- 大驼峰,如
HmButton.vue
- 小写+连字符,如
组件通信-父传子
- 父组件内, 在自组件标签上, 写属性
- 子组件内, 通过props属性接收
组件通信-子传父
- 子组件内, 通过:$emit(“自定义事件”, 参数, 参数2)
- 父组件内, 子组件标签上,: @自定义事件名="函数式"
组件通信-单项数据流
💥 Vue 单项数据流:
- 👎不推荐子组件,直接修改父组件传来的数据
- 👍让父组件自己修改数据
v-model语法糖
本质::value和@input,两个指令二合一
ref和$refs
作用:1获取dom; 2获取组件实例对象
步骤:
1.绑定ref
属性: <标签名 ref="xxx"></标签名>
2.通过$refs.xxx
获取: this.$refs.xxx
$nextTcik
作用:等dom更新结束, 再执行某些代码
语法:
this.$nextTick(() => {
// dom更新后, 回调函数自动执行
})
动态组件
作用:在同一个位置,动态切换,显示不同的组件
步骤:
- 设置
<component :is="组件名称" >
- 切换
组件名称
变量
插槽
场景:当组件内, 有不确定的标签时, 使用插槽.
种类3种:
- 匿名插槽
- 具名插槽
- 作用域插槽
1-匿名插槽
场景: 组件内, 只有一处有不确定的标签时, 使用匿名插槽
步骤:
- 子组件内,使用
<slot></slot>
占位 - 父组件内,子组件标签夹着的内容区域,设置传给
slot
的内容
语法:
子组件.vue
// 1. 子组件内, 使用slot标签占位
<slot>默认值(如果父组件不传任何内容,默认值将显示)</slot>
父组件.vue
// 2. 父组件内,子组件标签夹着的内容区域, 传给`slot`内容
<hm-child>
<xxx> 你要传给slot区域的内容 </xxx>
</hm-child>
2-具名插槽
场景:组件内, 有多处有不确定的标签时
简写:v-slot:xxx
可以简化成#xxx
步骤:
- 子组件内,使用
<slot/>
占位,并给<slot />
设置不同的name属性 - 父组件内,子组件标签夹着的内容区域,使用
<template #xxx />
,传给slot
内容
语法:
- 👍
<slot name="xxx"/>
与<template #xxx > 内容 </template>
- 👍
<slot />
与<template #default > 内容 </template>
示例:
子组件.vue
:
<template>
<slot name="xxx">默认值1</slot>
<slot name="zzz">默认值2</slot>
</template>
父组件vue
<hm-child>
<template #xxx>
<span> 你要传给slot-xxx区域的内容 </span>
</template>
<template #zzz>
<span> 你要传给slot-zzz区域的内容 </span>
</template>
</hm-child>
3-作用域插槽
作用:组件内的数据,可以传给父组件使用
步骤:
- 子组件内,给标签,设置属性
- 父组件内,通过
#xxx="对象变量"
,接收数据
语法:
<slot name="xxx" yes="确定" no="取消" />
和<template #xxx="{yes, no}" />
<slot yes="确定" no="取消" />
和<template #default="{yes, no}" />
注意💥:
- 为什么叫作用域插槽? 父组件接收的数据,只能在
<template #xxx="{}" />
标签范围内使用
路由
路由参数
-
动态路由 :
-
.传:
- 改造动态路由, path: "路径名/:自定义属性名"
- 路径传参
-
接收:
$route.params
-
场景: 必传参数
-
-
查询(搜索)字符串:
?aa=xx&bb=yy
- 传: 不用改造
- 接:
$route.query
- 场景:可选参数
路由模式
种类:
- hash路由: 带#
- history路由: 不带#, 需要服务度端支持
语法:
new VueRouter({
mode: "history" // 不写mode为hash路由
})
编程式导航
了解-导航种类:
- 声明式导航: router-link
- 编程式导航: 通过JS跳转
跳转方式
this.$router.push("/路径")
this.$router.back() // 返回上一页
this.$router.go(-1) // 返回上一页
路由传参
// 传查询字符串: ?keyword=123&name=xxx
this.$router.push({path: "/路径名", query: { 属性名: 值}})
// 传动态路由: 路径传值
this.$router.push('/路径名/' + 参数值)
概念
脚手架
本质:前端脚手架是一个npm包
作用:一键生成一个空的项目,已配置好需要的环境,提高程序员开发效率。
问题:
-
vue2脚手架,如何使用?
答案
-
项目名称,是否可以有中文或特殊符号?能否叫vue、webpack之类?推荐命名方式是什么?
答案
- ``
MVVM💥💥💥💥💥
本质:一种架构模式(编写代码的方式)。
理解:不需要操作dom的代码编写方式。
特点:
- 数据驱动视图: 数据变化,页面会自动变化。 (我们不操作dom)
- 数据双向绑定:页面变化, 数据会自动变化。 (我们不操作dom)
组件化开发
背景:现代前端项目,代码量非常大,需要分不同的文件管理代码。
本质:
- 一个大的页面,会先拆分成不同的小组件。
- 通过组装多个小组件,组合成一个页面。
优势:
- 便于维护
- 便于复用
钩子函数
本质:某个时机,会自动执行的函数
常用的钩子函数:
- created: 创建后, 发请求,请求数据
- mounted: 渲染后,最先获取dom
扩展问题:
- Axios中有没有钩子函数?
Axios
参数位置:
- query 用 params
- body 用 data写
扩展:
面试题:
JS数据类型:
-
ES6之前6种:
- string 、number、undefined、null、boolean、
- 对象 (易错点:💥💥 函数、数组、对象都属于对象数据类型)
-
ES6新增了第7种:Symbol
diff算法-更新策略
设计目的: 比较新旧虚拟节点,找出需要更新的节点,从而最小化DOM操作的次数,提高页面的性能。
策略:
-
比较同级根元素:
- 如果类型变化,不复用该根元素。该元素及后代元素,,全部删除。
- 如果类型没变, 复用该根元素,对比属性,更新Dom属性。
-
比较同级兄弟节点:
- 如果不写key,下标相同的节点,进行对比。 根据策略1, 决定是否复用。
- 如果有写key,key相同的节点进行对比,,根据策略1, 决定是否复用。
Vue的声明周期
常用:四大阶段、8个钩子函数
- 创建- 前,后
- 挂载- 前,后
- 更新- 前,后
- 销毁- 前,后
👍增加使用场景
- created 发请求
- mounted最新获取dom,比如加载后立马激活input
转载自:https://juejin.cn/post/7272843829555642409