详解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 相关文章推荐
JavaScript对象学习经验整理
Oct 12 Javascript
jquery中JSON的解析方式
Mar 16 Javascript
jQuery使用load()方法载入另外一个网页文件内的指定标签内容到div标签的方法
Mar 25 Javascript
Angular中$compile源码分析
Jan 28 Javascript
jquery实现右侧栏菜单选择操作
Mar 04 Javascript
jQuery实现的表头固定效果实例【附完整demo源码下载】
Aug 01 Javascript
bootstrap滚动监控器使用方法解析
Jan 13 Javascript
pace.js和NProgress.js两个加载进度插件的一点小总结
Jan 31 Javascript
Layui给数据表格动态添加一行并跳转到添加行所在页的方法
Aug 20 Javascript
TypeScript中使用getElementXXX()的示例代码
Sep 12 Javascript
vue实现扫码功能
Jan 17 Javascript
详细介绍Next.js脚手架完整搭建封装
Apr 26 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
PHP中的正规表达式(二)
2006/10/09 PHP
PHP中使用Imagick操作PSD文件实例
2015/01/26 PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
2016/04/02 PHP
PHP实现的限制IP投票程序IP来源分析
2016/05/04 PHP
中高级PHP程序员应该掌握哪些技术?
2016/09/23 PHP
PHP截取发动短信内容的方法
2017/07/04 PHP
laravel 实现根据字段不同值做不同查询
2019/10/23 PHP
用 Javascript 验证表单(form)中多选框(checkbox)值
2009/09/08 Javascript
表单切换,用回车键替换Tab健(不支持IE)
2011/07/20 Javascript
jQuery EasyUI API 中文文档 - ComboBox组合框
2011/10/07 Javascript
Event altKey,ctrlKey,shiftKey属性解析
2013/12/18 Javascript
JQuery插件fancybox无法在弹出层使用左右键的解决办法
2013/12/25 Javascript
jquery SweetAlert插件实现响应式提示框
2015/08/18 Javascript
基于jquery实现动态竖向柱状条特效
2016/02/12 Javascript
javascript的 {} 语句块详解
2016/02/27 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
2016/09/12 Javascript
JS二叉树的简单实现方法示例
2017/04/05 Javascript
Angularjs 动态添加指令并绑定事件的方法
2017/04/13 Javascript
angularJs中$http获取后台数据的实例讲解
2018/08/08 Javascript
js核心基础之构造函数constructor用法实例分析
2019/05/11 Javascript
关于vue 结合原生js 解决echarts resize问题
2020/07/26 Javascript
利用python编写一个图片主色转换的脚本
2017/12/07 Python
Python设计模式之观察者模式原理与用法详解
2019/01/16 Python
Python实现对特定列表进行从小到大排序操作示例
2019/02/11 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
2019/04/29 Python
Python中利用LSTM模型进行时间序列预测分析的实现
2019/07/26 Python
关于matplotlib-legend 位置属性 loc 使用说明
2020/05/16 Python
python利用proxybroker构建爬虫免费IP代理池的实现
2021/02/21 Python
雏鹰争章活动总结
2014/05/09 职场文书
有关九一八事变的演讲稿
2014/09/14 职场文书
领导走群众路线整改措施思想汇报
2014/10/12 职场文书
先进集体申报材料
2014/12/25 职场文书
《我的伯父鲁迅先生》教学反思
2016/02/16 职场文书
python3实现无权最短路径的方法
2021/05/12 Python
Spring中的使用@Async异步调用方法
2021/11/01 Java/Android
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js