前言,本篇文章是依据bilibili博主(波波酱老师)的学习笔记,波波酱老师讲的很好,很适合速成!!!
本篇文章会与vue2进行对比学习,并且也有很多的JavaScript知识点,要提前掌握他们才能学的效果更佳,见效更快。🥳
文章目录
- Vue基础
- Vue的底层原理
- el挂载点
- data数据对象
- methods方法
- 指令
- v-text
- v-html
- v-on
- v-show
- v-if
- v-bind
- v-for
- v-model
- 其他指令
- 自定义指令
- 事件和属性
- 事件修饰符
- 计算属性
- 侦听属性
- 深度侦听
- 过滤属性
- 生命周期函数
- 组件
- 组件创建和使用
- 全局组件
- 父子组件
- 单文件组件
- 组件通信
- 子组件向父组件传递数据
- 全局事件总线
- 企业级开发组件结构
- 脚手架搭建
- 脚手架目录结构
- render函数
- 路由
- 自定义插件
- 路由使用
- 深度路由
- 多级路由
- 组件的数据传递
- 编程式路由导航
- 路由守卫
- 全局路由守卫
- 独享路由守卫和组内路由守卫
- axios
- 全局安装JSON server
- get请求快速入门
- 提交请求
- 实现增加功能
- 实现删除功能
- 异常处理方式
- 响应对象结构分析
- axios默认配置
- EL组件库使用
- EL组件导入
- 布局组件
- Layout布局
- Container布局容器
- Button按钮
- 普通按钮
- 朴素按钮
- 圆角按钮
- 图片按钮
- 按钮组
- 表单组件
- 单选框
- 复选框
- input文本框
- 下拉框
- 日期和时间
- 文件上传
- Vue3
- Vue3的项目初始化
- 如何初始化Vue3项目
- 目录结构
- Vue2和Vue3的区别
- 组合式API
- setup函数
- 响应式函数
- reactive
- ref
- 对象类型
- 简单类型
- 数组类型
- 属性
- 计算属性
- get和set写法
- 侦听属性
- 对象类型侦听
- 精确侦听
- 生命周期函数
- 组件通信
- 父传子通信
- 子传父通信
- 模版引用ref
- 事件总线
- Vuex
- 创建Vuex项目
- 创建store对象
- 实现actions、mutations和state
Vue基础
Vue的底层原理
MVVN模型
- M:模型(model):对应的data中的数据
- V:视图(View):模版
- VM:视图模型(ViewModel):Vue事例对象
MVVM数据监视与代理
el挂载点
- vue实例的作用范围是el选项命中的元素及其内部的后代元素
- 可以使用其他的选择器,建议使用
id选择器
- 可以使用在其他双标签中,但是要注意不能使用在
html标签
和body标签
<script>
var app = new Vue({
el:"#app", //id选择器
el:".app", //class选择器
el::"div", //标签选择器
data:{
message:"el挂载点"
}
})
</script>
data数据对象
- vue中用到的数据定义在
data
中 - data中可以写
复杂类型
的数据 - 渲染复杂类型数据时,应当遵守
JS语法
<div id="app">
{{message}}
{{preson.name}}{{preson.age}}
<ul>
<li {{city[0]}}></li>
<li {{city[1]}}></li>
<li {{city[2]}}></li>
<li {{city[3]}}></li>
</ul>
</div>
<script>
var app = new Vue({
el:"#app",
data:{
message:"data数据对象",
}
person:{ //对象属性
name:"天下无贼"
age:"188"
},
city:["北京","上海","广州","深圳"] 数组属性
}
})
</script>
methods方法
不要写尖头函数,因为会改变this指向
指令
v-text
- 设置标签的
文本值内容
- 默认写法会替换全部内容,使用
插值表达式{{}}
就是他的简写形式 - 内部支持写
表达式
<div id="app">
<h2 v-text="message"></h2> <!--输出的是"v-text属性"-->
<h2 v-text="message">我会被覆盖</h2> <!--这个输出的也是"v-text属性",没有"aaa"的原因是因为v-text覆盖掉了-->
<h2 v-text="message+'!!!'"></h2> <!--支持字符串拼接表达式-->
</div>
<script>
var app = new Vue({
el:"#app",
data:{
message:"v-text属性",
aaa:"aaa"
},
})
</script>
v-html
- 设置标签的
html对象
- 内容中有html结构会被
解析成标签
- 解析文本的时候使用
v-text
,需要解析html结构的时候使用v-html
<div id="app">
<p v-html="message"></p>
</div>
<script>
var app = new Vue({
el:"#app",
data:{
message:" <a herf="www.baidu.com">v-html</a> "
},
})
</script>
v-on
- 为元素绑定事件
- 绑定的方法定义在
methods
属性当中 - 方法的内部通过
this
关键字可以访问定义在data中的数据
<div id="app">
<p>
{{message}}
</p>
<button v-on:click="do">v-on触发</button>
<button @click="do">v-on简写触发</button> <!--简写形式-->
</div>
<script>
var app = new Vue({
el:"#app",
data:{
message="你好"
},
methods:{
do:function(){
//方法逻辑
this.message+="我不好" //使用[this.]关键字拿到当前对象
}
}
})
</script>
v-on简写可以为
@
传递自定义参数,事件修饰符
<div id="app">
<button @click="do(p1,'你好')"></button>
<button @keyup.enter="do2"></button>
</div>
<script>
var app = new Vue({
el:"#app",
data:{
},
methods:{
do:function(p1,p2){
console.log("v-on自定义参数"+p1+p2);
},
do2:function(){
console.log("键盘enter键事件修饰符");
}
}
})
</script>
写一个计数器小案例
<div id="app">
<button @:click="sub">-</button>
<span>{{message}}</span>
<button @click="add">+</button>
</div>
<script>
var app = new Vue({
el:"#app",
data:{
message:0
},
methods:{
add:function(){
if(this.message<10){
this.message++;
}else{
alert("别点啦最大了!!!")
}
},
sub:funct(){
if(this.message>0){
this.message--;
}else{
alert("别点啦最小了!!!")
}
}
}
})
</script>
v-show
- 根据后面表达式的真假来决定元素的
显示
和隐藏
- 原理是修改了元素的
display
来实现隐藏 - 指令后面的内容,最终都会被解析成布尔值
- 值为
true
元素显示,值为false
元素隐藏
<div id="app">
<P v-show="true">通过设置布尔值来决定v-show</P>
<P v-show="isShow">通过isShow来决定</P>
<button @click="do">改变isShow值</button>
<P v-show="age>=18">通过元素值来决定</P>
</div>
<script>
var app = new Vue({
el:"#app",
data:{
age:17,
isShow:false
},
methods:{
do:function(){
this.isShow =!this.isShow;
}
}
})
</script>
v-if
- 根据表达式的增加切换元素的显示状态
- 本质上是操作Dom元素来切合显示状态
- 频繁的切换
v-show
因为消耗的性能较小,但是占用内存较高.反之使用v-if
<div id="app">
<P v-if="isShow">这个是v-if的案例</P>
<button @click="do">改变isShow值</button>
</div>
<script>
var app = new Vue({
el:"#app",
data:{
isShow:true
},
methods:{
do:function(){
this.isShow =!this.isShow;
}
}
})
</script>
v-bind
- 为元素绑定属性
- 语法模板
v-bind:属性名=表达式
- 简写形式直接
:属性名
<div id="app">
<a v-bind:href="message">点我以下</a>
<button @click="do">改变isShow值</button>
</div>
<script>
var app = new Vue({
el:"#app",
data:{
message:"www.baidu.com",
}
})
</script>
v-for
- 根据数据生成列表结构
- 语法模板
v-for="(item,index)in 数据"
(item代表每一项,index是索引)
<div id="app">
<ul>
<li v-for="item in arr">v-for案例:{{item}}</li>
</ul>
<h2 v-for="(item,ixdex) in arr">{{"index":index}}{{item.name}}</h2>
</div>
<script>
var app = new Vue({
el:"#app",
data:{
arr:[1,2,3,4,5],
obj:[
{name:"aaa"},
{name:"bbb"}
] //对象数组
}
})
</script>
v-model
- 获取和设置表单元素的值(双向数据绑定)
- 绑定的数据会和表单元素值相关联
- 绑定的数据和表单元素的值是
双向绑定
的
<div id="app">
<input type="text" v-model="message">
<h2>
{{message}}
</h2>
</div>
<script>
var app = new Vue({
el:"#app",
data:{
message:"v-model"
},
methods:{
}
})
</script>
其他指令
自定义指令
简写形式
需要在学习一下
事件和属性
事件参数e
e获得当前元素
带参数$event
事件修饰符
计算属性
computed
计算属性
属性调用不需要
()
侦听属性
watch
侦听属性
简化写法:
深度侦听
deep
深度侦听属性
侦听器与计算属性对比
过滤属性
filters
过滤属性
生命周期函数
组件
组件创建和使用
首先在脚本区域声明一个组件
Vue.entend() 可以省略
注册组件
使用组件
关于组件的命名
- SchoolMes【需要脚手架】,回避HTML关键字
- 建议组件声明时定义name属性
- Vue工具最终都会将组件命名变成“首字母大写”
声明的时候就把名字声明好了
全局组件
第一个参数是组件的名称,第二个参数是配置组件项。
第二行的name也可以删掉
父子组件
创建子组件:要在父组件中注册子组件
注意需要先声明子组件,把子组件放前面,让他先加载
使用子组件与使用组件方法一样
单文件组件
在IDEA中配置vue文件
新建vue文件的结构
父组件自动导入
组件通信
加上绑定就变成数值,而不是字符串了
子组件向父组件传递数据
第一种方式:通过props
第二种方法:通过$emit
第三种方法:$on
挂载事件和$emit
调用
全局事件总线
实现任意组件传递数据
在main.js
创建事件总线
建议使用完总线后消亡该总线
企业级开发组件结构
-
总组件
App.vue
要有一个顶级结构
-
vm事例对象
main.js
-
容器
index.html
脚手架搭建
搭建脚手架命令
- 配置node
- 配置淘宝镜像
- 全局安装vue脚手架
- 创建项目
- 启动项目
脚手架目录结构
修改配置项目
lintOnSave:false
取消因为命名不规范而报错
render函数
路由
自定义插件
创建插件,在src
文件包下创建一个js文件
使用插件,在main.js
文件中,
路由使用
第一步安装路由
第二步安装路由插件
- 创建一个新的文件夹来当作我们的路由
第三步路由的使用
第四步使用路由规则
深度路由
多级路由
组件的数据传递
编程式路由导航
路由守卫
全局路由守卫
独享路由守卫和组内路由守卫
axios
- 首先导入
axios
包
axios.get(地址?查询字符串).then(funciton(response){},function(err){ })
- 使用get和post方法即可发送对应的请求
- then方法中的回调函数会在请求成功或失败时候触发
- 通过回调函数的形参可以获取响应内容或者错误信息
全局安装JSON server
get请求快速入门
简化写法
改造
提交请求
实现增加功能
async改造
实现删除功能
改造
异常处理方式
简写形式
响应对象结构分析
axios默认配置
省略这些
EL组件库使用
EL组件导入
布局组件
Layout布局
Container布局容器
垂直布局和水平布局
Button按钮
普通按钮
朴素按钮
圆角按钮
图片按钮
因为加了一个
circle
所以是圆形按钮,下面是去掉
按钮组
表单组件
单选框
复选框
input文本框
下拉框
日期和时间
文件上传
Vue3
Vue3的项目初始化
如何初始化Vue3项目
初始化项目
运行项目
目录结构
整体与vue2相似,但还是有一点区别。
Vue2和Vue3的区别
- Vue2属于选项氏API
- Vue3属于组合式API
组合式API
setup函数
作用:数据和事件函数的初始化工作。
变量和事件想要在中使用必须要使用return
setup
是执行在beforeCreate()
之前的
第二个案例理解vue2改造vue3
setup语法糖
其他方法就都包括在里面了
响应式函数
reactive
注意:reative响应的只有是对象,不能接受其他的形式
ref
对象类型
当参数是一个对象
简单类型
当参数是一个简单类型,数字、字符串、布尔
数组类型
当参数是一个数组类型的时候
属性
计算属性
get和set写法
侦听属性
watch(侦听属性,(新值,旧值))
一般旧值写的会少一点,可以直接改成只有新值
对象类型侦听
也就是深度侦听
精确侦听
对侦听对象的某一个值进行侦听
生命周期函数
组件通信
父传子通信
子组件的变化
父组件的变化
子传父通信
子组件的改造
父组件的改造
模版引用ref
这个要自己学一会
事件总线
provide与inject
Vuex
Vuex是专门为Vue.js设计的状态管理库,以利用Vue.js的细粒度数据响应机制来进行高效的状态更新。
实现了多组件共享数据。
创建Vuex项目
创建store对象
新建一个js文件
三个对象的作用:
创建store
对象
引入store
对象