MVVM模式

MVVM是Model-View-ViewModel的简写,即模型-视图-视图模型。当View(视图层)变化时,会自动更新到ViewModel(视图模型),反之也一样,View和ViewModel之间通过双向绑定。

与MVC区别,MVC是单向通信,VUE就是基于MVVM模式实现的一套框架,在VUE中Model层指的是js中的data数据,View层指的是页面视图,ViewModel是指vue实例化对象。

Vue.js的开发模式

Vue.js 是一套构建用户界面的渐进式框架
当数据与DOM进行了关联,所有的东西都是响应式的,我们怎么确认呢?
在你当前运行的窗口,打开浏览器的JavaScript控制台,并修改app.message的值,你将看到上例的值相应的更新。

内置指令

指令 (Directives) 是带有 v- 前缀的特殊属性,指令是Vue模板中最常用的一项功能,它带有前缀v-,主要职责就是当其表达式的值改变时,将某些行为应用到DOM上。

  • v-if:条件渲染指令,动态在DOM内添加或删除DOM元素。
  • v-else:条件渲染指令,必须跟v-if成对使用。
  • v-else-if:判断多层条件,必须跟v-if成对使用。
  • v-show:条件渲染指令,为DOM设置css的style属性,v-show不能在<template>上使用,频繁切换场景中适合使用。
  • v-text:更新元素的textContent;例如:<span v-text="msg"></span> 等同于 < span>{{msg}} </ span>。
  • v-html:更新元素的innerHTML;会把标签名也带上。
  • v-for:循环指令;<li v-for="book in books">{ { book.name } }</li>
  • v-for:表达式遍历数组时支持一个可选参数作为当前项的索引;<li v-for="(book , index) in books ">{{ index}} - {{book.name })</li>
  • v-for:表达式遍历对象属性时,有两个可选参数,分别是键名和索引;<li v-for="(value , key , index) in user ">{ { index } } - { { key } } : { { value } }</li>
  • v-cloak:不需要表达式,这个指令保持在元素上直到关联实例结束编译; v-cloak 是一个解决初始化慢导致页面闪动的最佳实践。
  • v-once:也是一个不需要表达式的指令,作用是定义它的元素或组件只渲染一次,包括元素或组件的所有子节点。
  • v-pre:不需要表达式,跳过这个元素以及子元素的编译过程,以此来加快整个项目的编译速度。
  • v-bind:响应并更新DOM特性;例如:v-bind:href  v-bind:class  v-bind:title  等等。语法糖:"v-bind:” 可以用":"代替。
  • v-on:用于监听DOM事件; 例如:v-on:click  v-on:keyup。语法糖:“v-on:”可以用“@”代替。
  • v-model:数据双向绑定;用于表单输入等;例如:< input v-model= "message">。v-model也是一个特殊的语法糖,使用@input来替代v-model。

v-bind 特性被称为指令。指令带有前缀 v-,以表示他们是Vue提供的特殊的特性。

我们不仅可以把数据绑定到DOM文本或特性,还可以绑定到DOM结构。此外,Vue也提供了一个强大的过渡效果系统,可以在Vue插入/更新/移除元素时自动应用过渡效果。

v-if 条件控制语句 可控制一个元素是否显示是否隐藏。
v-for 循环 该指令可以绑定数组的数据来渲染一个项目列表。
v-on 指令添加一个事件监听器,通过他调用在Vue实例中定义的方法。绑定事件
v-model 指令,它能轻松实现表单输入和应用状态之间的双向绑定。

组件化应用构建:组件系统是vue的另一个重要的概念,因为它是一种抽象,允许我们使用小型、独立的通常可复用的组件构建大型应用。
注册一个全局组件语法格式如下:
Vue.compnent(tagName,options)
tagName为组件名,options为配置选项。注册后我们可以使用以下方式来调用组件:
<tagName></tagName>
组件可复用,一个组件的 data 选项必须是一个函数,因为你每用一次组件,就会有一个它的新实例被创建。
在组件中创建多个标签时,标签必须有父标签,否则不能显示
例:
vue.compnent('button-counter',{

data: function () {
return {
count:0
}
},
template: '<div><h1>标题</h1></h1><button v-on:click="count++">You clicked me {{count}} times.</button></div>'//当创建两个或两个以上的标签必须包含在父标签内
})
props属性:父组件是使用 props 传递数据给子组件,但如果子组件要把数据传递回去,就需要使用自定义事件!
使用 $on(eventName) 监听事件
使用 $emit(eventName) 触发事件

