# vue-cli
**Repository Path**: zhang-yuqing1101/vue-cli
## Basic Information
- **Project Name**: vue-cli
- **Description**: vue-cli脚手架相关
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-12-26
- **Last Updated**: 2023-01-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Vue2 课堂笔记
## 每日彩蛋
1. 说明 `a = b = c = d = 1;`的执行过程
- 查阅 MDN 的运算符优先级文档,找到赋值(=)运算符,发现多个=在一个表达式中是从右向左执行的
- `c=d=1`是先执行`d=1`,然后把`d=1`的返回值赋值给 c
- 赋值(=)操作符的返回值:返回=右侧的值,所以`d=1`返回 1,然后把 1 再赋值给 c
- 后边依次类推
2. `for(var i = 0,j = 0; i < 5, j < 10; i++,j++){语句}` 请问当前 for 循环的循环次数??为什么
- 首先直到 for 循环是否能够向下继续循环,只要看 for 中的判断式
- 判断式是多个,由逗号运算符间隔开,我们就要考虑逗号运算符的返回值
- 逗号运算符如果出现多个,则从左向右执行,并返回逗号右侧的值
- 所以当前的循环主要看 j 的次数来决定整个循环的次数
3. 代码题:请得到 7 天以后的现在的时间
- 方式 1
```js
//1. 获取当前的时间
new Date();
//2. 获取当前时间的日期
new Date().getDate();
//3. 获取目标时间的日期
new Date().getDate() + 7;
//4. 获取当前的时间,把日期修改为目标日期
new Date().setDate(new Date().getDate() + 7);
```
- 方式 2
```js
//1. 得到7天以后的时间戳
Date.now() + 1000 * 60 * 60 * 24 * 7;
//2.创建一个时间,把7天以后的时间戳交给参数
new Date(Date.now() + 1000 * 60 * 60 * 24 * 7);
```
4. 代码题:'abaabgfdebbafefgefsrsbabesseeeeaa' 请计算每一个字母出现的次数,及出现最多次数的字母
```js
const str = "abaabgfdebbaefefgfsrsbabesseeeeaa";
//1.创建一个对象,用来保存每一个字符出现的次数
const obj = {};
//2. 遍历字符串的每一个字符,然后去对象中判断,如果对象中不存在,则给对象新增一个属性默认值为1,如果对象存在,则把对象的值+1
for (let key of str) {
obj[key] ? obj[key]++ : (obj[key] = 1);
}
console.log(obj);
//3. 先初始化一个值用来保存出现最多的key,再初始化一个值用来保存出现最多key的次数
let bigStr = "";
let bigStrNum = 0;
//4. 遍历对象,一个的判断
for (let key in obj) {
//如果当前遍历出的新值的次数 大于目前保存的次数,那你牛逼,我们跟你
if (obj[key] > bigStrNum) {
bigStr = key;
bigStrNum = obj[key];
}
}
console.log(bigStr, bigStrNum);
```
5. 让一个字符串的首字母大写,比如 "hello every one"--->"Hello every one"
6. 让一个字符串所有单词的首字母大写,比如"hello every one"--->"Hello Every One"
7. 数组去重的方法(3 种)
8. 封装一个 myNew 函数实现 new 操作符,如下,让 p1 和 p2 有一样的效果
```js
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.do = function () {};
//原始new
const p1 = new Person("xiaowang", 18);
//手动封装new
const p2 = myNew(Person, "xiaowang", 18);
```
9. 让一个不定宽高的元素在容器中水平垂直居中的方式(3 种方式)
10. 给按钮绑定点击事件,频繁点击按钮时让事件最少间隔 1s 才能触发一次(节流),并且封装通用函数
11. 什么是事件流(事件机制)
- 事件冒泡:事件从最精确的元素(target)开始向最不精确的元素(document)依次传播
- 事件捕获:事件从最不精确的元素(document)开始向最精确的元素(target)依次传播
- W3C 事件流:
当事件触发,先执行捕获过程
再执行目标元素的事件(target)
在执行冒泡过程
12. 在输入框输入内容后,等待 1s 后发送请求,如果 1s 内输入框内容改变了,则重新等待 1s(防抖)
13. 我们要拷贝一个对象(深拷贝和浅拷贝)的做法
14. 整理 HTML5 新特性有哪些
- 语义性标签,header\footer\nav\aticle\section
- 增强表单,input 的多种 type 类型(tel\month\email\number\color.....)
- 音频视频
- WebWorker:开启多线程
- WebStorage:本地存储
- WebSocket:是一种通信协议
- Canvas:画布
15. 整理 CSS3 新特性有哪些
- 选择器
- 边框,阴影,背景,渐变
- 变形
- 过渡动画
- 关键帧动画
- flex
- @media 媒体查询
16. 整理 ES6 新特性有哪些
- let 和 const
- 解构赋值
- 新增数据类型(symbol,bigint)
- 新增的数据结构(map,set)
- iterator 接口(for..of..,解构,扩展运算符原理)
- promise/async/await
- class 类
- es6 模块化
- 新增的对象字符串等方法
17. 用 css 画一个三角形
18. 描述 undefined 和 null 的区别?????
- null 代表空,undefined 代表的是找不到
- undefined 出现的场景
- 声明一个变量没有赋值,则变量值是 undefined
- 获取一个对象没有的属性时,则值是 undefined
- 函数没有 return 值,则函数的返回值就是 undefined
- 函数的形参没有被赋值,则这个形参的值是 undefined
- null 出现的场景
- 原型链的终点是 null(防止原型链死循环)
- 声明变量此时不想赋值,可以先赋值为 null
- 调用函数传参占位
- 把一个对象的引用移除,把这个对象变成垃圾对象
19. 已知一个网页地址`http://www.baidu.com?a=1&b=2&c=3`,请封装一个方法提炼出这个地址中的参数,并以对象形式返回{a:1,b:2,c:3}
20. 封装一个扁平化数组的函数(flat),[1,[2,[3,4],5],6]====>[1,2,3,4,5,6]
21. 封装一个函数,求数组的交集,[1,2,3,4],[2,3,5,6]===>[2,3]
22. 封装一个函数,接收一个数字作为参数,检查它是不是 4 的次方数,如果是则返回 true,否则返回 false(进阶:不使用递归)
23. 后台给了一组数据,但是这组数据不是我们想要的
```js
const obj = [
{id:3,parent:2},
{id:1,parent:null},
{id:2,parent:1}
{id:4,parent:1}
]
```
把这个数据转为我们需要的格式
```js
const result = {
id: 1,
parent: null,
children: [
{
id: 2,
parent: 1,
children: [
{
id: 3,
parent: 2,
},
],
},
{
id: 4,
parent: 1,
},
],
};
```
## 复习--git
- 01.git 操作复习
1. 初始化本地仓库(`git init`)
2. 本地仓库提交(`git add . `, `git commit -m 'init/add/fixed/docs:xxxxxx'`)
3. 新建远程仓库,拿到远程仓库的 ssh 地址
4. 把本地仓库和远程仓库关联(`git remote add origin xxxxxxxxx`)
5. 把本地仓库向远程仓库提交(第一次:`git push -u origin master`,第二次:`git push`)
6. 去到当前仓库中的管理页面,把当前项目设置为开源
7. 拉取其他人代码(`git clone xxxx`||`git pull`)
8. 撤销工作区的改动(`git restore .`)
9. 取消远程仓库的关联(`git remote remove origin`)
- 02.免密登录的配置
1. 配置本地 git 用户名和 gitee 的用户名一致:`git config --global user.name "username"`
2. 配置本地 git 邮箱和 gitee 的邮箱一致:`git config --global user.email "email"`
3. 在任意命令行位置书写`ssh-keygen`,生成秘钥,拿到公钥的地址
4. 用记事本打开公钥文件,复制里边内容
5. 去 gitee 的公钥配置中,添加公钥,即可使用 ssh 免密操作
## Vue 学习需要使用的插件
- vscode 的 vue2 插件:
- Vetur -- Pine Wu
- Vue 3 Snippets----hollowtree
- vue-helper --- shenjiaolong
- 其他插件:
- vscode-icons 文件列表图标插件
- Prettier - Code formatter 格式化插件
## Vue 基础概念
1. MVVM 模型
- MVVM(Model-View-ViewModel)是一种软件架构设计模式
- MVVM 分为三个部分:分别是 M(Model,模型层 ),V(View,视图层),VM(ViewModel,视图数据层,V 与 M 连接的桥梁,也可以看作为控制器)
- M:模型层,值得是数据模型,主要负责业务数据相关;
- V:视图层,顾名思义,负责视图相关,细分下来就是 html+css 层,为了更方便的展示 Model 层的数据;
- VM:V 与 M 沟通的桥梁,负责监听 M 或者 V 的修改,是实现 MVVM 双向绑定的要点
- ViewModel 是 Vue.js 的核心,它是一个 Vue 实例,MVVM 支持双向绑定,意思就是当 M 层数据进行修改时,VM 层会监测到变化,并且通知 V 层进行相应的修改,反之修改 V 层则会通知 M 层数据进行修改
2. new Vue(options)中基础配置项
- el:配置项,代表当前 vue 实例要挂载的容器,可以是一个选择器的字符串,也可以是已经获取的 DOM 元素
- template:配置项,一个字符串模板。模板将会替换容器
- data:Vue 实例的数据对象
3. $mount 挂载
- 如果 Vue 实例在实例化时没有收到 el 选项,则它处于“未挂载”状态,没有关联的 DOM 元素。
- 可以使用 vm.$mount() 手动地挂载一个未挂载的实例。
- 接受的参数可以是选择器 string,也可以是一个获取的 DOM 元素,作为容器
- 我们可以使用$mount 进行异步挂载
4. 模板的语法糖写法
- 容器内部也可以进行书写模板,切记不是 DOM,而是模板
- 在 vue 实例化过程中,如果选项中存在 template 选项,则把 template 选项的内容作为模板替换容器
- 如果选项中不存在 template,则把容器的 outerHTML 作为模板
5. data 配置项详解
- data 可以是一个对象,是 Vue 实例的数据对象
- data 的数据会在实例对象 vm 上作为属性存放起来
- data 也可以是一个函数,返回一个对象,对象中存放当前实例需要的数据,并且建议是一个函数
- 为什么组件内的 data 要书写为一个函数???? 01. 当一个组件被定义,data 必须声明为返回一个初始数据对象的函数 02. 因为组件可能被用来创建多个实例(组件可能被复用)。 03. 如果 data 仍然是一个纯粹的对象,则所有的实例将共享引用同一个数据对象!则数据就会互相影响 04. 通过提供 data 函数,每次创建一个新实例后,我们能够调用 data 函数,从而返回初始数据的一个全新副本数据对象。
6. 插值语法注意事项:
- 插值语法中的变量都是从当前的 vm 对象上去寻找的
- 插值语法中可以书写任意表达式(由一个或者多个变量或值 配合 0 个或多个运算符组成的 被称作为表达式,表达式都会有返回值),不能书写语句
- 插值的变量可以是任意类型的,按照一定的规则转为字符串展示(Symbol 除外)
## 指令系统
### 01. 什么是指令
- 指令 (Directives) 是带有 v- 前缀的特殊 attribute。指令 attribute 的值预期是单个 JavaScript 表达式 (插值语法区域)。
- 指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM
### v-bind
1. v-bind 的基础使用
- 模板中的属性值默认都是字符串格式的!!!
- 如果希望属性值的区域是一个插值语法区域,我们就可以使用 v-bind 指令
- v-bind:强制绑定(动态绑定):把一个模板中属性的值区域变成插值语法区域,在插值语法区域中可以执行表达式,也可以去实例上拿值
- v-bind 可以直接简写为 `:`
- 在 v-bind 中我们经常的去拼接一些值,方法如下 01. `
` 02. `
`
2. v-bind 动态类的设置
- 什么时候使用动态类?当类名是通过数据来控制是否添加的时候,才会使用动态类
- 情况 1-字符串:当动态类只有一个类的时候,我们可以直接使用三元等表达式,返回一个字符串即可
- 情况 2-对象:当动态类的类有一个或者多个的时候(固定个数),我们可以给动态类设置一个对象,每一个类名都是对象的 key,值是一个布尔值代表是否开启当前的类
- 情况 3-数组:当动态类的类有一个或多个,不确定数量的时候,可以使用数组,只要在数组中的类都会添加到 DOM 上,不能开启和关闭,但是可以操作数组来控制类
3. v-bind 动态 style 的设置
- v-bind 可以使用动态的 style 控制元素的样式
- 动态的 style 可以接受一个对象,对象的 key 就是 style 的属性,对象的值就是 style 的值,对象的值可以使用插值来进行实现
- 动态类 style 可以接受一个数组,数组中可以包含多个动态类对象
4. 批量强制绑定
- 很多时候我们需要把对象中的属性一个个的绑定在元素或者组件上,我们可以使用批量绑定
- v-bind 批量绑定 直接使用 v-bind="需要展开的对象名即可",此种写法不能简写
### v-on 事件绑定
1. 事件的书写和 methods 选项
- 使用 v-on 执行给模板绑定原生事件
``
- 事件函数写在哪里?
- 原则上来说,在 data 中书写函数,并且是箭头函数,函数内的 this 是指向当前的 vue 实例对象,但是一旦写成了普通函数,则 this 指向全局 window,严格模式下会指向 null,都不是我们想要的,但是我们不会把函数书写在 data 中,1.必须书写箭头函数 2.函数和数据混杂在一起不容易维护(data 就是为了写数据的)
- methods 选项中用来书写方法,比如事件回调函数,也有我们自己封装的函数等。methods 中的方法已经被 vue 统一处理过了,vue 控制 methods 中所有的方法的 this 指向当前的 vue 实例,为什么要把 methods 方法的 this 指向 vm 实例呢?因为方法一般都是用来操作数据的,而数据都在 vm 实例上放
- methods 中的方法也会全部的放在 vm 实例上,供我们使用
2. event 事件对象的获取
- 默认事件函数接收的第一个参数就是 event 事件对象(js 的 event 对象),我们可以直接接收使用
- e.target 就能获取当前事件所在的元素(真实 DOM)
- 当事件函数传递参数的时候,则事件函数的第一个参数不再默认是 event 事件对象了,在事件指令的插值语法区域,默认存在着一个变量$event代表的就是当前事件的event事件对象,如果传参的事件函数需要event事件对象,我们可以直接把$event 显性的传递进事件函数中
3. 事件函数的传参
- 如果想要给事件函数传递参数,则在绑定事件函数的时候,直接书写参数即可
- 在代码运行的时候,只要我们不触发事件,事件属性值的内容是不会有任何执行的
- 当事件触发以后,事件属性值内部的代码才会触发执行,并直接传入的参数
4. 事件逻辑的简单写法
- 如果事件的逻辑很简单,只是简单的一句操作数据,则可以不用书写函数,直接把逻辑写在事件的插值中即可
5. 事件修饰符
- 修饰符是对某条指令的补充
- .stop:阻止事件传播
- .capture:让当前的事件在捕获的阶段执行
- .prevent:阻止默认事件
- .self:只有事件真正发生在自己身上的时候才会触发
- .once:一次性事件
- .enter:按键修饰符-回车键
- ... 其他按钮修饰符
### v-model 数据双向绑定
1. v-model 的基础使用
- v-model 指令在表单 、