详解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 相关文章推荐
?牟┛途W扣了一??效果出?? target=
May 27 Javascript
把html页面的部分内容保存成新的html文件的jquery代码
Nov 12 Javascript
JavaScript 在网页上单击鼠标的地方显示层及关闭层
Dec 30 Javascript
Extjs4 GridPanel 的几种样式使用介绍
Apr 18 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
Apr 20 Javascript
js兼容pc端浏览器并有多种弹出小提示的手机端浮层控件实例
Apr 29 Javascript
关于js里的this关键字的理解
Aug 17 Javascript
详解Bootstrap创建表单的三种格式(一)
Jan 04 Javascript
详解vue-admin和后端(flask)分离结合的例子
Feb 12 Javascript
解决vue2.0路由跳转未匹配相应用路由避免出现空白页面的问题
Aug 24 Javascript
基于vue-cli3创建libs库的实现方法
Dec 04 Javascript
Vue.extend 登录注册模态框的实现
Dec 29 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
第十二节--类的自动加载
2006/11/16 PHP
Optimizer与Debugger兼容性问题的解决方法
2008/12/01 PHP
php function用法如何递归及return和echo区别
2014/03/07 PHP
php数组排序usort、uksort与sort函数用法
2014/11/17 PHP
PHP 使用redis简单示例分享
2015/03/05 PHP
php通过asort()给关联数组按照值排序的方法
2015/03/18 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
ExtJs 表单提交登陆实现代码
2010/08/19 Javascript
JavaScript新窗口与子窗口传值详解
2014/02/11 Javascript
浅析基于WEB前端页面的页面内容搜索的实现思路
2014/06/10 Javascript
jquery实现跳到底部,回到顶部效果的简单实例(类似锚)
2016/07/10 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
2016/10/18 Javascript
Bootstrap列表组学习使用
2017/02/09 Javascript
JavaScript正则表达式校验与递归函数实际应用实例解析
2017/08/04 Javascript
vue.js在标签属性中插入变量参数的方法
2018/03/06 Javascript
基于jQuery.i18n实现web前端的国际化
2018/05/04 jQuery
浅谈Webpack下多环境配置的思路
2018/06/27 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
2018/08/29 Javascript
Nuxt.js实战和配置详解
2019/08/05 Javascript
详细分析vue响应式原理
2020/06/22 Javascript
如何在postman中添加cookie信息步骤解析
2020/06/30 Javascript
python3.0 字典key排序
2008/12/24 Python
python 切片和range()用法说明
2013/03/24 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
2018/04/02 Python
python3 cvs将数据读取为字典的方法
2018/12/22 Python
python 函数的缺省参数使用注意事项分析
2019/09/17 Python
python装饰器使用实例详解
2019/12/14 Python
python实现暗通道去雾算法的示例
2020/09/27 Python
Python pymysql模块安装并操作过程解析
2020/10/13 Python
优秀小学生家长评语
2014/01/30 职场文书
个人实习生的自我评价
2014/02/16 职场文书
演讲稿开场白台词
2014/08/25 职场文书
房屋维修协议书范本
2014/09/25 职场文书
2016年六一儿童节开幕词
2016/03/04 职场文书
go 实现简易端口扫描的示例
2021/05/22 Golang
pytorch 6 batch_train 批训练操作
2021/05/28 Python