# 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 指令在表单