详解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 web对话框与弹出窗口
Feb 22 Javascript
jquery 双色表格实现代码
Dec 08 Javascript
Jquery下判断Id是否存在的代码
Jan 06 Javascript
javaScript(JS)替换节点实现思路介绍
Apr 17 Javascript
JavaScript实现图片轮播的方法
Jul 31 Javascript
JavaScript数组去重的几种方法效率测试
Oct 23 Javascript
简单明了区分escape、encodeURI和encodeURIComponent
May 26 Javascript
ES6 系列之 WeakMap的使用示例
Aug 06 Javascript
AngularJS发送异步Get/Post请求方法
Aug 13 Javascript
JavaScript类型相关的常用操作总结
Feb 14 Javascript
jQuery操作cookie的示例代码
Jun 05 jQuery
vue-cli3自动消除console.log()的调试信息方式
Oct 21 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中一个完整表单处理实现代码
2011/11/10 PHP
php 获取本地IP代码
2013/06/23 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
php操作xml入门之xml标签的属性分析
2015/01/23 PHP
PHP代码实现表单数据验证类
2015/07/28 PHP
PHP基于DOMDocument解析和生成xml的方法分析
2017/07/17 PHP
jquery之超简单的div显示和隐藏特效demo(分享)
2013/07/09 Javascript
JS获取当前网址、主机地址项目根路径
2013/11/19 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
2016/01/30 Javascript
简介EasyUI datagrid editor combogrid搜索框的实现
2016/04/01 Javascript
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
2016/06/07 Javascript
基于JS代码实现图片在页面中旋转效果
2016/06/16 Javascript
jquery获取链接地址和跳转详解(推荐)
2017/08/15 jQuery
Vue2.5学习笔记之如何在项目中使用和配置Vue
2018/09/26 Javascript
vue单文件组件lint error自动fix与styleLint报错自动fix详解
2019/01/08 Javascript
layui 实现table翻页滚动条位置保持不变的例子
2019/09/05 Javascript
js生成1到100的随机数最简单的实现方法
2020/02/07 Javascript
JavaScript Event Loop相关原理解析
2020/06/10 Javascript
Vue实现开关按钮拖拽效果
2020/09/22 Javascript
关于vue属性使用和不使用冒号的区别说明
2020/10/22 Javascript
Python实现在tkinter中使用matplotlib绘制图形的方法示例
2018/01/18 Python
python DataFrame 修改列的顺序实例
2018/04/10 Python
Python将文字转成语音并读出来的实例详解
2019/07/15 Python
浅谈Python中(&,|)和(and,or)之间的区别
2019/08/07 Python
windows下的pycharm安装及其设置中文菜单
2020/04/23 Python
印尼最大的在线购物网站:MatahariMall.com
2016/08/26 全球购物
澳大利亚最好的电动自行车:Leon Cycle
2020/12/19 全球购物
static函数与普通函数有什么区别
2015/12/25 面试题
路政管理专业个人自荐信范文
2013/11/30 职场文书
房地产端午节活动方案
2014/08/24 职场文书
党支部班子“四风”问题自我剖析材料
2014/09/28 职场文书
保护环境建议书作文300字
2015/09/14 职场文书
物业管理交接协议书
2016/03/24 职场文书
python基础之爬虫入门
2021/05/10 Python
JavaScript小技巧带你提升你的代码技能
2021/09/15 Javascript
Java中的Kafka为什么性能这么快及4大核心详析
2022/09/23 Java/Android