详解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 Event学习补遗 addEventSimple
Feb 11 Javascript
JavaScript与Image加载事件(onload)、加载状态(complete)
Feb 14 Javascript
JavaScript中数据结构与算法(四):串(BF)
Jun 19 Javascript
jQuery简单实现input文本框内灰色提示文本效果的方法
Dec 02 Javascript
JS实现多级菜单中当前菜单不随页面跳转样式而发生变化
May 30 Javascript
vue组件间通信子与父详解(二)
Nov 07 Javascript
Vue中$refs的用法详解
Jun 24 Javascript
使用D3.js+Vue实现一个简单的柱形图
Aug 05 Javascript
jquery实现垂直无限轮播的方法分析
Jul 16 jQuery
微信小程序实现选择地址省市区三级联动
Jun 21 Javascript
three.js 制作动态二维码的示例代码
Jul 31 Javascript
JavaScript常用工具函数库汇总
Sep 17 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
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
PHP父类调用子类方法的代码例子
2014/04/09 PHP
PHP实现的DES加密解密实例代码
2016/04/06 PHP
PHP类和对象相关系统函数与运算符小结
2016/09/28 PHP
jquery easyui combox一些实用的小方法
2013/12/25 Javascript
js格式化金额可选是否带千分位以及保留精度
2014/01/28 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
2016/03/22 Javascript
Adapter适配器模式在JavaScript设计模式编程中的运用分析
2016/05/18 Javascript
jQuery EasyUI Pagination实现分页的常用方法
2016/05/21 Javascript
使用jQuery调用XML实现无刷新即时聊天
2016/08/07 Javascript
jquery实现简单的瀑布流布局
2016/12/11 Javascript
微信小程序 登录实例详解
2017/01/16 Javascript
vue中如何引入jQuery和Bootstrap
2017/04/10 jQuery
基于zepto.js实现手机相册功能
2017/07/11 Javascript
Vue 2.0学习笔记之使用$refs访问Vue中的DOM
2017/12/19 Javascript
使用FileReader API创建Vue文件阅读器组件
2018/04/03 Javascript
layer插件select选中默认值的方法
2018/08/14 Javascript
详解使用jest对vue项目进行单元测试
2018/09/07 Javascript
React冒泡和阻止冒泡的应用详解
2020/08/18 Javascript
在Angular项目使用socket.io实现通信的方法
2021/01/05 Javascript
python使用urllib2实现发送带cookie的请求
2015/04/28 Python
Python守护进程用法实例分析
2015/06/04 Python
Python常用内置模块之xml模块(详解)
2017/05/23 Python
《Python学习手册》学习总结
2018/01/17 Python
python中logging包的使用总结
2018/02/28 Python
python3+PyQt5实现自定义流体混合窗口部件
2018/04/24 Python
Python从单元素字典中获取key和value的实例
2018/12/31 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
python爬虫构建代理ip池抓取数据库的示例代码
2020/09/22 Python
新百伦折扣店:Joe’s New Balance Outlet
2016/08/20 全球购物
马来西亚最大的电器网站:Senheng
2017/10/13 全球购物
教师思想工作总结2015
2015/05/13 职场文书
员工手册董事长致辞
2015/07/29 职场文书
NGINX 权限控制文件预览和下载的实现原理
2022/01/18 Servers
Python 图片添加美颜效果
2022/04/28 Python