详解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 相关文章推荐
在Z-Blog中运行代码[html][/html](纯JS版)
Mar 25 Javascript
jquery插件jbox使用iframe关闭问题
Feb 09 Javascript
JQUERY 实现窗口滚动搜索框停靠效果(类似滚动停靠)
Mar 27 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
Jan 05 Javascript
js 打开新页面在屏幕中间的实现方法
Nov 02 Javascript
vue.js评论发布信息可插入QQ表情功能
Aug 08 Javascript
jQuery基于cookie实现换肤功能实例
Oct 14 jQuery
实战node静态文件服务器的示例代码
Mar 08 Javascript
jQuery实现带3D切割效果的轮播图功能示例【附源码下载】
Apr 04 jQuery
细述Javascript的加法运算符的具体使用
Oct 18 Javascript
vue vant Area组件使用详解
Dec 09 Javascript
nuxt 每个页面head标签内容设置方式
Nov 05 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/10/09 PHP
增加反向链接的101个方法 站长推荐
2007/01/31 PHP
简单PHP上传图片、删除图片实现代码
2010/05/12 PHP
PHP中iconv函数知识汇总
2015/07/02 PHP
Yii快速入门经典教程
2015/12/28 PHP
php简单生成一组与多组随机字符串的方法
2017/05/09 PHP
PHP安装BCMath扩展的方法
2019/02/13 PHP
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
javascript中使用正则计算中文长度的例子
2014/04/29 Javascript
做web开发 先学JavaScript
2014/12/12 Javascript
js读取并解析JSON类型数据的方法
2015/11/14 Javascript
学习vue.js表单控件绑定操作
2016/12/05 Javascript
JavaScript实现弹出广告功能
2017/03/30 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
2017/10/20 Javascript
VUE-Table上绑定Input通过render实现双向绑定数据的示例
2018/08/27 Javascript
vue父组件触发事件改变子组件的值的方法实例详解
2019/05/07 Javascript
简单了解前端渐进式框架VUE
2020/07/20 Javascript
详解vue中v-on事件监听指令的基本用法
2020/07/22 Javascript
python操作MySQL数据库具体方法
2013/10/28 Python
python操作oracle的完整教程分享
2018/01/30 Python
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
2018/06/04 Python
python: 判断tuple、list、dict是否为空的方法
2018/10/22 Python
django-rest-swagger的优化使用方法
2019/08/29 Python
python 魔法函数实例及解析
2019/09/25 Python
python对象销毁实例(垃圾回收)
2020/01/16 Python
一款利用纯css3实现的360度翻转按钮的实例教程
2014/11/05 HTML / CSS
英国领先的奢侈品零售商之一:CRUISE
2016/12/02 全球购物
化学实验员岗位职责
2013/12/28 职场文书
北京申奥口号
2014/06/19 职场文书
2014年秋季新学期寄语
2014/08/02 职场文书
预备党员自我批评思想汇报
2014/10/10 职场文书
2016年小学植树节活动总结
2016/03/16 职场文书
党组织结对共建协议书
2016/03/23 职场文书
golang协程池模拟实现群发邮件功能
2021/05/02 Golang