一、为属性绑定变量

在前面第一部分中,我们已经可以使用Vue来动态绑定元素中的值了,但是我们该怎样绑定为元素的属性绑定一个变量呢?

1. v-bind的基本使用

我们可以使用v-bind来为一个元素的属性绑定一个在Vue实例中定义好的变量,语法为:

v-bind:属性名="表达式"

如下例所示:

var app = new Vue({
el: '#app',
data: {
imgURL: "https://dss1.baidu.com/6ONXsjip0QIZ8tyhnq/it/u=2296203553,2815843260&fm=58",
aHref: "http://baidu.com",
aName: "百度一下"
}
});
<div id="app">
<!-- 错误的做法 -->
<!-- <img src="{{imgURL}}" alt=""> -->
<img v-bind:src="imgURL" alt="">
<a v-bind:href="aHref">{{aName}}</a> <!-- 语法糖写法,实际开发主要使用 -->
<img :src="imgURL" alt="">
<a :href="aHref">{{aName}}</a>
</div>

运行结果:

可以发现元素上属性的值都可以由变量指定了,而 :属性名="表达式"是原始写法的语法糖。

2. v-bind动态绑定class(对象语法)

语法:

v-bind:class="obj"

其中obj是一个js对象,它的变量名)是某个类的类名bool类型,决定这个类是否绑定到该元素上

示例:

var app = new Vue({
el: '#app',
data: {
message: "你好啊",
active: "active",
isActive: true,
isLine: true,
},
methods: {
btnClick: function () {
this.isActive = !this.isActive;
},
getClasses: function () {
return { active: this.isActive, line: this.isLine };
}
}
});
.active {
color: red;
}
<div id="app">
<h2 class="active">第一个:{{message}}</h2>
<h2 :class="active">第二个:{{message}}</h2> <!-- <h2 v-bind:class="{key1:value, key2:value}"></h2> -->
<!-- <h2 v-bind:class="{类名1:true, 类名2:false}"></h2> -->
<h2 class="title" v-bind:class="{active:isActive, line:isLine}">TrueOrFalse</h2>
<h2 class="title" v-bind:class="getClasses()">TrueOrFalse</h2>
<button v-on:click="btnClick">变色</button>
</div>

运行结果:

3. v-bind动态绑定class(数组语法)

语法:

v-bind:class="list"

其中list是一个js数组,其中的各个元素的值(字符串)是要绑定到该html元素的class。

示例如下:

var app = new Vue({
el:'#app',
data:{
message:"你好啊",
active:"aaaa",
line:"bbbb",
},
methods:{
getClasses:function(){
return ["aaa","bbb"]
}
}
});
<div id="app">
<!-- 有单引号当做字符串,无当做变量解析 -->
<h2 :class="['active','line']">{{message}} </h2>
<h2 :class="[active, line]">{{message}} </h2>
<h2 :class="getClasses()">{{message}} </h2>
</div>

运行结果:

4. v-bind动态绑定style(对象语法)

语法:

v-bind:style="obj"

其中objVue实例中的一个js对象,它的变量名)对应着css样式属性,而对应着该样式属性的值,因此我们可以通过改变obj中的某个键的改变某个样式

示例:

var app = new Vue({
el: '#app',
data: {
message: "你好啊",
finalSize: "100px",
finalInt: 100,
finalColor: "red"
},
methods: {
getStyles: function () {
return { fontSize: this.finalInt + 'px', color: this.finalColor }
},
addSize: function () {
if (this.finalInt < 130) {
this.finalInt += 10;
}
},
subSize: function () {
if (this.finalInt > 50) {
this.finalInt -= 10;
}
},
change: function () {
if (this.finalColor == 'blue') {
this.finalColor = 'red';
}
else {
this.finalColor = 'blue';
}
}
}
});
<div id="app">
<!-- <h2 :style="{key(属性名):value(属性值)}">{{message}} </h2> -->
<!-- <h2 :style="{fontSize:'50px'}">{{message}} </h2> -->
<!-- <h2 :style="{fontSize: finalSize}">{{message}}</h2> -->
<h2 :style="{fontSize: finalInt+'px', color: finalColor}">{{message}}</h2>
<h2 :style="getStyles()">{{message}}</h2>
<button @click="addSize">+</button>
<button @click="subSize">-</button>
<button @click="change">变色</button>
</div>

5. v-bind动态绑定style(数组语法)

语法:

v-bind:style="list"

其中list是一个js数组,其中的各个元素的值(对象)是要绑定到该html元素的style键值对。其中键名变量名)是style属性名,值是对应属性值。

示例:

var app = new Vue({
el:'#app',
data:{
message:"你好啊",
baseStyle:{backgroundColor:'red'},
baseStyle1:{fontSize:'100px'}
},
methods:{}
});
<div id="app">
<h2 :style="[baseStyle, baseStyle1]">{{message}}</h2>
</div>

