# 入门网址
# 基础指令
model/on
if/show
for
bind
html
text
pre
slot
cloak
once
- v-model:表单输入和应用状态之间的双向绑定
- .number
- .lazy
- .trim
- v-on:绑定事件,简写【@】
- .stop
- .prevent
- .capture
- .self
- .once
- .passive
<body> <div id="app"> <input type="text" v-model="message"> <button @click="getData">按钮</button> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> <script> const app = new Vue({ el: '#app', data() { return { message: '消息', } }, methods: { getData(e) { console.log(this.message); } } }) </script> </body>
复制成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 组件化
全局组件
局部组件
组件传参1
组件传参2
事件发射
组件用model
动态组件
- 注册组件分为
全局组件
和局部组件
,Vue.component是注册的全局组件 - 每个组件必须只有一个根元素 (vue3没有这个限制)

<body> <div id="app"> 本组件 <hr> 注册组件: <list></list> <hr> 复用: <list></list> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> <script> Vue.component('list', { template: ` <div id="child"> <ul> <li v-for="name in students" :key="name">{{name}}</li> </ul> </div> `, data() { return { students: ['hdy', '小赵', '张三'], } } }) const app = new Vue({ el: '#app', }) </script> </body>
复制成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 生命周期
概览
before/created
before/mounted
before/updated
before/destroyed
activated/deactivated
nextTick

# data/computed/watch
data
watch
computed
缓存机制
原理实现
- 为什么不直接用对象,而用函数返回对象?
由于VUE组件是可以复用的,那么多个组件复用的时候,需要肯定不能用相同的数据。就利用function返回新的对象,让相同组件之间都拥有自己的data

<body> <div id="app" v-once> <comp></comp> <comp></comp> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> <script> Vue.component('comp', { template: ` <div>{{message}}</div> `, data() { return { message: Math.floor(Math.random() * 100), } } }) const app = new Vue({ el: '#app', }) </script> </body>
复制成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# class/style
class
组件class
内联样式
- 动态绑定方法:
<div v-bind:class="{ active: isActive }"></div> <div v-bind:class="{ active: isActive, 'text-danger': hasError }"></div> <div v-bind:class="[activeClass, errorClass]"></div> <div v-bind:class="[{ active: isActive }, errorClass]"></div>
复制成功
1
2
3
4
5
6
7
2
3
4
5
6
7
- 可以用计算属性返回对象的形式计算动态class

<body> <div id="app"> <div :class="box"></div> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> <script> const app = new Vue({ el: '#app', computed: { box() { return { peek: true, dark: +new Date().getHours() > 18 || +new Date().getHours() < 5 } } } }) </script> </body>
复制成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 数组
注意事项
下标修改测试
- 要使用唯一的key值
- 不能使用下标更改,数组监听只是重写了下面的方法
- push()
- pop()
- shift()
- unshift()
- splice()
- sort()
- reverse()
# Event
方法总览
事件修饰符
表单内事件
- 可以用 v-on / @ 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码或函数
- 当一个 ViewModel 被销毁时,所有的事件处理器都会自动被删除。你无须担心如何清理它们。
<!-- 执行JS代码 --> <button v-on:click="counter += 1">Add 1</button> <!-- 函数默认接收event参数 --> <button v-on:click="greet">Greet</button> <!-- 函数传值 --> <button @click="getMoney(10)">转换美元</button> <!-- 又想传值又想传事件 --> <button @click="getMoney(10, $event)">转换美元</button>
复制成功
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 插槽
规则
作用域插槽
其他规则
- 父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。
父模板能向子模板的slot传值,但编译过程是在父模板走的,子模板拿到的只是编译后的值替换掉对应的slot标签。

<body> <div id="app"> <home>{{name}}</home> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> <script> const home = { template: ` <div>我的名字是: <slot /> </div> `, data() { return { name: '儿子', } } }; const app = new Vue({ el: '#app', components: { home }, data() { return { name: '爸爸', } } }) </script> </body>
复制成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 混入
minxins
全局混入
- 定义一些可直接复用的方法、生命周期事情。
- 混入对象的钩子将在组件自身钩子之前调用。
- methods和data重名以组件本地的为准。

<body> <div id="app"> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> <script> const mixin = { created() { console.log('created'); }, methods: { say() { console.log('mixin'); } } } const app = new Vue({ el: '#app', mixins: [mixin], mounted() { this.say(); } }) </script> </body>
复制成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 自定义指令
介绍
局部指令
全局指令
- 对普通 DOM 元素进行底层操作
- 可执行钩子:
- bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
inserted
:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。- update:所在组件的 VNode 更新时调用
- componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
- unbind:只调用一次,指令与元素解绑时调用。
- 入参:
- el
- binding = { name, value, expression, oldValue, arg, modifiers }
- vnode
- oldVnode
v1.4.16