Vue对DOM元素的class和style两个特性做了专门的增强,即对CSS类和内联样式做了一层封装,通过v-bind指令来处理它们,而接收的表达式既可以是简单的字符串、对象或数组,也可以是复杂的计算属性。不仅如此,Vue还为表单设计了一些语法糖,让表单处理变得尤为简单。

一、CSS类

  v-bind指令与class参数配合,就能处理CSS类,并且能接收多种类型的值。

1)对象

  v-bind:class可以接收一个对象,对象的属性名就是CSS类名,只有当其值是真值时,才能添加到DOM元素上,否则会被忽略。下面的<p>元素会接收数据对象中的classList,它包含两个属性warning和cur,其中cur属性保存了一个假值。

<p v-bind:class="classList">strick</p>
<script>
var vm = new Vue({ 
data: {  
classList: {
warning: true,
cur: ""
} 
}
});
</script>

  渲染出的<p>元素如下所示,不包含cur类。

<p class="warning">strick</p>

  此外,v-bind:class可简写成:class,并且能与普通的class特性共存,如下所示。

<p :class="classList" class="size">strick</p>

2)数组

  当v-bind:class接收一个数组时,其元素既可以是CSS类名,也可以是对象,格式与之前相同,如下所示。

<p :class="[classList, cur]">strick</p>
<script>
var vm = new Vue({ 
data: {  
classList: {
warning: true
},
cur: "cur" 
}
});
</script>

二、内联样式

  v-bind指令与style参数配合,就能避免通过字符串拼接的方式来处理内联样式,并且也能接收多种类型的值。

1)对象

  v-bind:style可以接收一个对象,对象的属性名有两种命名方式:驼峰式和连字符分隔式,第二种就是层叠样式表中的CSS属性的命名方式。下面的<p>元素会接收数据对象中的cssObj,其属性采用了两种命名方式。

<p :style="cssObj">strick</p>
<script>
var vm = new Vue({ 
data: {  
cssObj: {
"fontSize": "30px",
"line-height": 2
} 
}
});
</script>

  渲染出的<p>元素如下所示。

<p style="font-size: 30px; line-height: 2;">strick</p>

  Vue允许为属性赋一个包含多个值的数组(即多重值),可让浏览器选择支持的属性,例如定义不同阶段的伸缩盒样式,如下所示。

<p :style="{display: ['-webkit-box', '-ms-flexbox', 'flex']}">strick</p>

2)数组

  当v-bind:style接收一个数组时,其元素就是样式对象,并且如果出现同名的CSS属性,那么后面的会覆盖前面的。例如下面的cssObj1和cssObj2两个对象都包含line-height属性,而最终渲染出的值为1.5。

<p :style="[cssObj1, cssObj2]">strick</p>
<script>
var vm = new Vue({ 
data: {  
cssObj1: {
"fontSize": "30px",
"line-height": 2
},
cssObj2: {
"line-height": 1.5
} 
}
});
</script>

3)浏览器前缀

  Vue会自动侦测浏览器样式的兼容性,并根据需要为CSS属性(例如border-radius、transform等)添加相应的浏览器前缀。

  下面的代码摘自Vue.js,其中camelize()函数可将连字符分隔式的字符串转换成驼峰式的字符串;vendorNames变量记录了三种浏览器前缀;normalize()函数会判断传入的属性是否存在于<div>元素的style属性中,如果不存在,就为其添加浏览器前缀,而之所以单独处理filter属性是因为Chrome的一个bug,虽然Chrome只支持-webkit-filter属性,但是style属性中保存的却是无前缀的filter。

var camelizeRE = /-(\w)/g;
var camelize = cached(function(str) {
return str.replace(camelizeRE, function(_, c) {
return c ? c.toUpperCase() : "";
});
}); var vendorNames = ["Webkit", "Moz", "ms"];
var emptyStyle;
var normalize = cached(function(prop) {
emptyStyle = emptyStyle || document.createElement("div").style;
prop = camelize(prop);
if (prop !== "filter" && prop in emptyStyle) {
return prop;
}
var capName = prop.charAt(0).toUpperCase() + prop.slice(1);
for (var i = 0; i < vendorNames.length; i++) {
var name = vendorNames[i] + capName;
if (name in emptyStyle) {
return name;
}
}
});

三、表单

  Vue提供了v-model指令,可在表单控件上实现双向数据绑定,即修改控件的值,也会自动更新Vue实例中所对应的数据对象的属性,反之亦然。