Vue实例
创建一个Vue实例,每一个Vue应用都是通过用Vue函数创建一个Vue实例开始的:
var vm=new Vue({
//选项
})
当创建一个Vue实例时,你可以传入一个选项对象,可以在API文档中浏览完整的选项列表。https://cn.vuejs.org/v2/api/#%E9%80%89%E9%A1%B9-%E6%95%B0%E6%8D%AE vue数据选项

数据与方法
当一个Vue实例被创建时,它将 data 对象的所有属性加入到vue的响应式系统中,当这些属性的值发生改变时,视图(页面)将会产生"响应",即匹配更新为新的值。
例:
// 我们的数据对象
var data = { a: 1 }

// 该对象被加入到一个 Vue 实例中
var vm = new Vue({
data: data
})

// 获得这个实例上的属性
// 返回源数据中对应的字段
vm.a == data.a // => true

// 设置属性也会影响到原始数据
vm.a = 2
data.a // => 2

// ……反之亦然
data.a = 3
那么对于 b 的改动将不会触发任何视图的更新。如果你知道你晚些时候需要一个属性,但是一开始它为空或不存在,那么你需要设置一些初始值。比如:
data: {
vm.a // => 3
当这些数据改变时,视图会重新渲染。值得注意的是只有当实例被创建时就已经存在于data中的属性才是响应式的。也就是说如果你添加一个新的属性,如:
vm.b='hi'
newTodoText: '',
visitCount: 0,
hideCompletedTodos: false,
todos: [],
error: null
}
这里唯一的例外是使用 Object.freeze() ,这会组织修改现有的属性,也意味着响应系统无法在追踪变化。
例:
var obj = {
foo: 'bar'
}

Object.freeze(obj)

var apps = new Vue({
el: '#app',
data: obj
})
<div id="app">
<p>{{ foo }}</p>
<!-- 这里的 `foo` 不会更新! -->
<button v-on:click="foo = 'baz'">Change it</button>
</div>

除了数据属性,vue实例还暴露了一些有用的实例属性与方法。它们都有前缀 $ ,以便与用户定义的属性区分开来。

模板语法
数据绑定最常见的形式j就是使用"Mustache"语法(双大括号)的文本插值:
<span>Message: {{ msg }}</span>
双大括号标签将会被替代为对应数据对象上 msg 属性的值。无论何时,绑定的数据对象上 msg 属性发生了改变,插值处的内容都会更新。

特性
Mustache语法不能作用在HTML特性上,遇到这种情况 应该使用 v-bind 指令: https://cn.vuejs.org/v2/api/#v-bind
例:<div v-bind:id="dynamicId"></div>

对于布尔特性(它们只要存在就意味着值为 true) ,v-bind 工作起来略有不同,
例:<button v-bind:disabled="isButtonDisabled">Button</button>
如果 isButtonDisabled 的值是null,undefined,或 false,则disabled 特性甚至不会被包含在渲染出来的 <button> 元素中。

使用 JavaScript表达式
例:
{{ number + 1 }}

{{ ok ? 'YES' : 'NO' }}

{{ message.split('').reverse().join('') }}

<div v-bind:id="'list-' + id"></div>
这些表达式会在所属 Vue 实例的数据作用域下作为 JavaScript 被解析。有个限制就是,每个绑定都只能包含单个表达式,所以下面的例子都不会生效。

<!-- 这是语句,不是表达式 -->
{{ var a = 1 }}

<!-- 流控制也不会生效,请使用三元表达式 -->
{{ if (ok) { return message } }}
注:模板表达式都被放在沙盒中,只能访问全局变量的一个白名单,如 Math 和 Date 。你不应该在模板表达式中试图访问用户定义的全局变量。

指令
指令是带有 v- 前缀的特殊特性,指令的指责是,当表达式的值改变时,将其产生的连带影响,响应式的作用于 DOM 。
例:
<p v-if="seen">现在你看到我了</p>
这里,v-if 指令将根据表达式 seen 的值的真假来插入/移除 <p> 元素。

参数
一些指令能够接收一个“参数”,在指令名称之后以冒号表示。例如,v-bind 指令可以用于响应式地更新 HTML 特性:

<a v-bind:href="url">...</a>
在这里 href 是参数,告知 v-bind 指令将该元素的 href 特性与表达式 url 的值绑定。

另一个例子是 v-on 指令,它用于监听 DOM 事件:

<a v-on:click="doSomething">...</a>
在这里参数是监听的事件名。

动态参数
2.6.0 新增

从 2.6.0 开始,可以用方括号括起来的 JavaScript 表达式作为一个指令的参数:

