详解Vue内部怎样处理props选项的多种写法
作者:边城少年_ 发布时间:2024-05-03 15:10:39
标签:Vue,props,选项
开发过程中,props 的使用有两种写法:
// 字符串数组写法
const subComponent = {
props: ['name']
}
// 对象写法
const subComponent = {
props: {
name: {
type: String,
default: 'Kobe Bryant'
}
}
}
Vue在内部会对 props 选项进行处理,无论开发时使用了哪种语法,Vue都会将其规范化为对象的形式。具体规范方式见Vue源码 src/core/util/options.js 文件中的 normalizeProps 函数:
/**
* Ensure all props option syntax are normalized into the
* Object-based format.(确保将所有props选项语法规范为基于对象的格式)
*/
// 参数的写法为 flow(https://flow.org/) 语法
function normalizeProps (options: Object, vm: ?Component) {
const props = options.props
// 如果选项中没有props,那么直接return
if (!props) return
// 如果有,开始对其规范化
// 声明res,用于保存规范化后的结果
const res = {}
let i, val, name
if (Array.isArray(props)) {
// 使用字符串数组的情况
i = props.length
// 使用while循环遍历该字符串数组
while (i--) {
val = props[i]
if (typeof val === 'string') {
// props数组中的元素为字符串的情况
// camelize方法位于 src/shared/util.js 文件中,用于将中横线转为驼峰
name = camelize(val)
res[name] = { type: null }
} else if (process.env.NODE_ENV !== 'production') {
// props数组中的元素不为字符串的情况,在非生产环境下给予警告
// warn方法位于 src/core/util/debug.js 文件中
warn('props must be strings when using array syntax.')
}
}
} else if (isPlainObject(props)) {
// 使用对象的情况(注)
// isPlainObject方法位于 src/shared/util.js 文件中,用于判断是否为普通对象
for (const key in props) {
val = props[key]
name = camelize(key)
// 使用for in循环对props每一个键的值进行判断,如果是普通对象就直接使用,否则将其作为type的值
res[name] = isPlainObject(val)
? val
: { type: val }
}
} else if (process.env.NODE_ENV !== 'production') {
// 使用了props选项,但它的值既不是字符串数组,又不是对象的情况
// toRawType方法位于 src/shared/util.js 文件中,用于判断真实的数据类型
warn(
`Invalid value for option "props": expected an Array or an Object, ` +
`but got ${toRawType(props)}.`,
vm
)
}
options.props = res
}
如此一来,假如我的 props 是一个字符串数组:
props: ["team"]
经过这个函数之后,props 将被规范为:
props: {
team:{
type: null
}
}
假如我的 props 是一个对象:
props: {
name: String,
height: {
type: Number,
default: 198
}
}
经过这个函数之后,将被规范化为:
props: {
name: {
type: String
},
height: {
type: Number,
default: 198
}
}
注:对象的写法也分为以下两种,故仍需进行规范化
props: {
// 第一种写法,直接写类型
name: String,
// 第二种写法,写对象
name: {
type: String,
default: 'Kobe Bryant'
}
}
最终会被规范为第二种写法。
来源:https://www.jianshu.com/p/f528880d9051


猜你喜欢
- 问题描述在深度学习相关任务的训练时,需要在训练的每个 epoch 记录当前 epoch 的准确率(如下图所示),那么在 python 中要怎
- 实现2048相对来说比较简单,用4*4的二维数组保存地图,pygame.key.get_pressed()获取键盘操作,详见代码。效果图代码
- 很早之前就在PJ的blog上看到可以用VS2005调试ASP程序,但是没有写出具体的步骤,后来一次偶尔也让我找到了方法,但是一直没把它写出来
- 什么是固件Fixture 翻译成中文即是固件的意思。它其实就是一些函数,会在执行测试方法/测试函数之前(或之后)加载运行它们,常见的如接口用
- Python OpenCV存储图像使用的是Numpy存储,所以可以将Numpy当做图像类型操作,操作之前还需进行类型转换,转换到int8类型
- C#调用python脚本在平常工程项目开发过程中常常会涉及到机器学习、深度学习算法方面的开发任务,但是受限于程序设计语言本身的应用特点,该类
- 在爬虫的获取数据上,一直在讲一些爬取的方法,想必小伙伴们也学习了不少。在学习的过程中遇到了问题,大家也会一起交流解决,找出不懂和出错的地方。
- 我们都知道,python可以通过threading module来创建新的线程,然而在创建线程的线程(父线程)关闭之后,相应的子线程可能却没
- 本文实例为大家分享了python3磁盘空间监控的具体代码,供大家参考,具体内容如下软硬件环境python3apscheduler前言在做频繁
- Dim iSet conn=Server.CreateObject("ADODB.Connecti
- 百度了一下,找了点别人的方法改进了一下。 获取天气网址:http://www.weather.com.cn/html/weather/101
- 在机器学习或者深度学习中,我们常常碰到一个问题是数据集的切分。比如在一个比赛中,举办方给我们的只是一个带标注的训练集和不带标注的测试集。其中
- 背景简介ImageAI是一个面向计算机视觉编程的Python库,支持最先进的机器学习算法。主要图像预测,物体检测,视频对象检测与跟踪等多个应
- 前序1、cookie介绍Cookie是一段不超过4KB的小型文本数据,保存在客户端浏览器中,由一个名称(Name)、一个值(Value)和其
- 本文实例讲述了Python实现base64编码的图片保存到本地功能。分享给大家供大家参考,具体如下:# -*- coding:utf-8 -
- 因些朋友发来邮件讲根据文章修改后无效,懒羊再次检查后发现在工具栏中并无添加,所以还得做一下下面步骤,再此给大家造成的不便还请多多谅解!因FC
- pylint是一个不错的代码静态检查工具。将其配置在pycharm中,随时对代码进行分析,确保所有代码都符合pep8规范,以便于养成良好的习
- sql exist的妙用create table b(a varchar(10),b varchar(10),c varchar(10))i
- 1 案例描述输入三个整数x,y,z,请把这三个数由小到大输出。2 Python实现2.1 方法一(官方)L = []for i in ran
- 1、DataFrame返回的不是对象。2、DataFrame查出来的数据返回的是一个dataframe数据集。3、DataFrame只有遇见