1. 什么是vue
vue 官网:https://cn.vuejs.org/
渐进式框架,
2.安装
安装
npm
npm
全称为Node Package Manager
,是一个基于Node.js
的包管理器,也是整个Node.js
社区最流行、支持的第三方模块最多的包管理器。1
npm -v
由于网络原因 安装
cnpm
1
2
3
4
5#旧版,cnpm官方公告将在2022年6月30日停止老域名解析
npm install -g cnpm --registry=https://registry.npm.taobao.org
#新版
npm install -g cnpm --registry=https://registry.npmmirror.com安装
vue-cli
1
cnpm install -g /cli
安装
webpack
webpack
是JavaScript
打包器(module bundler)1
cnpm install -g webpack
3 Vue练习
3.1 Vue实例
1 | <div id="app"> {{ message }} {{ name }}</div> |
3.2 数据和方法
当一个 Vue 实例被创建时,它将 data 对象中的所有的 property 加入到 Vue 的响应式系统中。当这些 property 的值发生改变时,视图将会产生“响应”,即匹配更新为新的值
1 | // 我们的数据对象 |
当这些数据改变时,视图会进行重渲染。值得注意的是只有当实例被创建时就已经存在于 data 中的 property 才是响应式的。也就是说如果你添加一个新的 property,比如
1 | vm.b = 'hi' |
那么对 b 的改动将不会触发任何视图的更新。如果你知道你会在晚些时候需要一个 property,但是一开始它为空或不存在,那么你仅需要设置一些初始值。比如:
1 | data: { |
这里唯一的例外是使用 Object.freeze(),这会阻止修改现有的 property,也意味着响应系统无法再追踪变化
1 | <div id="app"> |
除了数据 property,Vue 实例还暴露了一些有用的实例 property 与方法。它们都有前缀 $,以便与用户定义的 property 区分开来。例如:
1 | var data = { a: 1 } |
2.3 生命周期钩子
Vue 实例从创建到销毁的过程,就是生命周期。也就是从开始创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、卸载等一系列过程,我们称这是 Vue 的生命周期
1 | <div id="app"> |
控制台依次打印:
beforeCreate
created
beforeMount
mounted
beforeUpdate
updated
注意事项:
1 | 不要在选项 property 或回调上使用箭头函数,比如 created: () => console.log(this.a) 或 vm.$watch('a', newValue => this.myMethod())。 |
3.3 条件与循环
- v-if: 控制切换一个元素是否显示 当改变
1
2
3
4
5
6
7
8
9
10
11
12
13
14<div id="vue-app">
<p v-if="seen">v-if: 如果为false,Dom将不渲染该元素</p>
<p v-show="seen">show:Dom渲染,只是通过css控制display属性是否显示</p>
<p>show: 渲染时开销大;v-if:渲染时开销小;具体场景根据实际情况选定</p>
</div>
<script>
var vm = new Vue({
el: '#vue-app',
data: {
seen: true
}
})
vm.seen = false;
</script>seen
的值为false的时候,v-if
绑定的元素Dom元素不渲染
- v-for: 绑定数组的数据来渲染一个项目列表
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<div id="vue-app">
<!--遍历输出list-->
<p>遍历输出list</p>
<ol>
<li v-for="item in list">
{{ item.name }}
</li>
</ol>
<br>
<p>遍历输出map key value-</p>
<ul>
<li v-for="value, key in object">
{{key}} : {{ value }}
</li>
</ul>
</div>
<script>
var vm = new Vue({
el: '#vue-app',
data:{
list:[
{name: '张三'},
{name: '李四'},
{name: '王五'}
],
object: {
truetruetitle: 'How to do lists in Vue',
truetrueauthor: 'Jane Doe',
truetruepublishedAt: '2016-04-10'
}
}
})
//往数组里面添加元素,页面上响应式渲染
vm.list.push({name:'赵六'});
</script>
3.4 处理用户输入
- 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<div id="app">
<div id="example-1">
<!-- 单击事件:计算器加一 -->
<button v-on:click="counter += 1"> 数值 : {{ counter }} </button><br />
<!-- 双击事件 -->
<button v-on:dblclick="greet('abc', $event)">Greet</button>
</div>
<div id="example-2">
<p>{{ message }}</p>
<!-- 单击 -->
<button v-on:click="reverseMessage">反转消息</button>
</div>
</div>
<script type="text/javascript">
var vm = new Vue({
el: "#app",
data: {
counter: 0,
name: "vue",
message: 'hello world'
},
methods: {
greet: function(str, e) {
alert(str);
},
reverseMessage: function() {
//更新了应用的状态,但没有触碰 DOM。所有的 DOM 操作都由 Vue 来处理,这样我们只需要关注逻辑层面即可
//this 表示vue实例对象,可以获取相关的数据信息
this.message = this.message.split('').reverse().join('')
}
}
});
</script> - v-model: 表单输入和应用状态之间的双向绑定
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54<div id="app">
<div id="example-1">
<input v-model="message" placeholder="edit me">
<p>Message is: {{ message }}</p>
<textarea v-model="message2" placeholder="add multiple lines"></textarea>
<p style="white-space: pre-line;">{{ message2 }}</p>
<br />
<div style="margin-top:20px;">
<input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
<label for="jack">Jack</label>
<input type="checkbox" id="john" value="John" v-model="checkedNames">
<label for="john">John</label>
<input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
<label for="mike">Mike</label>
<br>
<span>Checked names: {{ checkedNames }}</span>
</div>
<br>
<div style="margin-top:20px;">
<input type="radio" id="one" value="One" v-model="picked">
<label for="one">One</label>
<br>
<input type="radio" id="two" value="Two" v-model="picked">
<label for="two">Two</label>
<br>
<span>Picked: {{ picked }}</span>
</div>
<button type="button" @click="submit">提交</button>
</div>
</div>
<script type="text/javascript">
var vm = new Vue({
el: "#app",
data: {
//这里可以设置初始值,也可以设置为'' 空值
message: "test",
message2: "hi",
checkedNames: ['Jack', 'John'], //多选框,值是数组格式
picked: "Two"
},
methods: {
submit: function() {
//this代表的是vue实例对象,可以通过this获取表单数据,如下
var params = {
message: this.message,
message2: this.message2,
checkedNames: this.checkedNames,
picked: this.picked
}
console.log(params);
}
}
});
</script>