1)v-model

  下面用一个示例来演示v-model指令的用法,文本框的初始值是“strick”,当修改<input>元素中的值时,<p>元素的文本也会随之更新。

<input type="text" v-model="name"/>
<p>{{name}}</p>
<script>
var vm = new Vue({ 
data: {  
name: "strick" 
}
});
</script>

  而如果在控制台执行下面这条赋值语句,那么就会更新<input>元素中的值,其实这就是Vue的双向数据绑定所起的作用。

vm.name = "freedom";

  在使用v-model指令时需要注意,表单控件的初始值得声明在数据对象的属性中,而不是value、checked或selected这些特性中。还是以之前的文本框为例,添加了一个value特性,如下所示,渲染出的控件值将是“strick”,而不是“init”。

<input type="text" v-model="name" value="init"/>

  v-model本质上是个语法糖,它在内部会监听表单控件相关特性的变化,并触发相应的事件,其对应关系如表4所示。

表4  v-model指令内部的对应关系

表单控件 监听特性 触发事件
文本框(单行和多行) value input
单选框和复选框 checked change
选择框 <option>子元素中的value change

2)表单控件

  将v-model指令作用于表单控件时,其初始值常用的类型会有所不同,如下所示。

var vm = new Vue({
data: {
name: "", //文本框(单行和多行)
checked: true, //一个复选框
names: [], //多个复选框
color: "", //单选框
selected: "", //选择框(单选)
selecteds: [] //选择框(多选)
}
});

  当只使用一个复选框时,v-model指令可绑定一个布尔值;而当使用多个复选框时,v-model指令适合绑定数组,如下所示。

<input type="checkbox" v-model="checked" />

<input type="checkbox" value="strick" v-model="names"/>
<input type="checkbox" value="freedom" v-model="names"/>

  单选框与复选框不同,由于它只能选中一个值,因此不适合绑定数组,如下所示。

<input type="radio" value="red" v-model="color"/>
<input type="radio" value="black" v-model="color"/>

  选择框的multiple特性能控制其是否多选,而这也会决定是否需要绑定数组,如下所示。

<select v-model="selected">
<option value="1">strick</option>
<option value="2">freedom</option>
</select>
<select v-model="selecteds" multiple>
<option value="1">strick</option>
<option value="2">freedom</option>
</select>

3)值绑定

  单选框、复选框和选择框的值原先只能是字符串或布尔值,而通过v-bind指令就能让它们绑定任意类型的值,如下所示,为两个单选框的value特性绑定了一个对象。当选中其中一个按钮时,color属性的值就会更新成绑定的对象。

<input type="radio" v-model="color" :value="{digit: 1}" />
<input type="radio" v-model="color" :value="{digit: 2}" />

  复选框包含两个特殊的特性:true-value和false-value(如下代码所示),当将其选中时,toggle属性会更新为yes属性的值,否则更新为no属性的值。

<input type="checkbox" v-model="toggle" :true-value="yes" :false-value="no" />
<script>
var vm = new Vue({ 
data: {  
toggle: 1,
yes: 1,
no: 0
}
});
</script>

4)修饰符

  Vue为v-model指令提供了3个修饰符,如下所列,每个修饰符后面都给出了相应的示例。

  (1).lazy修饰符能将同步输入值的事件从input替换成change,以下面的文本框为例,只有当修改其值并失去焦点时,才会更新数据对象的name属性。

<input type="text" v-model.lazy="name" />

  (2).number修饰符能让输入值自动转换成数字,常与number类型的文本框配合使用。

<input type="number" v-model.number="age" />

  (3).trim修饰符能过滤输入值的首尾空格。

<input type="text" v-model.trim="school" />    