<a v-bind:[attributeName]="url"> ... </a>
这里的 attributeName 会被作为一个 JavaScript 表达式进行动态求值,求得的值将会作为最终的参数来使用。
例如,如果你的 Vue 实例有一个 data 属性 attributeName,其值为 "href",那么这个绑定将等价于 v-bind:href。

修饰符
修饰符 (modifier) 是以半角句号 . 指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault():

<form v-on:submit.prevent="onSubmit">...</form>

缩写
v-bind缩写
完整语法:<a v-bind:href="url"></a>
缩写:<a :href="url"></a>

v-on缩写
完整语法:<a v-on:click="doSomething"></a>
缩写:<a @click="doSomething"></a>

计算属性
模板内的表达式非常便利,但是设计它的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。
例如:
<div id="example">
{{ message.split('').reverse().join('') }}
</div>
在这个地方,模板不再是简单的声明逻辑。你必须看一段时间才能意识到,这里是想要显示变量 message 的翻转字符串。当你想要在模板中多次引用此处的翻转字符串时,就会更加难以处理。
所以,对于任何复杂逻辑,你都应当使用计算属性。
例:
<div id="example">
<p>Original message: "{{ message }}"</p>
<p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>
var vm = new Vue({
el: '#example',
data: {
message: 'Hello'
},
computed: {
// 计算属性的 getter
reversedMessage: function () {
// `this` 指向 vm 实例
return this.message.split('').reverse().join('')
}
}
})
结果:

Original message: "Hello"

Computed reversed message: "olleH"

这里我们声明了一个计算属性 reversedMessage。我们提供的函数将用作属性 vm.reversedMessage 的 getter 函数:
console.log(vm.reversedMessage) // => 'olleH'
vm.message = 'Goodbye'
console.log(vm.reversedMessage) // => 'eybdooG'
你可以打开浏览器的控制台,自行修改例子中的 vm。vm.reversedMessage 的值始终取决于 vm.message 的值。

你可以像绑定普通属性一样在模板中绑定计算属性。Vue 知道 vm.reversedMessage 依赖于 vm.message,因此当 vm.message 发生改变时,所有依赖 vm.reversedMessage 的绑定也会更新。
而且最妙的是我们已经以声明的方式创建了这种依赖关系:计算属性的 getter 函数是没有副作用 (side effect) 的,这使它更易于测试和理解。

计算属性 VS 方法
计算属性 VS 侦听属性
计算属性的setter
侦听器
请看官网详解:https://cn.vuejs.org/v2/guide/computed.html#%E5%9F%BA%E7%A1%80%E4%BE%8B%E5%AD%90

v-show指令 带有v-show]指令的元素始终会被渲染并保留在BOM中。v-show只是简单的切换元素的CSS属性display

事件处理
v-on指令 用于绑定事件
事件修饰符 通过由 . 表示的指令后缀来调用修饰符
例:
<a v-on:click.stop="doThis"></a> //阻止单机事件冒泡
<from v-on:submit.prevent="onSubmit"></from> // 提交事件不再重载页面
<a v-on:click.stop.prevent=""></a> //只有修饰符
<div v-on:click.capture="doThis"></div> //添加事件侦听器时使用事件捕获模式
<div v-on:click.self="doThat"></div> //只当事件在该元素本身(而不是子元素)触发时触发回调

<div v-on:click.once="doThis"></div> //click事件只能点击一次,2.1.4版本新增

按键修饰符
vue为常用的的按键提供了别名:
<input v-on:keyup.enter="submit" /> //只有keyup是enter时调用submit方法
缩写:<input @keyup.enter="submit" />
全部按键别名:.enter .tab .delete (捕获"删除"和"退格"键) .esc .space .up .down .left .right .ctrl .alt .shift .meta

表单输入绑定
v-model 指令在表单<input>,<textarea></textarea>,<select></select> 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素,
注:v-model 会忽略所有表单元素的 value,checked,selected,特性的初始值而总是将vue实例的数据作为数据来源。你应该通过JavaScript在组件的data选项中声明初始值。

