Vue初学笔记

什么是Vue.js

Vue.js 一个前端框架,是一套构建用户界面的框架,只关注视图层,它不仅易于上手,还便于与第三方库或既有项目整合。(Vue有配套的第三方库,可以整合起来做大型项目的开发)

为什么要学习流行框架


  • 开发效率快
  • 提高开发效率的发展历程:原生JS -> Jquery之类的类库 -> 前端模板引擎 -> Angular.js / Vue.js
  • 在Vue中,一个核心的概念就是让用户不再操作DOM元素,解放了用户的双手,让程序员可以更多的时间去关注业务逻辑。

框架和库的区别


  • 框架:是一套完整的解决方案,对项目的侵入性较大,项目如果需要更换框架,则需要重新架构整个项目
    • node中的 express
  • 库(插件):提供某一个小功能,对项目的侵入性小,如果某个库无法完成某些需求,可以很容易的切换到其他库实现需求。
      1. 从 jQuery 切换到 Zepto
      2. 从 EJS 切换到 art-template

Node(后端)中的MVC与前端中的MVVM之间的区别


  • MVC 是后端的分层开发概念
  • MVVM是前端视图层的概念,主要关注于视图层分离,也就是说MVVM把前端的视图层,分为了三部分,Model, View, VM ViewModel
  • 为什么有了 MVC 还要有 MVVM

Vue.js 基本代码与 MVVM 之间的对应关系


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
34
35
36
37
38
39
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Vue的基本语法</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 导入Vue的包 -->
<script src="./lib/vue.js"></script>
</head>

<body>
<!-- 将来 new 的Vue实列,会控制这个元素中的所有内容 -->
<!-- Vue 实例所控制的这个元素区域,就是我们的 V -->
<div id="app">
<p>{{ msg }}</p>
</div>

<script>
// 2. 创建一个Vue的实例
// 当我们导入包之后,在浏览器的内存中,就多了Vue 构造函数
// 我们 new 出来的这个 vm 对象,就是我们 MVVM 中的 VM 调度者
var vm = new Vue({
el: '#app', // 表示 vm这个实例要去控制 id 为 app 的这个元素
// 表示当前我们 new 的这个 Vue 实列,要控制页面上的哪个区域

// data 就相当于 MVVM 中的 M 专门用来保存每个页面的数据的
data: { // data 属性中,存放的是 el 中要用到的数据
msg: 'Hello World' // 通过 Vue 提供的指令,很方便的就能把数据渲染到页面上
// 不需要在手动操作DOM元素了
}
})
/*
* el: element 需要获取的元素,一定是html中的跟容器元素
* data: 用于数据的存储
*/
</script>
</body>
</html>

Vue 指令之v-text和v-html


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
34
35
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Page Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" media="screen" href="main.css" />
<script src="./lib/vue.js"></script>

</head>
<body>
<div id="app">
<p>+++++ {{ msg }} -----</p>
<h4 v-text="msg">这里的数据会被覆盖</h4>
<!--
区别一:v-text使用属性的方式,所以默认是不存在闪烁的问题
区别二:v-text会覆盖元素中原本的内容,但是插值表达式 只会替换自己的这个占位符
不会把整个元素的内容清空
-->
<div v-html="msg2">这里的内容和 v-text一样 会被覆盖</div>
<!-- v-html 也会覆盖里面的内容 -->
</div>

<script>
var vm = new Vue({
el: '#app',
data: {
msg: '456',
msg2: '<h1>v-html 可以把内容当作html代码来显示</h1>'
}
})
</script>
</body>
</html>

Vue 指令之v-bind的学习


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
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Page Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" media="screen" href="main.css" />
<script src="./lib/vue.js"></script>

</head>
<body>
<div id="app">
<!-- v-bind: 是 Vue 中,提供的用于绑定属性的指令 -->
<input type="button" value="按钮1" v-bind:title="mytitle">
<!-- v-bind 中,可以写合法的js表达式 -->
<input type="button" value="按钮2" v-bind:title="mytitle + '123'">
<!-- v-bind: 可以被简写为 :要绑定的属性 -->
<input type="button" value="按钮3" :title="mytitle">
</div>

