【Vue】Vue 的 Props 如何初始化

13 篇文章 0 订阅
11 篇文章 0 订阅

1.为什么props在html模板中要使用kebab-case (短横线分隔命名),而在Vue的options里面声明props却要用camelCase (驼峰命名法)?
2.Vue中是如何初始化props属性的?

HTML层面:

在这里插入图片描述

代码层面:

在_init初始化过程中,如果Vue实例有props属性时候,会对props的属性进行遍历操作,把props里的内容(数组、对象)变成Vue实例的props对象中的属性

比如:
props:[beginDate]
会变成
props[beginDate] = {type:null}

props:{a:{name:‘luo’}} 或 props:{name}
会变成
props[a] = {name:‘luo’} 或 props[name] = {type:null}

在这里插入图片描述

相关代码:

src\core\instance\init.js 中的 _init 方法:当判断是Vue实例时候进入到mergeOptions方法中
在这里插入图片描述

mergeOptions在src\core\util\options.js中进行实现
normalizeProps方法则是格式化option中的props

在这里插入图片描述

normalizeProps 函数实现如下
function normalizeProps (options: Object, vm: ?Component) {
  const props = options.props
  if (!props) return
  const res = {}
  let i, val, name
  // 根据props是数组还是对象形式进行不同的遍历处理,都是返回一个res对象
  // camelize 转换props属性名字,把连接字符串形式转换成驼峰式命名
  // isPlainObject 判断是否是对象,返回true or false
  if (Array.isArray(props)) {
    i = props.length
    while (i--) {
      val = props[i]
      if (typeof val === 'string') {
        name = camelize(val)
        res[name] = { type: null }
      } else if (process.env.NODE_ENV !== 'production') {
        warn('props must be strings when using array syntax.')
      }
    }
  } else if (isPlainObject(props)) {
    for (const key in props) {
      val = props[key]
      name = camelize(key)
      res[name] = isPlainObject(val)
        ? val
        : { type: val }
    }
  } else if (process.env.NODE_ENV !== 'production') {
    warn(
      `Invalid value for option "props": expected an Array or an Object, ` +
      `but got ${toRawType(props)}.`,
      vm
    )
  }
  // 处理后的props重新赋值回Vue实例的options.props对象上
  options.props = res
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 2.0中,我们可以通过props来向子组件传递数据。props可以用于初始化子组件的数据。 在父组件中,我们可以使用v-bind指令来将父组件的数据传递给子组件的props。比如,如果我们有一个名为message的数据需要传递给子组件,我们可以这样写: ``` <template> <div> <child-component v-bind:prop-name="message"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue' export default { components: { ChildComponent }, data() { return { message: 'Hello, World!' } } } </script> ``` 在子组件中,我们可以通过props选项来声明props初始化值。比如,如果我们希望子组件接收名为propName的props初始化为一个空字符串,我们可以这样写: ``` <template> <div> <p>{{ propName }}</p> </div> </template> <script> export default { props: { propName: { type: String, default: '' } } } </script> ``` 这样,当父组件的message发生改变时,子组件的propName也会更新为父组件的message的值。 需要注意的是,props是单向数据流,只能由父组件向子组件传递数据,子组件不能直接修改props的值。如果子组件需要修改props的值,可以通过在子组件中使用事件,将修改后的值传递给父组件,然后由父组件再将新的值传递给子组件的props。 总结起来,Vue 2.0中,我们可以通过props初始化子组件的数据,父组件可以使用v-bind指令将数据传递给子组件的props,子组件可以通过props选项声明props初始化值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值