一、介绍

MVVM模式:
model(模型驱动) vue(html,可以理解为dom),就是数据驱动vue,然后又反过来vue驱动数据,就是一个双向数据绑定常见的一个概念
Model:负责数据存储
View:负责页面展示
View Model:负责业务逻辑(比如ajax请求等),对数据进行加工后交给视图展示
MVC模式(设计模式,前后端都有模式存在):
M-model-模型-数据(js变量)
V-View-视图-用户所见界面(HTML,CSS)
C-contral-控制器-事件交互-如何根据视图与用户交互后改变数据(通过dom对象绑定事件,将变量进行修改)
##vue.js是什么
Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

起步

可把vue.js下载到本地或者通过script的方式引入vue:

1
2
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

或者

1
2
<!-- 生产环境版本,优化了尺寸和速度 -->
<script src="https://cdn.jsdelivr.net/npm/vue"></script>

声明式渲染

Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统:

1
2
3
<div id="app">
{{ message }}
</div>
1
2
3
4
5
6
7
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
})
//Hello Vue!

可以在浏览器控制台,输入app.message修改它的值。
除了文本插值,还可以来绑定元素attribute:

1
2
3
4
5
<div id="app-2">
<span v-bind:title="message">
鼠标悬停几秒钟查看此处动态绑定的提示信息!
</span>
</div>
1
2
3
4
5
6
var app2 = new Vue({
el: '#app-2',
data: {
message: '页面加载于 ' + new Date().toLocaleString()
}
})

鼠标悬停几秒就会显示动态绑定的提示信息。
上面的v-bind称为指令,指令带前缀v-,在这里,该指令的意思是:“将这个元素节点的 title attribute 和 Vue 实例的 message property 保持一致”。

条件循环

控制一个元素是否显示

1
2
3
4
<div id="app-3">
<p v-if="seen">现在你看到我了</p>
</div>

1
2
3
4
5
6
7
var app3 = new Vue({
el: '#app-3',
data: {
seen: true
}
})
//现在你看到我了

如果在控制台输入app3.seen=false,就会发现消息消失了。

v-for 指令可以绑定数组的数据来渲染一个项目列表:

1
2
3
4
5
6
7
<div id="app-4">
<ol>
<li v-for="todo in todos">
{{ todo.text }}
</li>
</ol>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
var app4 = new Vue({
el: '#app-4',
data: {
todos: [
{ text: '学习 JavaScript' },
{ text: '学习 Vue' },
{ text: '整个牛项目' }
]
}
})
//1.学习 JavaScript
//2.学习 Vue
//3.整个牛项目

在控制台里,输入app4.todos.push({ text: '新项目' }),你会发现列表最后添加了一个新项目。

处理用户输入

为了让用户和你的应用进行交互,我们可以用 v-on指令添加一个事件监听器,通过它调用在 Vue 实例中定义的方法:

1
2
3
4
<div id="app-5">
<p>{{ message }}</p>
<button v-on:click="reverseMessage">反转消息</button>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
var app5 = new Vue({
el: '#app-5',
data: {
message: 'Hello Vue.js!'
},
methods: {
reverseMessage: function () {
this.message = this.message.split('').reverse().join('')
}
}
})
//执行之后Hello Vue.js!会被逆转

reverseMessage方法中,只更新了应用的状态,但没有触碰 DOM——所有的 DOM 操作都由 Vue 来处理,编写的代码只需要关注逻辑层面即可。

Vue 还提供了 v-model 指令,它能轻松实现表单输入和应用状态之间的双向绑定。

1
2
3
4
<div id="app-6">
<p>{{ message }}</p>
<input v-model="message">
</div>
1
2
3
4
5
6
var app6 = new Vue({
el: '#app-6',
data: {
message: 'Hello Vue!'
}
})

组件化应用构建

组件系统是 Vue 的另一个重要概念,因为它是一种抽象,允许我们使用小型、独立和通常可复用的组件构建大型应用。
但是这样会为每个待办项渲染同样的文本,这看起来并不炫酷。我们应该能从父作用域将数据传到子组件才对。让我们来修改一下组件的定义,使之能够接受一个 prop

1
2
3
4
5
6
7
Vue.component('todo-item', {
// todo-item 组件现在接受一个
// "prop",类似于一个自定义 attribute。
// 这个 prop 名为 todo。
props: ['todo'],
template: '<li>{{ todo.text }}</li>'
})

现在,我们可以使用v-bind 指令将待办项传到循环输出的每个组件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<div id="app-7">
<ol>
<!--
现在我们为每个 todo-item 提供 todo 对象
todo 对象是变量,即其内容可以是动态的。
我们也需要为每个组件提供一个“key”,稍后再
作详细解释。
-->
<todo-item
v-for="item in groceryList"
v-bind:todo="item"
v-bind:key="item.id"
></todo-item>
</ol>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Vue.component('todo-item', {
props: ['todo'],
template: '<li>{{ todo.text }}</li>'
})

var app7 = new Vue({
el: '#app-7',
data: {
groceryList: [
{ id: 0, text: '蔬菜' },
{ id: 1, text: '奶酪' },
{ id: 2, text: '随便其它什么人吃的东西' }
]
}
})
//1.蔬菜
//2.奶酪
//3.随便其它什么人吃的东西

Vue实例

Vue环境安装

首先安装nodejs,然后创建一个目录输入:npm install bower -g安装bower
通过如下命令可安装cmpn:npm install -g cnpm --registry=https://registry.npm.taobao.org
然后再安装什么,即可通过例如:bower install vue