<script>
var vm = new Vue({
el: '#app',
data: {
msg: '456',
msg2: '<h1>v-html 可以把内容当作html代码来显示</h1>',
mytitle: '这是自定义的title'
}
})
</script>
</body>
</html>

Vue 指令之 v-on


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
34
35
36
37
38
39
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Page Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" media="screen" href="main.css" />
<script src="./lib/vue.js"></script>

</head>
<body>
<div id="app">
<!-- v-html 也会覆盖里面的内容 -->
<!-- v-bind: 是 Vue 中,提供的用于绑定属性的指令 -->
<input type="button" value="按钮" v-bind:title="mytitle">

<!-- Vue 中提供了 v-on: 事件绑定机制 -->
<input type="button" value="按钮1" :title="mytitle+'123'" v-on:click="show">
<input type="button" value="按钮2" :title="mytitle+'123'" v-on:mouseover="show">
</div>

<script>
var vm = new Vue({
el: '#app',
data: {
msg: '456',
msg2: '<h1>v-html 可以把内容当作html代码来显示</h1>',
mytitle: '这是自定义的title'
},
methods:{ // 这个methods属性中定义了当前Vue实例所有可用的方法
show: function () {
alert('Hello')
}
}
})
</script>
</body>
</html>

小总结

  1. 如何定义一个基本的Vue代码结构
  2. 插值表达式 和 v-text
  3. v-cloak
  4. v-html
  5. v-bind Vue提供的属性绑定机制 缩写是 :
  6. v-on Vue提供的事件绑定机制 缩写是 @

事件修饰符


  • .stop 阻止冒泡
  • .prevent阻止默认事件
  • .capture添加事件侦听器时使用事件捕获模式
  • .self只当事件在该元素本身(比如不是子元素)触发时触发回调
  • .once事件只触发一次

Vue指令之 v-model双向数据绑定


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<body>
<div id="app">
<h4>{{ msg }}</h4>
<!-- v-bind 只能实现数据的单项绑定 -->
<input type="text" v-bind:value="msg">
<!-- 使用 v-model 指令,可以实现表单元素和 Model 中数据的双向数据绑定 -->
<!-- 注意: v-model 只能运用才 表单元素中 -->
<!-- input(radio text address email...) select checkbox textarea -->
<input type="text" v-model="msg">
</div>

<script>
var vm = new Vue({
el: '#app',
data: {
msg: '大家好'
},
method: {}
});
</script>
</body>

v-for


  • 迭代数组
1
2
3
<ul>
<list v-for="(item, i) in list">索引值 : {{i}}--->数据 : {{item}}</list>
</ul>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<body>
<div id="app">
<p v-for="item in list">{{item}}</p>
<p v-for="(item, i) in list">索引值 : {{i}}--->数据 : {{item}}</p>
</div>

<script>
var vm = new Vue({
el: '#app',
data: {
list: [1, 2, 3, 4, 5, 6, 7, 8, 9]
},
method: {}
});
</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
<!-- 循环遍历对象数组 -->
<body>
<div id="app">
<p v-for="user in list">{{user.id}} --- {{user.name}}</p>
<p v-for="(user, i) in list">Id : {{user.id}} --- Name : {{user.name}} --- Index : {{i}}</p>

</div>

<script>
var vm = new Vue({
el: '#app',
data: {
list: [
{id: 1, name: 'zs1'},
{id: 2, name: 'zs2'},
{id: 3, name: 'zs3'},
{id: 4, name: 'zs4'},
{id: 5, name: 'zs5'}
]
},
method: {}
});
</script>
</body>
  • 迭代对象中的属性
