背景

使用 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. docker中使用systemctl启动服务

    解决 Failed to get D-Bus connection: Operation not permitted https://serverfault.com/questions/824975/ ...

  2. SharePoint Online 触发 Outlook 邮件内审批

    前言 我们在做SharePoint Online项目时, 经常会有客户问,我们能否在通知邮件中快速完成审批,而不是需要在邮件中打开系统,然后在系统中审批? 答案肯定是可以的,来!安排! 正文 1.我们 ...

  3. 2022.02.04 Day1

    前言 为日后的算法面试做准备,自己也很喜欢算法这个东西,每天3~5道题. 刷题 1.leetcode 209 长度最下的子数组 题目 长度最下的子数组 大致的意思是从数组中找到长度最小的数组,并且数组 ...

  4. Redis 中如何保证数据的不丢失,Redis 中的持久化是如何进行

    Redis 中数据的持久化 前言 AOF 持久化 什么是 AOF 持久化 为什么要后记录日志呢 AOF 的潜在风险 AOF 文件的写入和同步 AOF 文件重写机制 AOF 的数据还原 RDB 持久化 ...

  5. 编写PHP扩展

    转载请注明来源:https://www.cnblogs.com/hookjc/ PHP 5.2 环境的扩展(PHP Extension) 需求:比如开发一个叫做 heiyeluren  的扩展,扩展里 ...

  6. iOS 性能优化系列

    Objective-C 高性能的循环 使用 Swift 和 Objective-C 执行 iOS 内存管理的 7 个简单技巧 @autoreleasepool-内存的分配与释放

  7. 2022寒假集训day4

    day4(day5补完的) 继续刷搜索方面的题, 初步了解了序列. T1 迷宫问题 题目描述设有一个 n*n 方格的迷宫,入口和出口分别在左上角和右上角.迷宫格子中分别放 0 和 1 ,0 表示可通, ...

  8. 一站式超全JavaScript数组方法大全

    一站式JavaScript数组方法大全(建议收藏) 方法一览表 详细操作 本人总结了JavaScript中有关数组的几乎所有方法(包含ES6之后新增的),并逐一用代码进行演示使用,希望可以帮助大家! ...

  9. linux_17

    nginx负载均衡中常见的算法及原理有哪些? 用rewrite规则实现将所有到a域名的访问rewrite到b域名 实现反向代理客户端IP透传 利用LNMP实现wordpress站点搭建

  10. opencv笔记-SimpleBlobDetector

    通用的 Blob 检测方法包括:Laplacian of Gaussian(LoG), Difference of Gaussian(DoG), Derterminant of Hessian(DoH ...