美文网首页
深入理解prop

深入理解prop

作者: A郑家庆 | 来源:发表于2019-06-01 20:15 被阅读0次

传递静态或动态Prop

传入静态的值:

<blog-post title="My journey with Vue"></blog-post>

这时候值是一个字符串
你也可以通过v-bind动态赋值:

<blog-post v-bind:title="post.title"></blog-post>

这时候值是一个js表达式

传入一个布尔值

// 包含该prop没有值的情况在内,都意味着true
<blog-post is-pushlished></blog-post>
<blog-post :is-pushlished="true"></blog-post>

传入一个对象的所有属性

如果你想要将一个对象的所有属性都作为prop传入,你可以使用不带参数的v-bind。例如,对于一个给定的对象post:

post: {
   id: 1,
   title: 'My Journey with Vue'
}
// 下面的模版
<blog-post v-bind="post"></blog-post>
// 等价于
<blog-post
  v-bind:id="post.id"
  v-bind:title="post.title"
></blog-post>

单向数据流

所有prop都使得其父子prop之间形成一个单向下行绑定:父级prop的更新会向下流动到子组件中,但是反过来不行。这样会防止从子组件意外改变父组件的状态,从而导致你的应用数据流向难以理解。
如果子组件改变引用类型的某个属性值,你会发现无法改变父组件的这个引用类型,并且也无法触发watch,但是你如果给这个对象添加一个属性和值就会改变父组件的这个对象,并且可以触发watch,如果再次改变添加的属性值那么只会触发watch,但是无法改变父组件的对象。
总结:父组件通过prop向子组件传递引用类型的值,这时候子组件是可以改变父组件通过prop传过来引用类型的值,如果是基本类型的值是不可以改变的

prop验证

Vuecomponent('my-component', {
    props: {
       propA: Number,
       // 多个可能的类型
       propB: [String, Number],
       // 是否必传,如果为true,则父组件必须要传这个值,否则报错
       propC: {
           type: String,
           required: true
       },
       // 带有默认值的对象
       propD: {
           type: Object,
           default: () => { message: 'hello' }
       },
       // 自定义验证函数,如果不符合条件就会报错
       propE: {
           validator: (value) => {
                return ['success', 'warning', 'danger'].indexOf(value) !== -1
           }
       }
    }
})

注意:prop会在一个组件实例创建之前进行验证,所以实例的属性(如data、computed等)在default或validator函数中是不可用的

非prop的特性

一个非prop特性是指传向一个组件,但是该组件并没有相应prop定义的特性。

<bootstrap data-date-picker="activated"></bootstrap>

data-date-picker="activated"这个特性就会自动添加到<bootstrap>的根元素上。

替换/合并已有的特性

假如子组件<bootstrap-date-input>的模板是这样的:

<input type="date" class="form-control">

这时候我们在子组件上添加一个type和一个class:

<bootstrap-date-input  type="text" class="date-picker"></bootstrap-date-input>

子组件的模版上已经有了这两个属性了,这时候我们发现子组件内部设置的type被外部的type替换成text,但是class合并成form-control和date-picker。
总结:除了class和style特性外部和内部的根元素会合并起来,其他的值会被外部替换掉

禁用特性继承

如果你不希望组件的根元素继承特性,你可以在组件的选项中设置inheritAttrs:false。例如:

Vue.component('my-component', {
    inheritAttrs:false,
    ....
})

这尤其适合配合实例的$attrs属性使用,该属性包含了传递给一个组件的特性名和特性值。

相关文章

  • 深入理解prop

    传递静态或动态Prop 传入静态的值: 这时候值是一个字符串你也可以通过v-bind动态赋值: 这时候值是一个js...

  • 高阶组件实现方式

    参考: 深入理解高阶组件 社区推荐 组合由于继承 高阶组件的主流实现方式: 属性代理 prop proxy 添加p...

  • Vue组件深入

    vue组件深入 组件注册 全局注册 局部注册 prop prop的大小写 camelCase vs Kebab-c...

  • vue学习

    理解 Vue 的单向数据流 所有的 prop 都使得其父子 prop 之间形成了一个「单向下行绑定」:父级 pro...

  • 深入浅析Vue中的Prop

    Prop 基本用法 Prop的基本用法很简单,只需要在子组件的Vue实例中定义该属性并把值设为目标属性的数组即可 ...

  • Android:ReactNative语法基础(下)

    Prop Prop可以理解为组件中的属性,它可以通过外界传递进来的参数,类似于构造函数的参数 1、属性参数 使用自...

  • 深入理解RxSwift

    深入理解RxSwift深入理解RxSwift

  • 深入理解 Symbol

    深入理解 Symbol深入理解 Symbol

  • 深入理解哈希表

    深入理解哈希表 深入理解哈希表

  • 写作

    践行越深入,理解越深入,理解越深入,理解越深入,践行的越好。 定位:个人品牌定位,专家思维。 为什么比如何做,更加...

网友评论

      本文标题:深入理解prop

      本文链接:https://www.haomeiwen.com/subject/kzqatctx.html