1
2
3
4
<!-- 循环遍历对象身上的属性 -->
<div v-for="(val, key, i) int userInfo">
{{val}} --- {{key}} --- {{i}}
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<body>
<div id="app">
<p v-for="(val, key) in user">Key : {{ key }} --- Value : {{ val }}</p>
<!-- 在遍历对象身上的键值对的时候,除了 有 val key ,在第三个位置还有一个 索引 -->
<p v-for="(val, key, i) in user">Key : {{ key }} --- Value : {{ val }} --- Index : {{i}}</p>
</div>

<script>
var vm = new Vue({
el: '#app',
data: {
user: {
id: 1,
name: 'Chris',
gender: '男'
}
},
method: {}
});
</script>
</body>
  • 迭代数字
1
2
3
<p v-for="i in 10">
这是第 {{i}} 个标签
</p>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<body>
<div id="app">
<!-- in 后面我们放过 普通数组,对象数组,对象,还可以放数字 -->
<!-- 注意:如果使用 v-for 迭代数字的话,前面的count值从 1 开始 -->
<p v-for="count in 10">这是第 {{ count }} 次循环</p>
</div>

<script>
var vm = new Vue({
el: '#app',
data: {
user: {}
},
method: {}
});
</script>
</body>

注意事项:

2.2.0+ 的版本里,当在组建中使用v-for时,key现在是必须的

  • v-for 循环的时候,key 属性只能使用number获取string
  • key在使用的时候,必须使用v-bind属性绑定的形式,制定key的值
  • 在组件中,使用v-for循环的时候,或者在一些特殊情况中,如果v-for有问题,必须在使用v-for的同时,制定唯一的字符串/数字 类型 :key

Vue.jsv-for正在更新已渲染过的元素列表时,它默认用 就地复用 策略。如果数据项的顺序改变,Vue将不是移动 DOM 元素来匹配数据项的顺序,而是简单复用此处每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。

为了给Vue一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一key属性。

Vue指令之v-ifv-show


一般来说,v-if 有更高的切换消耗而 v-show 有更高的初始渲染消耗。因此,如果需要频繁切换 v-show 较好,如果在运行时条件不大可能改变 v-if 较好

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
<body>
<div id="app">
<input type="button" value="按钮" @click="toggle">
<!-- v-if 的特点:每次都会重新删除或创建元素 -->
<!-- v-show 的特点:每次不会重新进行DOM的删除和创建操作,只是切换了元素的 display:none 样式 -->

<!-- v-if 有较高的切换性能消耗 -->
<!-- v-show 有较高的初始渲染消耗 -->

<!-- 如果元素涉及到频繁的切换,最好不要用 v-if, 而是推荐使用 v-show -->
<!-- 如果元素可能永远也不会被显示出来被用户看到,则推荐使用 v-if -->
<h3 v-if="flag">这是用v-if控制的元素</h3>
<h3 v-show="flag">这是用v-show控制的元素</h3>
</div>

<script>
var vm = new Vue({
el: '#app',
data: {
flag: true
},
methods: {
toggle() {
this.flag = !this.flag
}
}
});
</script>
</body>
  • v-if 的特点
    • 有较高的切换性能消耗
    • 每次都会重新删除或创建元素
    • 如果元素可能永远也不会被显示出来被用户看到,推荐使用 v-if
  • v-show 的特点
    • 每次不会重新进行DOM的删除和创建操作,只是切换了元素的 display:none 样式
    • 有较高的初始渲染消耗
    • 如果元素涉及到频繁的切换,推荐使用 v-show
文章目录
  1. 1. 为什么要学习流行框架
  2. 2. 框架和库的区别
  3. 3. Node(后端)中的MVC与前端中的MVVM之间的区别
  4. 4. Vue.js 基本代码与 MVVM 之间的对应关系
  5. 5. Vue 指令之v-text和v-html
  6. 6. Vue 指令之v-bind的学习
  7. 7. Vue 指令之 v-on
    1. 7.1. 小总结
  8. 8. 事件修饰符
  9. 9. Vue指令之 v-model 和 双向数据绑定
  10. 10. v-for
  11. 11. Vue指令之v-if和v-show
,