学习vue.js (一)
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 (一)的更多相关文章
- 从零开始学习Vue.js,学习笔记
一.为什么学习vue.js methods 只有纯粹的数据逻辑,而不是去处理 DOM 事件细节. vue.js兼具angular.js和react的优点,并且剔除了他们的缺点 官网:http://cn ...
- 学习vue.js 第一天
最近听到很多人都在用Vue.js ,我也想凑凑热闹,来个入门 啥的 ,要不以后人家说,啥都不知道,多low 看到官网 是这样介绍Vue.js Vue.js(读音 /vjuː/, 类似于 view) 是 ...
- 初步学习vue.js
vue是法语中视图的意思,Vue.js是一个轻巧.高性能.可组件化的MVVM库,同时拥有非常容易上手的API. 响应的数据绑定 Vue.js 的核心是一个响应的数据绑定系统,它让数据与 DOM 保持同 ...
- 学习vue.js的正确姿势(转载)
最近饶有兴致的又把最新版 Vue.js 的源码学习了一下,觉得真心不错,个人觉得 Vue.js 的代码非常之优雅而且精辟,作者本身可能无 (bu) 意 (xie) 提及这些.那么,就让我来吧:) 程序 ...
- 学习Vue.js之vue移动端框架到底哪家强
官网:https://cn.vuejs.org/. 转载:http://www.cnblogs.com/8899man/p/6514212.html Weex 2016年4月21日,阿里巴巴在Qcon ...
- 使用eclipse初步学习vue.js基础==》v-for的使用 ②
一.步骤演示 1. 新建一个jsp文件 2. 把vue.js放到Web的js目录下 3. 在jsp中引入vue.js <script src="${pageContext.reques ...
- 使用eclipse初步学习vue.js的基本操作 ①
一.vue.js的初步认识 <a href="https://unpkg.com/vue ">vue.js下载</a> 1.抛开手动操作DOM的思维,Vue ...
- 学习Vue.js需要了解的部分内容
重要: 1.如果要通过js/模板引用 图片到项目,图片路径需要使用require. 2.$event: $event 等于$emit 抛出的值,还可以使用$event.target.value. $e ...
- Vue 2.0 入门系列(14)学习 Vue.js 需要掌握的 es6 (1)
针对之前学习 Vue 用到的 es6 特性,以及接下来进一步学习 Vue 要用到的 es6 特性,做下简单总结. var.let 与 const var 与 let es6 之前,JavaScript ...
- 学习Vue.js
Vue.js官网 Vue.js官方教程 Vue.js教程 哔哩哔哩Vue.js教程 Vue.js百度百科
随机推荐
- Hills——一道转移方程很“有趣”的线性DP
题目描述 Welcome to Innopolis city. Throughout the whole year, Innopolis citizens suffer from everlastin ...
- 虚拟机中Linux环境搭建
Linux系统搭建 作为一名软件测试资深工程师,在日常工作中离不开对测试环境的操作.我们测试的软件,系统都是部署在linux系统环境上,我们掌握Linux系统的日常操作是非常必要的.那么在学习Linu ...
- (一)ansible 安装配置
CentOS 7.5 一,安装 yum -y install ansible 二,配置hosts文件 /etc/ansible/hosts s1 ansible_ssh_port= ansible_s ...
- CSS(二)- 属性速览(含版本、继承性和简介)
相关链接 CSS3速查表,这里面列出了所有新增的属性以及新增或者修改的属性值 css参考手册,很好地一个常用网站 CSS定位(不可继承) CSS布局(仅visibility可继承) CSS尺寸(不可继 ...
- Prometheus + Grafana 监控系统搭
本文主要介绍基于Prometheus + Grafana 监控Linux服务器. 一.Prometheus 概述(略) 与其他监控系统对比 1 Prometheus vs. Zabbix Zabbix ...
- Scala 基础(九):Scala 函数式编程(一)基础(一)概念、定义、调用机制
1 概念的说明 1)在scala中,方法和函数几乎可以等同(比如他们的定义.使用.运行机制都一样的),只是函数的使用方式更加的灵活多样. 2)函数式编程是从编程方式(范式)的角度来谈的,可以这样理解: ...
- MYSQL 之 JDBC(十六): DBUtils
DBUtils是Apache组织提供的一个开源的JDBC工具类库,能极大简化jdbc编码的工作量 API介绍 QueryRunner ResultSetHandler 工具类DbUtils 用DBUt ...
- scrapy 基础组件专题(十二):scrapy 模拟登录
1. scrapy有三种方法模拟登陆 1.1直接携带cookies 1.2找url地址,发送post请求存储cookie 1.3找到对应的form表单,自动解析input标签,自动解析post请求的u ...
- Presto原理及安装
背景 MapReduce不能满足大数据快速实时adhoc查询计算的性能要求,Facebook2012年开发,2013年开源 是什么 基于内存的并行计算,Facebook推出的分布式SQL交互式查询引擎 ...
- 爬虫黑科技,我是怎么爬取indeed的职位数据的
最近在学习nodejs爬虫技术,学了request模块,所以想着写一个自己的爬虫项目,研究了半天,最后选定indeed作为目标网站,通过爬取indeed的职位数据,然后开发一个自己的职位搜索引擎,目前 ...