学习vue.js (一)的更多相关文章

  1. 从零开始学习Vue.js,学习笔记

    一.为什么学习vue.js methods 只有纯粹的数据逻辑,而不是去处理 DOM 事件细节. vue.js兼具angular.js和react的优点,并且剔除了他们的缺点 官网:http://cn ...

  2. 学习vue.js 第一天

    最近听到很多人都在用Vue.js ,我也想凑凑热闹,来个入门 啥的 ,要不以后人家说,啥都不知道,多low 看到官网 是这样介绍Vue.js Vue.js(读音 /vjuː/, 类似于 view) 是 ...

  3. 初步学习vue.js

    vue是法语中视图的意思,Vue.js是一个轻巧.高性能.可组件化的MVVM库,同时拥有非常容易上手的API. 响应的数据绑定 Vue.js 的核心是一个响应的数据绑定系统,它让数据与 DOM 保持同 ...

  4. 学习vue.js的正确姿势(转载)

    最近饶有兴致的又把最新版 Vue.js 的源码学习了一下,觉得真心不错,个人觉得 Vue.js 的代码非常之优雅而且精辟,作者本身可能无 (bu) 意 (xie) 提及这些.那么,就让我来吧:) 程序 ...

  5. 学习Vue.js之vue移动端框架到底哪家强

    官网:https://cn.vuejs.org/. 转载:http://www.cnblogs.com/8899man/p/6514212.html Weex 2016年4月21日,阿里巴巴在Qcon ...

  6. 使用eclipse初步学习vue.js基础==》v-for的使用 ②

    一.步骤演示 1. 新建一个jsp文件 2. 把vue.js放到Web的js目录下 3. 在jsp中引入vue.js <script src="${pageContext.reques ...

  7. 使用eclipse初步学习vue.js的基本操作 ①

    一.vue.js的初步认识 <a href="https://unpkg.com/vue ">vue.js下载</a> 1.抛开手动操作DOM的思维,Vue ...

  8. 学习Vue.js需要了解的部分内容

    重要: 1.如果要通过js/模板引用 图片到项目,图片路径需要使用require. 2.$event: $event 等于$emit 抛出的值,还可以使用$event.target.value. $e ...

  9. Vue 2.0 入门系列(14)学习 Vue.js 需要掌握的 es6 (1)

    针对之前学习 Vue 用到的 es6 特性,以及接下来进一步学习 Vue 要用到的 es6 特性,做下简单总结. var.let 与 const var 与 let es6 之前,JavaScript ...

  10. 学习Vue.js

    Vue.js官网 Vue.js官方教程 Vue.js教程 哔哩哔哩Vue.js教程 Vue.js百度百科

随机推荐

  1. Hills——一道转移方程很“有趣”的线性DP

    题目描述 Welcome to Innopolis city. Throughout the whole year, Innopolis citizens suffer from everlastin ...

  2. 虚拟机中Linux环境搭建

    Linux系统搭建 作为一名软件测试资深工程师,在日常工作中离不开对测试环境的操作.我们测试的软件,系统都是部署在linux系统环境上,我们掌握Linux系统的日常操作是非常必要的.那么在学习Linu ...

  3. (一)ansible 安装配置

    CentOS 7.5 一,安装 yum -y install ansible 二,配置hosts文件 /etc/ansible/hosts s1 ansible_ssh_port= ansible_s ...

  4. CSS(二)- 属性速览(含版本、继承性和简介)

    相关链接 CSS3速查表,这里面列出了所有新增的属性以及新增或者修改的属性值 css参考手册,很好地一个常用网站 CSS定位(不可继承) CSS布局(仅visibility可继承) CSS尺寸(不可继 ...

  5. Prometheus + Grafana 监控系统搭

    本文主要介绍基于Prometheus + Grafana 监控Linux服务器. 一.Prometheus 概述(略) 与其他监控系统对比 1 Prometheus vs. Zabbix Zabbix ...

  6. Scala 基础(九):Scala 函数式编程(一)基础(一)概念、定义、调用机制

    1 概念的说明 1)在scala中,方法和函数几乎可以等同(比如他们的定义.使用.运行机制都一样的),只是函数的使用方式更加的灵活多样. 2)函数式编程是从编程方式(范式)的角度来谈的,可以这样理解: ...

  7. MYSQL 之 JDBC(十六): DBUtils

    DBUtils是Apache组织提供的一个开源的JDBC工具类库,能极大简化jdbc编码的工作量 API介绍 QueryRunner ResultSetHandler 工具类DbUtils 用DBUt ...

  8. scrapy 基础组件专题(十二):scrapy 模拟登录

    1. scrapy有三种方法模拟登陆 1.1直接携带cookies 1.2找url地址,发送post请求存储cookie 1.3找到对应的form表单,自动解析input标签,自动解析post请求的u ...

  9. Presto原理及安装

    背景 MapReduce不能满足大数据快速实时adhoc查询计算的性能要求,Facebook2012年开发,2013年开源 是什么 基于内存的并行计算,Facebook推出的分布式SQL交互式查询引擎 ...

  10. 爬虫黑科技,我是怎么爬取indeed的职位数据的

    最近在学习nodejs爬虫技术,学了request模块,所以想着写一个自己的爬虫项目,研究了半天,最后选定indeed作为目标网站,通过爬取indeed的职位数据,然后开发一个自己的职位搜索引擎,目前 ...