Vue躬行记(3)——样式和表单的更多相关文章

  1. React躬行记(7)——表单

    表单元素是一类拥有内部状态的元素,这些状态由其自身维护,通过这类元素可让用户与Web应用进行交互.HTML中的表单元素(例如<input>.<select>和<radio ...

  2. Vue躬行记(9)——Vuex

    Vuex是一个专为Vue.js设计的状态管理库,适用于多组件共享状态的场景.Vuex能集中式的存储和维护所有组件的状态,并提供相关规则保证状态的独立性.正确性和可预测性,这不仅让调试变得可追踪,还让代 ...

  3. Vue躬行记(2)——指令

    Vue不仅内置了各类指令,包括条件渲染.事件处理等,还能注册自定义指令. 一.条件渲染 条件渲染的指令包括v-if.v-else.v-else-if和v-show. 1)v-if 该指令的功能和条件语 ...

  4. Vue躬行记(4)——组件

    组件是可复用的Vue实例,拥有属于自己的数据.模板.脚本和样式,可避免繁重的重复性开发.由于组件都是独立的,因此其内部代码不会影响其它组件,但可以包含其它组件,并且相互之间还能通信. 一.注册 在使用 ...

  5. Vue躬行记(7)——渲染函数和JSX

    除了可通过模板创建HTML之外,Vue还提供了渲染函数和JSX,前者的编码自由度很高,后者对于开发过React的人来说会很熟悉.注意,Vue的模板最终都会被编译成渲染函数. 一.渲染函数 虽然在大部分 ...

  6. Vue躬行记(1)——数据绑定

    Vue.js的核心是通过基于HTML的模板语法声明式地将数据绑定到DOM结构中,即通过模板将数据显示在页面上,如下所示. <div id="container">{{c ...

  7. Vue躬行记(5)——组件通信

    组件之间除了保持独立之外,还需要相互通信,本章将介绍几种通信的方式. 一.直接访问 Vue提供了三个实例属性,可直接访问父组件.子组件和根实例,如下所列. (1)$parent:父组件. (2)$ro ...

  8. Vue躬行记(6)——内容分发

    Vue提供了一种内容分发技术,可将父组件中的内容传递给子组件的模板,实现方式参照了Web组件规范草案. 一.插槽 Vue内置了一个<slot>元素,能作为插槽(slot)存在,而插槽内可包 ...

  9. Vue躬行记(8)——Vue Router

    虽然Vue.js未提供路由功能,但是官方推出了Vue Router(即vue-router库),以插件的形式支持.它与Vue.js深度集成,可快速的创建单页应用(Single Page Applica ...

随机推荐

  1. MyBatis基础之几道常见面试题详解

    (原文链接:http://www.studyshare.cn/blog/details/1178/1 一.开发中到底应该使用resultType还是resultMap? 强制使用resultMap,不 ...

  2. GO 语言学习笔记--数组切片篇

    1.对于make 数组切片,长度和容量需要理解清楚: 容量表示底层数组的大小,长度是你可以使用的大小: 容量的用处在哪?在与当你用 appen d扩展长度时,如果新的长度小于容量,不会更换底层数组,否 ...

  3. windows任务计划定时备份sqlserver数据库

    使用windows的任务计划新建一个sqlserver数据库的定时备份任务 一.      (我是以sqlserver2008r2数据库版本测试的)在G盘下新建文集夹Database_backup,首 ...

  4. Single Number 普通解及最小空间解(理解异或)

    原题目 Given a non-empty array of integers, every element appears twice except for one. Find that singl ...

  5. 最大公共子序列(Runtime faster than 92.73% of Python3)

    其中的算法思想只是较为简单的动态规划,过去各种各样的考试写过很多次C/C++版本的,最近开始用Python做leetcode中的题目时遇到了该题目,很常规的做法竟然得到了意想不到的速度,但内存占用较差 ...

  6. Java Synchronized Method This Static Class Object 区别

    1. 必须基于对象 Synchronized Method 和 Synchronized(this) 块,除了范围小点 (方法和块),没差别都是阻塞整个对象 - 如果对象有多个 Synchronize ...

  7. [AWS] Lambda by Python

    当前统治数据分析的语言还是Python,还是暂时走:Python + GPU的常规路线好了. numba, pyculib (分装了cublas) Ref: 使用 Python 构建 Lambda 函 ...

  8. hadoop之hdfs架构详解

    本文主要从两个方面对hdfs进行阐述,第一就是hdfs的整个架构以及组成,第二就是hdfs文件的读写流程. 一.HDFS概述 标题中提到hdfs(Hadoop Distribute File Syst ...

  9. 网络编程之多线程——GIL全局解释器锁

    网络编程之多线程--GIL全局解释器锁 一.引子 定义: In CPython, the global interpreter lock, or GIL, is a mutex that preven ...

  10. Java网络编程--Netty中的责任链

    Netty中的责任链 设计模式 - 责任链模式 责任链模式(Chain of Responsibility Pattern)是一种是行为型设计模式,它为请求创建了一个处理对象的链.其链中每一个节点都看 ...