详解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 相关文章推荐
Jquery each方法跳出循环,并获取返回值(实例讲解)
Dec 12 Javascript
jquery文档操作wrap()方法实例简述
Jan 10 Javascript
jQuery仿360导航页图标拖动排序效果代码分享
Aug 24 Javascript
JavaScript获取IP获取的是IPV6 如何校验
Jun 12 Javascript
简单实现轮播图效果的实例
Jul 15 Javascript
js拼接html字符串的注意事项
Oct 13 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
Mar 03 Javascript
AngularJs 常用的过滤器
May 15 Javascript
Node.js+jade抓取博客所有文章生成静态html文件的实例
Sep 19 Javascript
jquery select插件异步实时搜索实例代码
Oct 20 jQuery
jQuery.Sumoselect插件实现下拉复选框效果
Nov 09 jQuery
Vue的Options用法说明
Aug 14 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实现转换ubb代码的方法
2015/06/18 PHP
Yii视图CGridView列表用法实例分析
2016/07/12 PHP
Yii2框架dropDownList下拉菜单用法实例分析
2016/07/18 PHP
跨域表单提交状态的变相判断代码
2009/11/12 Javascript
在多个页面使用同一个HTML片段《续》
2011/03/04 Javascript
js和jquery设置disabled属性为true使按钮失效
2014/08/07 Javascript
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
jQuery封装的tab选项卡插件分享
2015/06/16 Javascript
浅析$.getJSON异步请求和同步请求
2016/06/06 Javascript
分享bootstrap学习笔记心得(组件及其属性)
2017/01/11 Javascript
基于jquery实现多级菜单效果
2017/07/25 jQuery
Vue-resource拦截器判断token失效跳转的实例
2017/10/27 Javascript
sublime text配置node.js调试(图文教程)
2017/11/23 Javascript
JS实现用特殊符号替换字符串的中间部分区域的实例代码
2018/07/24 Javascript
vue + elementUI实现省市县三级联动的方法示例
2019/10/29 Javascript
javascript实现拖拽碰撞检测
2020/03/12 Javascript
[01:09:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第一场 6.2
2018/06/04 DOTA
python3.4下django集成使用xadmin后台的方法
2017/08/15 Python
Djang的model创建的字段和参数详解
2019/07/27 Python
Python魔法方法 容器部方法详解
2020/01/02 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
pytorch 中forward 的用法与解释说明
2021/02/26 Python
eDreams澳大利亚:预订机票、酒店和度假产品
2017/04/19 全球购物
如何开发一个JQuery插件
2016/07/28 面试题
介绍一下Python下range()函数的用法
2013/11/07 面试题
Jdbc数据访问技术面试题
2012/03/30 面试题
毕业生自我鉴定
2013/11/05 职场文书
职业技术学校毕业生推荐信
2013/12/03 职场文书
大专生自我鉴定怎么写
2014/09/16 职场文书
三八妇女节标语
2014/10/09 职场文书
小学师德师风整改措施
2014/10/27 职场文书
工程安全生产协议书
2014/11/21 职场文书
2014年体育工作总结
2014/11/24 职场文书
小学老师对学生的评语
2014/12/29 职场文书
幼儿园科学课教学反思
2016/03/03 职场文书
PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤
2021/05/21 PostgreSQL