详解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的attr与prop使用介绍
Oct 10 Javascript
css样式标签和js语法属性区别
Nov 06 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
Oct 17 Javascript
js显示文本框提示文字的方法
May 07 Javascript
浅析2种JavaScript继承方式
Dec 04 Javascript
Angularjs全局变量被作用域监听的正确姿势
Feb 06 Javascript
微信小程序slider组件使用详解
Jan 31 Javascript
web页面和微信小程序页面实现瀑布流效果
Sep 26 Javascript
jQuery实现弹出层效果
Dec 10 jQuery
node+multer实现图片上传的示例代码
Feb 18 Javascript
解决echarts 一条柱状图显示两个值,类似进度条的问题
Jul 20 Javascript
vue实力踩坑之push当前页无效
Apr 10 Vue.js
微信小程序实现选项卡效果
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中mysql_connect与mysql_pconncet的区别详解
2013/05/15 PHP
基于PHP magic_quotes_gpc的使用方法详解
2013/06/24 PHP
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
2013/07/03 PHP
php中文乱码怎么办如何让浏览器自动识别utf-8
2014/01/15 PHP
php 使用array函数实现分页
2015/02/13 PHP
9个比较实用的php代码片段
2016/03/15 PHP
jquery1.5.1中根据元素ID获取元素对象的代码
2011/04/02 Javascript
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
JavaScript 5 新增 Array 方法实现介绍
2012/02/06 Javascript
jQuery截取指定长度字符串的实现原理及代码
2014/07/01 Javascript
使用JavaScript和CSS实现文本隔行换色的方法
2015/11/04 Javascript
js HTML5 Ajax实现文件上传进度条功能
2016/02/13 Javascript
jQuery简单实现iframe的高度根据页面内容自适应的方法
2016/08/01 Javascript
JS不完全国际化&本地化手册 之 理论篇
2016/09/27 Javascript
JavaScript实现使用Canvas绘制图形的基本教程
2016/10/27 Javascript
jquery做个日期选择适用于手机端示例
2017/01/10 Javascript
详解能在多种前端框架下使用的表格控件
2017/01/11 Javascript
js canvas实现QQ拨打电话特效
2017/05/10 Javascript
用最少的JS代码写出贪吃蛇游戏
2018/01/12 Javascript
jQuery实现监听下拉框选中内容发生改变操作示例
2018/07/13 jQuery
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
javascript中call,apply,callee,caller用法实例分析
2019/07/24 Javascript
基于VUE实现判断设备是PC还是移动端
2020/07/03 Javascript
vue实现图书管理系统
2020/12/29 Vue.js
用Python操作字符串之rindex()方法的使用
2015/05/19 Python
python判断字符串编码的简单实现方法(使用chardet)
2016/07/01 Python
Tensorflow 实现修改张量特定元素的值方法
2018/07/30 Python
解决python 找不到module的问题
2020/02/12 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
2020/04/01 Python
顶岗实习接收函
2014/01/09 职场文书
内刊编辑求职自荐书范文
2014/02/19 职场文书
春节联欢会主持词
2014/03/24 职场文书
领导班子专题民主生活会情况想汇报
2014/09/30 职场文书
师范生见习总结范文
2015/06/23 职场文书
Pytorch DataLoader shuffle验证方式
2021/06/02 Python
使用 DataAnt 监控 Apache APISIX的原理解析
2022/07/07 Servers