背景

使用 Element+ Layout 布局:

 <el-row>
<el-col :span="12"><div class="grid-content bg-purple"></div></el-col>
<el-col :span="12"><div class="grid-content bg-purple-light"></div></el-col>
</el-row>

Element+ Layout 将每一行的宽度平均分成 24 格,使用 span 描述每一列占用的格数,相当于每一列的宽度。

这段代码表示 1 行被拆分为 2 列,每一列占用 12 格,使用 span 属性指定,有一个奇怪的现象:

span 的属性值就是一个整数,不是变量名称,用不到属性绑定,前面为什么会有一个冒号?

去掉这个冒号行不行? 实际测试,不行!

为什么会注意到这个冒号现象?这里需要提一下 Vue3.js 的重要特性:属性绑定

Element+ 是基于 Vue3.js 实现的组件库。

<div id="1"></div>

这是一个简单的 div,且指定它的属性 id 值为 1;假设我们需要 动态 地指定它的 id,应该怎么做呢?

Vue3.js 提供的解决方案:可以定义一个变量 dynamicId,用于实际存储 id 值;然后将这个 div 的属性 id 绑定 到变量 dynamicId 上面,这个特性称之为 属性绑定

<div v-bind:id="dynamicId"></div>

属性 id 使用 属性绑定 时需要使用 v-bind: 进行标识,id 的值为需要绑定的变量名称 dynamicId;这样属性 id 的值就是变量 dynamicId 的值,如果变量 dynamicId 的值发生变化,属性 id 的值也会随之变化。

敲黑板!!! v-bind: 实际使用时可以简化为 : ,即单独的一个冒号,这就是属性名称前面冒号的由来。

问题

既然使用属性值是一个变量名称时才需要使用 v-bind: 或者 : 进行标识,为什么属性值为整数时,

<el-col :span="12">...</el-col>

v-bind: 或者 : 也必须被设置?

分析

既然问题和 属性绑定 有关,带着问题把 Vue3.js 官网相关文档又看了一遍:

重点:

对于所有的数据绑定,Vue.js 都提供了完全的 JavaScript 表达式支持。

表达式示例:

{{ number + 1 }}

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

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

<div v-bind:id="'list-' + id"></div>

疑问:

number + 1 是一个表达式,属于属性绑定;

number 是一个变量,属于属性绑定;

1 是什么?它只是一个整数字面量,也属于属性绑定?

带着疑问百度搜索相关问题,直到看到某个同学的文章:

加冒号的,说明后面的是一个变量或者表达式;没加冒号的后面就是对应的字符串字面量!

为什么vue组件的属性,有的需要加冒号“:”,有的不用?

解释说明:

  • 加冒号的

    属性名称前面使用 v-bind: 或者 : ,表示属性值部分为变量名或表达式;
  • 没加冒号的

    属性值部分为 字符串字面量

问题关键:字符串字面量!!! 也就是说,"1" 表示的是字符串的 1,而不是整数的 1;即字符串 1 并不会被内部转换为整数 1 使用。

这也就解释了为什么去掉冒号,Element+ Layout 布局会失败?

属性 span 要求的值类型是一个整数,如果去掉属性 span 前面的冒号,像这样:

<el-col span="12">...</el-col>

这里的 12 表面看起来是一个整数,实际 Vue3.js/Element+ 是按照字符串处理的,属性值类型异常,设置无效,因此布局失败。

属性 span 前面添加冒号,像这样:

<el-col :span="12">...</el-col>

这里的 12 很明显不是一个变量名,但会按照表达式处理;这个表达式的值为整数值 12,属性值类型正常,设置有效,因此布局成功。

敲黑板!!! 单个整数也是一个表达式。

结论

在 Vue3.js/Element+ 的世界里:

  • 属性名称前面没加冒号的

    属性值部分按普通字符串处理
  • 属性名称前面加冒号的

    属性值部分按属性绑定处理,属性值可能是以下三种类型:

    1. 变量名称
    2. 单个表达式
    3. 单个整数、布尔、字符串或其它数据类型的字面值

属性绑定时,如果属性值是一个字符串,Vue3.js 会优先判断是否存在名称为该字符串的变量名:

  • 如果存在,按变更名称处理
  • 如果不存在,按字符串字面值处理

@萌猫他爸,互联网从业者/大数据架构师/全栈开发者

  • Blog
  • Github @leaderman
  • 微博 @萌猫他爸(知乎/小红书/...)
  • 公众号 @渊深海阔
  • 微信号 @meetuagent

