```
4. 事件修饰符
```html
修饰符写法:
.stop 阻止冒泡
.prevent 阻止默认行为
.capture 将事件触发改成捕获形式
.self 绑定在外层元素上来阻止冒泡的
.once 事件值触发一次
.passive 滚轮事件修饰符,加了该修饰符,先滚动页面,再执行滚动的回调
键盘的
.enter 回车按键
.13 回车按键
```
## day03
### 模板中绑定事件 - 深入说明
```html
```
* 结论:
* 在模板中绑定事件的时候:
* 没有加小括号,此时底层执行就是执行的methods中配置的方法
* 如果加了小括号,就是自己在调用,此时底层会套一层函数
* 那么如果此时有this,this的指向会发生改变(因为套的那层函数是全局调用的)
* 这个this在非严格模式下指向window
* 在严格模式下是undefined,会报错
* 所以:
* 之后在模板中写代码的时候,尽量不要加 this
### 收集表单数据
收集表单数据包含所有的表单元素,input的type类型来决定:
text、password、radio、checkbox、selecte-option、
textarea
收集数据使用v-model指令来时候
* 注意:
* radio 收集的时候,需要使用name属性将选择的选项绑定成一组,最终选择的是一个值
* checkbox
* 当是一组checkbox的时候,绑定获取的数据是一个数组
* 当是单独一个checkbox的时候,绑定获取的数据是一个值
收集完数据要做的事情:
1. 整理数据
2. 校验数据
3. 发送请求
### vue内置指令
* v-text
* v-html
* v-show
* v-if
* v-else
* v-else-if
* v-for
* v-on
* v-bind
* v-model
* v-slot
* v-pre
* v-cloak
* v-once
问题:
v-if 和 v-for可以一起使用吗?
可以的
v-if 和 v-for 这两个指令哪一个优先级高?
v-for 的优先级高
### 过渡和动画
步骤:
1. 将过渡的内容放到 transition 标签中
2. 书写类名
* v-enter、v-enter-to、v-enter-active
* v-leave、v-leave-to、v-leave-active
* 三个类名对应是起始状态、结束状态、中间过渡状态,一般会在 -active 中添加 transition css属性 或者 animation css动画
3. 使用数据来控制元素改变
> 注意: 当页面中有多个过渡元素的时候,需要给 transtion 标签设置[name属性值],
> 类名将变成 v-[name属性值]
### 生命周期
| 生命周期钩子 | 说明 |
| ------------- | ------------------------------------------ |
| beforeCreate | 创建前,可以获取到this,获取不到数据和方法 |
| created | 创建后,可以获取到this,可以获取到数据和方法 |
| beforeMount | 挂在前,获取不到DOM元素 |
| mounted | 挂在后,可以获取到DOM元素 |
| beforeUpdate | 更新前,数据已经更新,DOM没有更新 |
| updated | 更新后,数据已经更新,DOM更新 |
| beforeDestroy | 销毁前,watch,事件监听,DOM元素都在 |
| destroyed | 销毁后,watch,事件监听,DOM元素都不在 |
### 自定义过滤器
步骤:
1. 写过滤器名称
2. 写过滤器处理函数
```html
{{ num | addTen }}
{{ num | subTen }}
```
例子:
格式化事件的过滤器
## day04
### 自定义指令
步骤:
1. 指令名称
2. 回调函数
```html
```
### 自定义插件
1. 定义插件
2. 使用插件
```js
// 定义插件: 插件必须有 install方法
let plugin = {}
plugin.install = () => {}
// 使用插件
// 注意:Vue.use()本质上是在调用插件的install方法
Vue.use(plugin)
```
### 自定义组件之非单文件组件
步骤:
1. 定义组件
Vue.extend({}) 参数是一个配置对象,这个配置对象和`new Vue()`时候的配置对象一摸一样,唯独不一样的地方是这个配置对象中没有el这个配置项,返回值是一个组件的构造函数
2. 注册组件
* 全局注册
Vue.component('组件名', 组件构造函数)
* 局部注册
```js
new Vue({
...
// 局部注册
components: {
组件名: 组件的构造函数
}
})
```
* 全局注册在哪都能用,局部注册只能在当前实例中使用
3. 使用组件
```html
<组件名>组件名>
```
> 注意: 组件注册有简写, Vue.componet('组件名', 配置对象),相当于步骤1和步骤2合并了,定义并注册
### 自定义组件之单文件组件
一个`.vue`文件就是一个组件,步骤也是三步:
1. 定义组件: 定义一个`xxx.vue`文件即可
```vue
模板中要有一个跟节点
```
2. 注册组件
```js
import xxx from './components/xxx.vue'
new Vue({
components: {
xxx
}
})
```
3. 使用组件
```html
```
> 注意: 在传统引入vue.js的形式中,不能使用单文件组件,需要上脚手架工具
>
> 1. js中不支持ES6的语法
> 2. 不识别.vue文件
### 脚手架 - 创建项目
1. 打开cmd命令行窗口
2. 安装`vuecli`脚手架工具
npm install -g @vue/cli
如果觉得慢,使用cnpm安装
cnpm install -g @vue/cli
3. 验证安装成功,cmd窗口中输入以下内容
`vue -V`
如果出现版本号,代表脚手架的版本号,脚手架安装成功
4. 跳转到桌面,创建一个vue项目
cd Desktop
vue create vue-demo
注意:项目的名称不能有中文

第一项: 创建vue3项目
第二项: 创建vue2项目
第三项: 创建自定义配置项目
我们目前选择vue项目,使用上下按钮键选中,然后回车
5. 使用vscode打开项目,直接新建vscode窗口,把桌面上刚刚创建的项目拖进来即可
为了让vscode打开的就当前这一个项目

注意,需要跳转到 vue-demo 目录下,再执行`npm run serve`启动项目
### 项目的目录介绍

node_modules 依赖包
public 静态资源
favicon.ico 浏览器页签上的图标
index.html 我们启动的项目打开的页面就是这个页面
src 所有我们写的代码都放在src这个目录中
main.js 入口文件
App.vue
components 文件夹放组件
assets 静态资源
.gitugnore 配置git忽略文件
babel.config.js babel的配置文件
jsconfig.json js相关的配置
package-lock.json 当前项目的依赖包的依赖包信息
package.json 管理当前项目依赖、运行指令等
vue.config.js 可以配置一些webpack的配置项
> public 和 assets 的区别?
>
> public 中的内容在打包的时候,不会经过webpack处理
>
> assets 中的内容,会在打包的时候进行处理,压缩、文件名被修改等
### eslint 语法检查 - 关闭
var一个变量不使用,eslint会检测到这个变量,并且会报一个错误,如何解决:
1. 单文件禁用ellist
在代码开始处输入以下注释即可
```js
/* eslint-disable no-unused-vars */
```
> 缺点: 只能在这一个文件中禁用eslint, 不推荐
2. 在eslint配置`rules`的地方,配置规则

> 注意: 修改配置文件之后,需要重启项目才可生效
>
> ellint规则地址: https://eslint.bootcss.com/docs/rules/
3. 在`vue.config.js`中配置禁用eslint
```js
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
transpileDependencies: true,
// 关闭eslint校验
lintOnSave: false
})
```
> 这里也修改了配置文件,需要重启才可生效
### vue渲染的两种方式
1. 不带模板编译器的渲染(官方默认)
```js
import Vue from 'vue' // 不含模板编译器的vue
import App from './App.vue'
Vue.config.productionTip = false
new Vue({
render: h => h(App),
}).$mount('#app')
```
2. 带有模板编译器的渲染(我们学习)
```js
import Vue from 'vue/dist/vue.js' // 包含模板编译器的vue
import App from './App.vue'
new Vue({
el: "#app",
data: {},
components: {
// 注册
App
},
// 第二种写法
template: '
'
})
```
* 两种渲染模式差异 - 文件不同

* 页面加载不同

* search node_modules 使用
1. 必须有保证vscode打开项目是一个项目
2. `ctrl + p`打开全局下拉框: 输入 `> 空格 search` 找到 search node_modules ,回车
此时所出的位置

3. 接下来就可以搜索当前项目的依赖包
> 如果熟练使用 search node_modules 是比手动在node_modules文件夹中找依赖包要快