运行效果:

二、计算属性

计算属性被编写到Vue实例中的computed属性中

语法:

...
computed: {
计算属性名(一般以名词命名): function () {
// 相当于一个属性
return xxx;
}
},
...

在语法上和方法的写法基本相同。

1. 基本使用

var app = new Vue({
el: '#app',
data: {
firstName: "Lebron",
lastName: "James"
},
computed: {
fullName: function () {
// 相当于一个属性
return this.firstName + " " + this.lastName;
}
},
methods: {
getFullName: function () {
return this.firstName + " " + this.lastName;
}
}
});
<div id="app">
<h2>{{firstName+" "+lastName}} </h2>
<h2>{{firstName}} {{lastName}} </h2>
<h2>{{getFullName()}} </h2>
<h2>{{fullName}} </h2>
</div>

运行结果:

可以发现使用方法计算属性都可以得到正确的结果。

2. 计算属性的setter和getter

语法:

computed:{
计算属性名:{
set:function(){
...
},
get:function(){
...
}
}
},

且计算属性一般是没有set方法的

3. 计算属性和method对比

最主要的差别是计算属性在第一次返回结果后会有缓存机制,若结果相同则不会再次计算,如下例所示:

var app = new Vue({
el: '#app',
data: {
firstName: "Kobe",
lastName: "Bryant",
},
computed: {
fullName: function () {
console.log("+++++")
return this.firstName + " " + this.lastName;
}
},
methods: {
getFullName: function () {
console.log("=========")
return this.firstName + " " + this.lastName;
}
}
});
<div id="app">
<h2>{{getFullName()}} </h2>
<h2>{{getFullName()}} </h2>
<h2>{{getFullName()}} </h2>
<h2>{{getFullName()}} </h2> <!-- 缓存机制 -->
<h2>{{fullName}} </h2>
<h2>{{fullName}} </h2>
<h2>{{fullName}} </h2>
<h2>{{fullName}} </h2>
</div>

运行结果:

可以发现getFullName()方法执行了4次,而fullName计算属性只执行了1次

三、事件监听

v-on的基本使用可以参照上个部分的计数器。

1. v-on的参数问题

  1. 如果没有传入参数,则默认的参数为undifined
<button @click="click1()">按钮1</button>
  1. 如果不写函数的括号,则会默认将event对象传递过去
