详解Vue内部怎样处理props选项的多种写法


Posted in Javascript onNovember 06, 2018

开发过程中,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'
 }
}

最终会被规范为第二种写法。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js自定义事件及事件交互原理概述(二)
Feb 01 Javascript
js兼容的placeholder属性详解
Aug 18 Javascript
百度地图自定义控件分享
Mar 04 Javascript
JS+CSS实现带有碰撞缓冲效果的竖向导航条代码
Sep 15 Javascript
json格式数据的添加,删除及排序方法
Jan 21 Javascript
JavaScript学习笔记整理_关于表达式和语句
Sep 19 Javascript
seajs模块之间依赖的加载以及模块的执行
Oct 21 Javascript
bootstrap3 dialog 更强大、更灵活的模态框
Apr 20 Javascript
Vue中保存用户登录状态实例代码
Jun 07 Javascript
Webpack path与publicPath的区别详解
May 03 Javascript
性能优化篇之Webpack构建速度优化的建议
Apr 03 Javascript
javascrpt密码强度校验函数详解
Mar 18 Javascript
微信小程序实现选项卡效果
Nov 06 #Javascript
Vue props 单向数据流的实现
Nov 06 #Javascript
给localStorage设置一个过期时间的方法分享
Nov 06 #Javascript
移动端H5页面返回并刷新页面(BFcache)的方法
Nov 06 #Javascript
学习使用ExpressJS 4.0中的新Router的用法
Nov 06 #Javascript
vue项目上传Github预览的实现示例
Nov 06 #Javascript
React Component存在的几种形式详解
Nov 06 #Javascript
You might like
数字转英文
2006/12/06 PHP
php下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
php中设置多级目录session的问题
2011/08/08 PHP
PHP json格式和js json格式 js跨域调用实现代码
2012/09/08 PHP
zend framework中使用memcache的方法
2016/03/04 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
PHP simplexml_import_dom()函数讲解
2019/02/03 PHP
浅谈laravel框架sql中groupBy之后排序的问题
2019/10/17 PHP
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
2012/01/15 Javascript
js事件监听器用法实例详解
2015/06/01 Javascript
Javascript在IE和Firefox浏览器常见兼容性问题总结
2016/08/03 Javascript
jQuery简单实现遍历单选框的方法
2017/03/06 Javascript
教你快速搭建Node.Js服务器的方法教程
2017/03/30 Javascript
jquery实现图片轮播器
2017/05/23 jQuery
nodejs body-parser 解析post数据实例
2017/07/26 NodeJs
详解使用Visual Studio Code对Node.js进行断点调试
2017/09/14 Javascript
layui 选择列表,打勾,点击确定返回数据的例子
2019/09/02 Javascript
JavaScript实现随机点名器
2020/03/25 Javascript
关于angular浏览器兼容性问题的解决方案
2020/07/26 Javascript
Python中的模块和包概念介绍
2015/04/13 Python
Python实现FTP上传文件或文件夹实例(递归)
2017/01/16 Python
详解python中Numpy的属性与创建矩阵
2018/09/10 Python
PyCharm配置mongo插件的方法
2018/11/30 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
Python+Pyqt实现简单GUI电子时钟
2021/02/22 Python
用Cython加速Python到“起飞”(推荐)
2019/08/01 Python
在keras下实现多个模型的融合方式
2020/05/23 Python
制定岗位职责的原则
2013/11/08 职场文书
医药代表个人的求职信分享
2013/12/08 职场文书
企业安全生产责任书范本
2014/07/28 职场文书
幼儿园秋季开学通知
2015/07/16 职场文书
观看《筑梦中国》纪录片心得体会
2016/01/18 职场文书
初中政治教学反思
2016/02/23 职场文书
Oracle创建只读账号的详细步骤
2021/06/07 Oracle
Windows环境下实现批量执行Sql文件
2021/10/05 SQL Server
Python list列表删除元素的4种方法
2021/11/01 Python