# 袁老師Vue筆記整理
## 视频共16個
## 【学习须知】 01:44
---
## 01_从Vue到前端 31:16
---
> 笔记是由markdown格式书写
>
> 下载 [typora](https://www.typora.io/) 打开笔记
## 什么是vue
> 官网:https://cn.vuejs.org/
-----
前置知识:
- 完整的学习`vue`:`html + css`、`JavaScript`、`css3`、`HTML5`、`第三方库`、`网络通信`、`ES6+`、`webpack`、`模块化`、`包管理器`、`css预编译器`
- 体验`vue`功能:`html + css`、`JavaScript`
--------
**`vue`是前端的一种开发框架,它主要解决前端开发中的核心痛点——复杂的DOM操作**
------
`vue`拥有以下特点:
- 渐进式
- 组件化
- 响应式
------
`vue`的应用场景:
- 前台的部分页面
- 中后台的全部页面
------
`vue`的版本:
- 目前的正式版本是`2.x`
- `3.x`版本即将上线,对`2.x`是兼容的,要完全体验到`3.x`的优势,还需要学习`TypeScript`
### vue在前端的地位
前端是连接终端设备与人的技术
<img src="http://mdrs.yuanjin.tech/img/20200902153656.png" alt="image-20200902153656704" style="zoom: 33%;" />
**`vue`是实现这些技术的其中一种方式**
------
除了`vue`之外,还需要学习哪些前端知识?
`TypeScript`、`ThreeJS`、`WebGL`、`ECharts`、`NodeJS`、`Egg`、`Redis`、`Mongodb`、`Sequelize`、`Express`、`Koa`、`移动端`......
### 学习准备
1. 安装`VSCode`
> 官网:https://code.visualstudio.com/
2. 安装`VSCode 相应插件` ※**注意**!要改用CodePen
- Auto Rename Tag:能够自动更改结束标签
- Live Server:自动搭建本地服务器
- Prettier - Code formatter:代码美化
- Vetur:vue组件格式支持
- vscode-icons:美化文件图标
4. 加入组织
---
## 02_Vue初体验 24:31
### 起步
使用`vue`的两种方式:
- 在页面中引入`vue`的js文件
- 脚手架
- 官方脚手架`vue-cli`
- 其他民间脚手架,如`webpack-simple`
- 手动搭建
### 体验vue开发
<img src="http://mdrs.yuanjin.tech/img/20200907104538.png" alt="image-20200907104538306" style="zoom:50%;" />
---
## 03_Vue核心概念 55:58
### ES6知识补充
- 速写属性
- 速写方法
- 模板字符串
### 注入
配置对象中的部分内容会被提取到vue实例中:
- `data`
- `methods`
该过程称之为**注入**
注入目的有两个:
- 完成数据响应式
vue是怎么知道数据被更改了?
`vue2.0`是通过`Object.defineProperty`方法完成了数据响应式,`vue3.0`是通过`Class Proxy`完成的数据响应式
- 绑定`this`
### 虚拟DOM树
**为了提高渲染效率**,vue会把模板**编译**成为虚拟DOM树,然后再生成真实的DOM
<img src="http://mdrs.yuanjin.tech/img/20200908030214.png" alt="image-20200908030214647" style="zoom:50%;" />
当数据更改时,将重新编译成虚拟DOM树,然后对前后两棵树进行比对,仅将差异部分反映到真实DOM,这样既可最小程度的改动真实DOM,提升页面效率
<img src="http://mdrs.yuanjin.tech/img/20200908031642.png" alt="image-20200908031642346" style="zoom:50%;" />
因此,对于`vue`而言,提升效率重点着眼于两个方面:
- 减少新的虚拟DOM的生成
- 保证对比之后,只有必要的节点有变化。
`vue`提供了多种方式生成虚拟DOM树:
1. 在挂在的元素内部直接书写,此时将使用元素的`outerHTML`作为模板
2. 在`template`配置中书写
3. 在`render`配置中用函数直接创建虚拟节点树,此时,完全脱离模板,将省略编译步骤
这些步骤从上到下,优先级逐渐提升
**注意:虚拟节点树必须是单根的**
### 挂载
将生成的真实DOM树,放置到某个元素位置,称之为**挂载**
挂载的方式:
1. 通过`el:"css选择器"`进行配置
2. 通过`vue实例.$mount("css选择器")`进行配置
### 完整流程
<img src="http://mdrs.yuanjin.tech/img/20200908051939.png" alt="image-20200908051939745" style="zoom:50%;" />
---
## 04_模板语法和计算属性 56:12
### 模板语法
### 内容
`vue`中的元素内容使用`mustache`模板引擎进行解析
> mustache:https://github.com/janl/mustache.js
### 指令
指令会影响元素的渲染行为,指令始终以`v-`开头
基础指令:
- v-for:循环渲染元素
- v-html:设置元素的`innerHTML`,该指令会导致元素的模板内容失效
- v-on:注册事件
- 该指令由于十分常用,因此提供了简写`@`
- 事件支持一些指令修饰符,如`prevent`
- 事件参数会自动传递
- v-bind:绑定动态属性
- 该指令由于十分常用,因此提供了简写`:`
- v-show:控制元素可见度
- v-if、v-else-if、v-else:控制元素生成
- v-model:双向数据绑定,常用于表单元素
- 该指令是`v-on`和`v-bind`的复合版
> 进阶指令:
>
> - v-slot
> - v-text
> - v-pre
> - v-cloak
> - v-once
> - 自定义指令
### 特殊属性
最重要的特殊属性:`key`
该属性可以干预`diff算法`,在同一层级,`key`值相同的节点会进行比对,`key`值不同的节点则不会
<img src="http://mdrs.yuanjin.tech/img/20200908124317.png" alt="image-20200908124317168" style="zoom:50%;" />
在循环生成的节点中,`vue`强烈建议给予每个节点唯一且稳定的`key`值
<img src="http://mdrs.yuanjin.tech/img/20200908124819.png" alt="image-20200908124819385" style="zoom:50%;" />
> 其他特殊属性:
>
> - ref
> - is
> - slot
> - slot-scope
> - scope
### 计算属性
```js
computed: {
// 仅访问器
prop(){
return ...
}
// 访问器 + 设置器
fullProp: {
get(){
return ...
},
set(val){
...
}
}
}
```
### 计算属性和方法的区别:
- 计算属性可以赋值,而方法不行
- 计算属性会进行缓存,如果依赖不变,则直接使用缓存结果,不会重新计算
- 凡是根据已有数据计算得到新数据的无参函数,都应该尽量写成计算属性,而不是方法
---
## 05_组件核心概念 59:14
### 知识补充
1. 箭头函数
- 任何可以书写匿名函数的位置均可以书写箭头函数
- 箭头函数将会绑定`this`为函数书写位置的`this`值
2. 模块化
- 没有模块化的世界:全局变量污染、难以管理的依赖
- 常见的模块化标准:CommonJS、ES6 Module、AMD、CMD、UMD
### 组件概念
一个完整的网页是复杂的,如果将其作为一个整体来进行开发,将会遇到下面的困难
- 代码凌乱臃肿
- 不易协作
- 难以复用
vue推荐使用一种更加精细的控制方案——组件化开发
所谓组件化,即把一个页面中区域功能细分,每一个区域成为一个组件,每个组件包含:
- 功能(JS代码)
- 内容(模板代码)
- 样式(CSS代码)
> 由于没有构建工具的支撑,CSS代码暂时无法放到组件中
### 组件开发
###### 创建组件
组件是根据一个普通的配置对象创建的,所以要开发一个组件,只需要写一个配置对象即可
该配置对象和vue实例的配置是**几乎一样**的
```js
//组件配置对象
var myComp = {
data(){
return {
// ...
}
},
computed:{
//...
},
methods:{
//...
},
template: `....`
}
```
值得注意的是,组件配置对象和vue实例有以下几点差异:
- 无`el`
- `data`必须是一个函数,该函数返回的对象作为数据
- 由于没有`el`配置,组件的虚拟DOM树必须定义在`template`或`render`中
#### 注册组件
注册组件分为两种方式,一种是**全局注册**,一种是**局部注册**
### 全局注册
一旦全局注册了一个组件,整个应用中任何地方都可以使用该组件
<img src="http://mdrs.yuanjin.tech/img/2020-02-18-10-24-44.png" style="zoom:50%;" />
全局注册的方式是:
```js
// 参数1:组件名称,将来在模板中使用组件时,会使用该名称
// 参数2:组件配置对象
// 该代码运行后,即可在模板中使用组件
Vue.component('my-comp', myComp)
```
在模板中,可以使用组件了
```html
<my-comp />
<!-- 或 -->
<my-comp></my-comp>
```
> 但在一些工程化的大型项目中,很多组件都不需要全局使用。
> 比如一个登录组件,只有在登录的相关页面中使用,如果全局注册,将导致构建工具无法优化打包
> **因此,除非组件特别通用,否则不建议使用全局注册**
### 局部注册
局部注册就是哪里要用到组件,就在哪里注册
<img src="http://mdrs.yuanjin.tech/img/2020-02-18-10-28-45.png" style="zoom:50%;" />
局部注册的方式是,在要使用组件的组件或实例中加入一个配置:
```js
// 这是另一个要使用my-comp的组件
var otherComp = {
components:{
// 属性名为组件名称,模板中将使用该名称
// 属性值为组件配置对象
"my-comp": myComp
},
template: `
<div>
<!-- 该组件的其他内容 -->
<my-comp></my-comp>
</div>
`;
}
```
#### 应用组件
在模板中使用组件特别简单,把组件名当作HTML元素名使用即可。
但要注意以下几点:
1. **组件必须有结束**
组件可以自结束,也可以用结束标记结束,但必须要有结束
下面的组件使用是错误的:
```html
<my-comp>
```
2. **组件的命名**
无论你使用哪种方式注册组件,组件的命名需要遵循规范。
组件可以使用`kebab-case 短横线命名法`,也可以使用`PascalCase 大驼峰命名法`
下面两种命名均是可以的
```js
var otherComp = {
components:{
"my-comp": myComp, // 方式1
MyComp: myComp //方式2
}
}
```
> 实际上,使用`小驼峰命名法 camelCase`也是可以识别的,只不过不符合官方要求的规范
使用`PascalCase`方式命名还有一个额外的好处,即可以在模板中使用两种组件名
```js
var otherComp = {
components:{
MyComp: myComp
}
}
```
模板中:
```html
<!-- 可用 -->
<my-comp />
<MyComp />
```
因此,在使用组件时,为了方便,往往使用以下代码:
```js
var MyComp = {
//组件配置
}
var OtherComp = {
components:{
MyComp // ES6速写属性
}
}
```
> 注意,`PascalCase`命名不可以直接在html中使用,但可以在template配置中使用
> 想想为什么?
### 组件树
一个组件创建好后,往往会在各种地方使用它。它可能多次出现在vue实例中,也可能出现在其他组件中。
于是就形成了一个组件树
<img src="http://mdrs.yuanjin.tech/img/2020-02-18-11-00-58.png" style="zoom:50%;" />
### 向组件传递数据
大部分组件要完成自身的功能,都需要一些额外的信息
比如一个头像组件,需要告诉它头像的地址,这就需要在使用组件时向组件传递数据
传递数据的方式有很多种,最常见的一种是使用**组件属性 component props**
首先在组件中申明可以接收哪些属性:
```js
var MyComp = {
props:["p1", "p2", "p3"],
// 和vue实例一样,使用组件时也会创建组件的实例
// 而组件的属性会被提取到组件实例中,因此可以在模板中使用
template: `
<div>
{{p1}}, {{p2}}, {{p3}}
</div>
`
}
```
在使用组件时,向其传递属性:
```js
var OtherComp = {
components: {
MyComp
},
data(){
return {
a:1
}
},
template: `
<my-comp :p1="a" :p2="2" p3="3"/>
`
}
```
**注意:在组件中,属性是只读的,绝不可以更改,这叫做单向数据流**
<img src="/Users/yuanjin/Desktop/单向数据流.png" style="zoom:50%;" />
### 工程结构
### 见代码
---
## 06_使用脚手架搭建工程 25:01
### vue-cli的安装
`vue-cli`是一个脚手架工具,它集成了诸多前端技术,包括但不仅限于:
- `webpack`
- `babel`
- `eslint`
- `http-proxy-middleware`
- `typescript`
- `css pre-prosessor`
- `css module`
- ....
这些工具,他们大部分都要依赖两个东西:
- node环境:很多工具的运行环境
- npm:包管理器,用于下载各种第三方库
> 目前,npm已和node集成,当安装node后,会自动安装npm
### 安装node
下载node:https://nodejs.org/zh-cn/
#### 验证安装
打开终端,查看node和npm版本,验证是否安装成功:
```shell
node -v
npm -v
```
> 如果安装之前打开了终端,需要在安装后关闭终端,重新打开
#### 配置源地址
默认情况下,`npm`安装包时会从国外的地址下载,速度很慢,容易导致安装失败,因此需要先配置`npm`的源地址
使用下面的命令更改`npm`的源地址为淘宝源
```shell
npm config set registry http://registry.npm.taobao.org/
```
更改好了之后,查看源地址是否正确的被更改
```shell
npm config get registry
```
#### 安装vue-cli
使用下面的命令安装`vue-cli`工具
```shell
npm install -g @vue/cli
```
安装好之后,检查`vue-cli`是否安装成功
```shell
vue --version
```
### vue-cli的使用
#### 在终端中进入某个目录
选择一个目录,该目录将放置你的工程文件夹
在终端中进入该目录
#### 搭建工程
使用`vue-cli`提供的命令搭建工程
```shell
vue create 工程名
```
> 注意:工程名只能出现英文、数字和短横线
### 理解工程结构
### 视频描述
---
## 07_开发通用组件 30:15 沒筆記
---
## 08_自定义事件 18:19 沒筆記
---
## 09_开发频道菜单 20:50 沒筆記
---
## 10_获取频道数据 24:44
---
### 远程获取数据:
<img src="http://mdrs.yuanjin.tech/img/20200911131358.png" alt="image-20200911131358157" style="zoom:50%;" />
### 跨域问题:
<img src="http://mdrs.yuanjin.tech/img/20200911131438.png" alt="image-20200911131438944" style="zoom:50%;" />
在**开发环境中**解决跨域问题:
<img src="http://mdrs.yuanjin.tech/img/20200911131606.png" alt="image-20200911131606337" style="zoom:50%;" />
---
## 11_完成频道列表组件 41:28 沒筆記
---
## 12_继续完善频道列表 20:42 沒筆記
---
## 13_搜索框组件 46:27 沒筆記
---
## 14_侧边栏和页面组件 25:46 沒筆記
---
## 15_尾声:学无止境 10:32 沒筆記
{"metaMigratedAt":"2023-06-17T14:36:36.680Z","metaMigratedFrom":"Content","title":"袁老師Vue筆記整理","breaks":true,"contributors":"[{\"id\":\"dcd723a5-d45a-499f-a133-b3770196053f\",\"add\":8965,\"del\":466}]"}