<button @click="click2">按钮2</button>
  1. 如何手动获得浏览器产生的event对象(使用$event
<button @click="click3(123, $event)">按钮3</button>

示例:

var app = new Vue({
el: '#app',
data: {},
methods: {
click1() {
console.log("按钮1");
},
click2(abc) {
console.log(abc);
},
click3(abc, event) {
console.log(abc, event);
}
}
});
<div id="app">
<button @click="click1()">按钮1</button> <!-- 如果没有传入参数,则默认参数为undefined -->
<!-- <button @click="click2(123)">按钮2</button> -->
<!-- <button @click="click2()">按钮2</button> -->
<!-- 这种情况会将event对象传递过去 -->
<button @click="click2">按钮2</button> <!-- 如何手动获得浏览器产生的event对象 -->
<button @click="click3(123, $event)">按钮3</button>
</div>

运行结果:


2. v-on修饰符

click的.stop修饰符

这个修饰符可以阻止事件气泡往下传递

对比:

<div @click="divClick">
inside div
<button @click="btnClick">按钮</button>
</div>

和:

<div @click="divClick">
inside div
<button @click.stop="btnClick">按钮</button>
</div>

第一种情况除了btnClick()方法会被调用外,button元素的父元素div也会收到点击事件,进而divClick()函数也会被调用。

而第二种情况则使用了.stop阻止气泡向下传递,只有btnClick()方法会被调用。

click的.prevent修饰符

作用:阻止事件的默认行为,然后执行后面引用的method

例如:

<form action="baidu">
<input type="submit" value="提交" @click.prevent="submitClick">
</form>

这样当点击按钮时不会提交表单,而之后调用submitClick()方法。

click的.once修饰符

作用:事件只监听一次

<button @click.once="btn2Click">
按钮2
</button>

这种情况下多次点击button,只会执行一次btn2Click()方法

keydown的.enter修饰符

作用:监听键盘的点击

<input type="text" @keydown.enter="keyDown">

Vue学习笔记(二)动态绑定、计算属性和事件监听的更多相关文章

  1. Blazor和Vue对比学习(基础1.8):Blazor中实现计算属性和数据监听

    1.7章<传递UI片断>,需要做几个案例,这部分暂停消化几天.我们先把基础部分相对简单的最后两章学习了. 计算属性和数据监听是Vue当中的概念,本质上都是监听数据的变化,然后做出响应.两者 ...

  2. WebView使用详解(二)——WebViewClient与常用事件监听

      登录|注册     关闭 启舰 当乌龟有了梦想……       目录视图 摘要视图 订阅 异步赠书:Kotlin领衔10本好书      免费直播:AI时代,机器学习如何入门?      程序员8 ...

  3. vue computed计算属性和watch监听属性解疑答惑

    computed计算属性     计算属性类似于方法,用于输出data中定义的属性数据的结果,data数据变化时,计算属性的结果会同步变化,需要注意的是计算属性不可与data定义的属性同名. 相比于方 ...

  4. vue2.0 之计算属性和数据监听

    计算属性computed <template> <div> <input type="text" name="" v-model= ...

  5. android菜鸟学习笔记23----ContentProvider(三)利用内置ContentProvider监听短信及查看联系人

    要使用一个ContentProvider,必须要知道的是它所能匹配的Uri及其数据存储的表的结构. 首先想办法找到访问短信及联系人数据的ContentProvider能接受的Uri: 到github上 ...

  6. vue学习笔记(二)vue的生命周期和钩子函数

    前言 通过上一章的学习,我们已经初步的了解了vue到底是什么东西,可以干什么,而这一篇博客主要介绍vue的生命周期和它常用的钩子函数,如果有学过java的园友可能有接触到在学习servlet的时候学过 ...

  7. Vue学习笔记二:v-cloak,v-text,v-html的使用

    目录 v-cloak:解决插值表达式闪烁问题 安装插件Live Server 右键以HTTP形式运行HTML v-text:以属性方式使用插值表达式 v-cloak和v-text的区别 v-html: ...

  8. VUE 学习笔记 二 生命周期

    1.除了数据属性,Vue 实例还暴露了一些有用的实例属性与方法.它们都有前缀 $,以便与用户定义的属性区分开来 var data = { a: 1 } var vm = new Vue({ el: ' ...

  9. VUE学习笔记二

    package.json不可以写注释!!!!!!!!!!初始化:npm init -y 有时候使用 npm i node-sass -D 装不上,这时候,就必须使用  cnpm i node-sass ...

随机推荐

  1. 基于ABP落地领域驱动设计-05.实体创建和更新最佳实践

    目录 系列文章 数据传输对象 输入DTO最佳实践 不要在输入DTO中定义不使用的属性 不要重用输入DTO 输入DTO中验证逻辑 输出DTO最佳实践 对象映射 学习帮助 系列文章 基于ABP落地领域驱动 ...

  2. CosId 1.0.3 发布,通用、灵活、高性能的分布式 ID 生成器

    CosId 通用.灵活.高性能的分布式 ID 生成器 介绍 CosId 旨在提供通用.灵活.高性能的分布式系统 ID 生成器. 目前提供了俩大类 ID 生成器:SnowflakeId (单机 TPS ...

  3. 阿里云中quick bi用地图分析数据时维度需转换为地理区域类型

    1.到数据集里面点击编辑要做地图分析的数据集 2.找到要分析的地理维度字段,选择转换为对应的类型,这里为市级,所以选择转换为市,其它类似,然后点击右上角保存即可. 3.返回数据集,点击新建仪表板 4. ...

  4. Unity的AnimationCurve

    转自:风宇冲Unity3D教程学院http://blog.sina.com.cn/s/blog_471132920101f8nv.html,本文有多处增删减改,详细内容请查看原文. 1.介绍 Anim ...

  5. Windows10 上Docker 安装运行Consul

    背景简介 Consul是一种服务网格解决方案,提供具有服务发现,配置和分段功能的全功能控制平面. 这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全服务网格. Consul需要数据平面并 ...

  6. mac sudo: /etc/sudoers is world writable

    今天误操作修改了/etc/sudoers的权限,将它的权限改成了777,结果就导致执行所有sudo的命令都报错. sudo: /etc/sudoers is world writable sudo: ...

  7. mac 中一些日常小问题与快捷键

    1.备忘录中的中英文符号问题 比如:在备忘录中使用英文符号时,总是会被自动的修改为中文符号 解决方法:系统偏好设置-键盘-文本,去选"使用智能引号和存折号" p.p1 { marg ...

  8. buu signin

    一.拖入ida,来静态分析F5大法好 要注意的点: 1._gmz_init_set_str() 这个函数,也是看师傅的wp,学到的,以后还是得多google, 本质上是这个函数: int mpz_in ...

  9. TestComplete 最新安装教程

    在安装TestComplete之前阅读许可协议.通过安装TestComplete,您确认您同意许可的条款和条件. 查看"安装注意事项"部分,确保您的计算机满足硬件和软件要求. 安装 ...

  10. mysql 索引介绍与运用

    索引 (1)什么是索引? 是一种提升查询速度的 特殊的存储结构. 它包含了对数据表里的记录的指针,类似于字典的目录. 当我们添加索引时会单独创建一张表来去存储和管理索引,索引比原数据大,会占用更多的资 ...