为什么 Vue3.js / Element+ 组件属性前面有的需要添加冒号,有的不需要?的更多相关文章

  1. 【前端vue进阶实战】:从零打造一个流程图、拓扑图项目【Nuxt.js + Element + Vuex】 (一)

    本系列教程是用Vue.js + Nuxt.js + Element + Vuex + 开源js绘图库,打造一个属于自己的在线绘图软件,最终效果:topology.le5le.com .如果你觉得好,欢 ...

  2. React组件属性部类(propTypes)校验

    React组件属性类型(propTypes)校验 Prop 验证 随着应用不断变大,保证组件被正确使用变得非常有用.为此我们引入propTypes.React.PropTypes 提供很多验证器 (v ...

  3. 谈谈Ext JS的组件——组件基类:Ext.Component

    概述 Ext.Component是所有Ext组件的基类,这在Ext.Component的API中第一句话就提到了.然后第二段说明了它包含的基本功能:隐藏/显示.启用/禁用以及尺寸控制等.除了以上这些基 ...

  4. React 学习(一) ---- React Element /组件/JSX

    学习React的时候,你可能听到最多的就是要先学习webpack, babel,要先学会配置然后才能学react 等等,一堆的配置就把我们吓着了,根本就没有心情就学习react了.其实在最开始学习re ...

  5. 【Vue课堂】Vue.js 父子组件之间通信的十种方式

    这篇文章介绍了Vue.js 父子组件之间通信的十种方式,不管是初学者还是已经在用 Vue 的开发者都会有所收获.无可否认,现在无论大厂还是小厂都已经用上了 Vue.js 框架,简单易上手不说,教程详尽 ...

  6. js插件---JS表格组件BootstrapTable行内编辑解决方案x-editable

    js插件---JS表格组件BootstrapTable行内编辑解决方案x-editable 一.总结 一句话总结:bootstrap能够做为最火的框架,绝对不仅仅只有我看到的位置,它应该还有很多位置可 ...

  7. 初学vue 在做项目时遇到的问题与解决办法(使用element组件)(二)

    表格每行里都有按钮 <el-table-column prop="option" label="操作" align="center" ...

  8. Vue3.x 关于组件的那些变化(新手必看篇)

    一.组件内的 data 为什么总是函数形式? 我们试着先做一个计数器案例,把 data 的返回形式修改成一个对象.具体的代码如下: <template> <div> <b ...

  9. Hibernate的映射组件属性

    组件属性 如果持久化类的属性并不是基本数据类型,也不是一个日期或者字符串常量,而是一个复合类型的对象,例如 private Name name; 那么这就是一个组件属性. 组件属性可以是任何普通的ja ...

随机推荐

  1. Heartbeat部署

    部署环境:CentOS 7 1.Heartbeat介绍 Heartbeat是Linux-HA项目中的一个组件,它实现了一个高可用集群系统.心跳检测和集群通信是高可用的两个关键组件,在Heartbeat ...

  2. checklist 编写指南

    checklist 编写工具 checklist文档格式推荐使用思维导图.比如 MindMaster 和 processon.我喜欢用这些平台或者软件的思维导图大纲模式来编写 checklist. c ...

  3. SpringBoot集成AOP

    AOP简介 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,AOP是OOP的延续.简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理技术,在不修改 ...

  4. Ajax创建对象的方法

    ajax涉及的技术包括Html.css.dom.xml.javascript等. 主流创建ajax对象的方法: IE6以下版本浏览器创建ajax对象方法是: 定义一个方法创建ajax对象:

  5. python unittest控制用例的执行顺序

    为什么要进行顺序控制呢?使用过testng的同学就知道,它相对于junit来说有更强大的功能,其中的一个功能就是依赖测试.什么是依赖测试呢?简单的说一下就是,A方法运行时,其中有个变量的取值是B方法的 ...

  6. Solution -「CF 1025D」Recovering BST

    \(\mathcal{Description}\)   Link.   给定序列 \(\{a_n\}\),问是否存在一棵二叉搜索树,使得其中序遍历为 \(\{a_n\}\),且相邻接的两点不互素.   ...

  7. MySQL安装,使用问题汇总

    一,安装问题 mysqld install时出现:The service already exists! 报错原因:以前机器上装过mysql没有卸载干净 解决方案: C:\windows\system ...

  8. 『无为则无心』Python面向对象 — 47、Python中的self详解

    目录 1.self的作用 2.self的使用注意事项 (1)self代表类的实例,而非类 (2)self不必非写成self,只是一种规范. (3)类中方法的形参中一定要写self,包括内置函数 (4) ...

  9. Python语法进阶(2)- 正则表达式

    1.初识正则表达式 1.1.什么是正则表达式 正则表达式是一个特殊的字符序列,便于检查一个字符串是否与某种模式匹配:应用于字符串,在字符串中通过复杂的过滤筛选等操作得到我们想要的数据: 正则表达式的特 ...

  10. spring IOC的理解,原理与底层实现?

    从总体到局部 总 控制反转:理论思想,原来的对象是由使用者来进行控制,有了spring之后,可以把整个对象交给spring来帮我们进行管理                DI(依赖注入):把对应的属性 ...