# vue2 **Repository Path**: voyagerlemon/vue2 ## Basic Information - **Project Name**: vue2 - **Description**: vue2相关知识点 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-09-04 - **Last Updated**: 2022-09-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 脚手架文件结构 ├── node_modules ├── public │ ├── favicon.ico: 页签图标 │ └── index.html: 主页面 ├── src │ ├── assets: 存放静态资源 │ │ └── logo.png │ │── component: 存放组件 │ │ └── HelloWorld.vue │ │── App.vue: 汇总所有组件 │ │── main.js: 入口文件 ├── .gitignore: git版本管制忽略的配置 ├── babel.config.js: babel的配置文件 ├── package.json: 应用包配置文件 ├── README.md: 应用描述文件 ├── package-lock.json:包版本控制文件 ## 关于不同版本的Vue 1. vue.js与vue.runtime.xxx.js的区别: 1. vue.js是完整版的Vue,包含:核心功能 + 模板解析器。 2. vue.runtime.xxx.js是运行版的Vue,只包含:核心功能;没有模板解析器。 2. 因为vue.runtime.xxx.js没有模板解析器,所以不能使用template这个配置项,需要使用render函数接收到的createElement函数去指定具体内容。 ### 什么是 vue 1. 构建用户界面 - 用 vue 往 html 页面中填充数据,非常的方便 2. 框架 - 框架是一套现成的解决方案,程序员只能遵守框架的规范,去编写自己的业务功能! - 要学习 vue,就是在学习 vue 框架中规定的用法! - vue 的指令、组件(是对 UI 结构的复用)、路由、Vuex、vue 组件库! ### vue特性 1. 数据驱动视图 ​ vue会监听数据的变化,从而自动重新渲染页面的结构。 ​ 好处:当页面结构发生变化时,页面会自动重新渲染; ​ 注意:数据驱动视图是单向数据绑定。 1. 双向数据绑定 ​ 在网页中,form表单负责采集数据,Ajax负责提交数据。 - js数据的变化,会被自动渲染到页面上; - 页面上表单采集的数据发生变化的时候,会被vue自动获取到,并更新到js数据中。 MVVM是vue实现数据驱动视图双向数据绑定的核心原理,MVVM指的是Model、View和ViewModel,它把 每个HTML页面拆分成了这三个部分。 Model表示页面渲染时所依赖的数据源;View表示当前页面所渲染的DOM结构;ViewModel表示vue实例, 是MVVM的核心。 ViewModel 作为 MVVM 的核心,是它把当前页面的数据源(Model)和页面的结构(View)连接在了一起。 当数据源发生变化时,会被 ViewModel 监听到,VM 会根据最新的数据源自动更新页面的结构 当表单元素的值发生变化时,也会被 VM 监听到,VM 会把变化过后最新的值自动同步到 Model 数据源中 ### vue 指令 指令(Directives)是vue为开发者提供的模板语法,用于辅助开发者渲染页面的基本结构。 #### 1. 内容渲染指令 内容渲染指令用来辅助开发者渲染 DOM 元素的文本内容。常用的内容渲染指令有如下 3 个: 1. `v-text` 指令的缺点:会覆盖元素内部原有的内容! 2. `{{ }}` 插值表达式:在实际开发中用的最多,只是内容的占位符,不会覆盖原有的内容! 3. `v-html` 指令的作用:可以把带有HTML标签的字符串,渲染成真正的 HTML 内容! #### 2. 属性绑定指令 > 注意:插值表达式只能用在元素的**内容节点**中,不能用在元素的**属性节点**中! - 在 vue 中,可以使用 `v-bind:` 指令,为元素的属性动态绑定值; - 简写是英文的 `:` - 在使用 v-bind 属性绑定期间,如果绑定内容需要进行动态拼接,则字符串(如:box)的外面应该包裹单引号,例如: ```xml
这是一个 div
``` #### 3. 事件绑定 1. `v-on:` 简写是 `@` 2. 语法格式为: ```xml methods: { add() { // 如果在方法中要修改 data 中的数据,可以通过 this 访问到 this.count += 1 } } ``` 3. `$event` 的应用场景:如果默认的事件对象 e 被覆盖了,则可以手动传递一个 $event。原生DOM事件对象。例如: ```js methods: { add(n, e) { // 如果在方法中要修改 data 中的数据,可以通过 this 访问到 this.count += n } } ``` 4. 事件修饰符: - `.prevent` ```js 链接 // 阻止链接的默认行为 ``` - `.stop` ```js // 阻止链接的冒泡 ``` 5. 按键修饰符: * 在监听键盘事件时,我们经常需要检查详细的按键。Vue 允许为 `v-on` 在监听键盘事件时添加按键修饰符: ```js ``` * `@keyup` ```js ``` #### 4. v-model 指令 1. input 输入框 - type="radio" - type="checkbox" - type="xxxx" 2. textarea 3. select 4. v-model提供了三个修饰符 * .lazy ```html 取代 `input` 监听 `change` 事件,中间的变化结果不会同步到数据源中。 ``` * .number ```HTML 输入字符串转为有效的数字 ``` * .trim ```html 输入首尾空格过滤 ``` #### 5. 条件渲染指令 1. `v-show` 的原理是:动态为元素添加或移除 `display: none` 样式,来实现元素的显示和隐藏 - 如果要频繁的切换元素的显示状态,用 v-show 性能会更好 2. `v-if` 的原理是:每次动态创建或移除元素,实现元素的显示和隐藏,可以单独使用。 - 如果刚进入页面的时候,某些元素默认不需要被展示,而且后期这个元素很可能也不需要被展示出来,此时 v-if 性能更好 > 在实际开发中,绝大多数情况,不用考虑性能问题,直接使用 v-if 就好了!!! v-if 指令在使用的时候,有两种方式: 1. 直接给定一个布尔值 true 或 false ```js

被 v-if 控制的元素

``` 2. 给 v-if 提供一个判断条件,根据判断的结果是 true 或 false,来控制元素的显示和隐藏 ```js

良好

``` 3. v-else * `v-else` 元素必须紧跟在带 `v-if` 或者 `v-else-if` 的元素的后面,否则它将不会被识别。 ```js

较差

``` 4. v-else-if * `v-else-if`,顾名思义,充当 `v-if` 的“else-if 块”,可以连续使用,类似于 `v-else`,`v-else-if` 也必须紧跟在带 `v-if` 或者 `v-else-if` 的元素之后。 ```js
良好
``` #### 6. 列表渲染指令 ​ 1. v-for ​ 当和 `v-if` 一起使用时,`v-for` 的优先级比 `v-if` 更高。 ​ `v-for` 指令基于一个数组来渲染一个列表。`v-for` 指令需要使用 `item in items` 形式的特殊语法,其中 `items` 是源数据数组,而 `item` 则是被迭代的数组元素的**别名**。 ```js {{ item.id }} ``` ​ ​ v-for 指令还支持一个可选的第二个参数,即当前项的索引。语法格式为 (item, index) in items ```js {{ index }} ``` ​ 当列表的数据变化时,默认情况下,vue 会尽可能的复用已存在的 DOM 元素,从而提升渲染的性能。但这种默认的性能优化策略,会导致有状态的列表无法被正确更新。 ​ 为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,需要为每项提供一个唯一 `key`。 ​ 使用 index 的值当作 key 的值没有任何意义(因为 index 的值不具有唯一性)一定要把 id 作为 key 的值(既提升性能、又防止列表状态紊乱),官方对 key 的值类型,是有要求的:字符串或数字类型,key 的值是千万不能重复的,否则会终端报错:Duplicate keys detected。 ```js {{ item.name }} ``` ### vue过滤器 过滤器仅在 vue 2.x 和 1.x 中受支持,**在 vue 3.x 的版本中剔除了过滤器相关的功能**。 过滤器(Filters)是 vue 为开发者提供的功能,常用于文本的格式化。过滤器可以用在两个地方:插值表达式 和 v-bind 属性绑定。 过滤器应该被添加在 JavaScript 表达式的尾部,由“管道符”进行调用。 ```js

message的值是: {{ message | capitalize}}

``` 过滤器可以串联地进行调用,把message的值交给capitalize进行处理,再把capitalize处理的结果交给capitalize2进行处理,最终把capitalize2处理的结果,作为最终值渲染到页面上 ```js {{ message | capitalize | capitalize2 } ``` 过滤器的本质是 JavaScript 函数,因此可以接收参数。 ```js

message的值是: {{ message | capitalize(arg1, arg2)}}

// msg的形参一定要是“管道符”前面的值,永远占第一位 Vue.filter("capitalize", (msg, arg1, arg2) => { // 过滤器的代码逻辑 }); ``` * 声明过滤器 * 私有过滤器 在 filters 节点下定义的过滤器,称为“私有过滤器”,因为它只能在当前 vm 实例所控制的 el 区域内使用。 ```js // 过滤器函数必须被定义到filters节点之下,与data、methods等平级 // 过滤器本质上是函数 filters: { // 过滤器函数形参中的val永远都是“管道符”前面的值 capitalize(val) { // 字符串有charAt方法,接收索引值,表示从字符串中把索引对应的字符获取出来 const first = val.charAt(0).toUpperCase(); // 字符串的slice方法可以截取字符串,从指定索引往后截取 const other = val.slice(1); // 过滤器中一定要有一个返回值 return first + other; } } ``` * 全局过滤器 如果希望在多个 vue 实例之间共享过滤器,则可以按照如下的格式定义全局过滤器。 ```js // 使用Vue.filter()定义全局过滤器,str是“管道符”前面的值 // 可以写成普通函数,也可以写成箭头函数 Vue.filter("capitalize", (str) => { const first = str.charAt(0).toUpperCase(); const other = str.slice(1); return first + other; }); ``` 格式化时间: ```js Vue.filter('dateFormat', function (time) { // 1. 对 time 进行格式化处理,得到 YYYY-MM-DD HH:mm:ss // 2. 把 格式化的结果,return 出去 // 使用了dayjs库 // 直接调用 dayjs() 得到的是当前时间 // dayjs(给定的日期时间参数) 得到指定的日期 const dtStr = dayjs(time).format('YYYY-MM-DD HH:mm:ss') return dtStr }) ``` > 注意:如果全局过滤器和私有过滤器名字一致,此时按照“**就近原则**”,调用的是”私有过滤器“ ### watch侦听器 #### 1. 什么是侦听器 watch 侦听器允许开发者监视数据的变化,从而针对数据的变化做出特定的操作。 ## 脚手架文件结构 ``` ├── node_modules ├── public │ ├── favicon.ico: 页签图标 │ └── index.html: 主页面 ├── src │ ├── assets: 存放静态资源 │ │ └── logo.png │ │── component: 存放组件 │ │ └── HelloWorld.vue │ │── App.vue: 汇总所有组件 │ │── main.js: 入口文件 ├── .gitignore: git版本管制忽略的配置 ├── babel.config.js: babel的配置文件 ├── package.json: 应用包配置文件 ├── README.md: 应用描述文件 ├── package-lock.json:包版本控制文件 ``` ## 关于不同版本的Vue 1. vue.js与vue.runtime.xxx.js的区别: 1. vue.js是完整版的Vue,包含:核心功能 + 模板解析器。 2. vue.runtime.xxx.js是运行版的Vue,只包含:核心功能;没有模板解析器。 2. 因为vue.runtime.xxx.js没有模板解析器,所以不能使用template这个配置项,需要使用render函数接收到的createElement函数去指定具体内容。 ## vue.config.js配置文件 1. 使用vue inspect > output.js可以查看到Vue脚手架的默认配置。 2. 使用vue.config.js可以对脚手架进行个性化定制,详情见:https://cli.vuejs.org/zh ## ref属性 1. 被用来给元素或子组件注册引用信息(id的替代者) 2. 应用在html标签上获取的是真实DOM元素,应用在组件标签上是组件实例对象(vc) 3. 如果给标签写的是id(=sch)的话,(document.getElementById("sch"))获取到的是组件所对应的完整DOM结构 4. 使用方式: 1. 打标识:```

.....

``` 或 `````` 2. 获取:```this.$refs.xxx``` ## props配置项 1. 功能:让组件接收外部传过来的数据 2. 传递数据:`````` 3. 接收数据: 1. 第一种方式(只接收):```props:['name'] ``` 2. 第二种方式(限制类型):```props:{name:String}``` 3. 第三种方式(限制类型、限制必要性、指定默认值): 4. ```js props:{ name:{ type:String, //类型 required:true, //必要性 default:'老王' //默认值 } } ``` > 备注:props是只读的,Vue底层会监测你对props的修改,如果进行了修改,就会发出警告,若业务需求确实需要修改,那么请复制props的内容到data中一份,然后去修改data中的数据。 ## mixin(混入) 1. 功能:可以把多个组件共用的配置提取成一个混入对象 2. 使用方式: 第一步定义混合: ``` { data(){....}, methods:{....} .... } ``` 第二步使用混入: ​ 全局混入:```Vue.mixin(xxx)``` ​ 局部混入:```mixins:['xxx'] ``` ## 插件 1. 功能:用于增强Vue 2. 本质:包含install方法的一个对象,install的第一个参数是Vue,第二个以后的参数是插件使用者传递的数据。 3. 定义插件: ```js 对象.install = function (Vue, options) { // 1. 添加全局过滤器 Vue.filter(....) // 2. 添加全局指令 Vue.directive(....) // 3. 配置全局混入(合) Vue.mixin(....) // 4. 添加实例方法 Vue.prototype.$myMethod = function () {...} Vue.prototype.$myProperty = xxxx } ``` 4. 使用插件:```Vue.use()``` ## scoped样式 1. 作用:让样式在局部生效,防止冲突。 2. 写法:```