一、介绍
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!' } })
|
可以在浏览器控制台,输入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('') } } })
|
在 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', { 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 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