VUE的props理解

vue的组件之间是独立的,为了在组件之间传递数据,我们需要用到不同的手段。
父组件->子组件:props
子组件->父组件:触发事件

image

在这里首先要理清一个概念,什么是父组件和子组件?是好像HTML的父元素和子元素一样吗?
根据Vue.js官方文档来推断:
1.组件 A 在它的模板中使用了组件 B。
2.父组件模板的内容在父组件作用域内编译;子组件模板的内容在子组件作用域内编译。
一个常见错误是试图在父组件模板内将一个指令绑定到子组件的属性/方法:

<!-- 无效 -->
<child-component v-show="someChildProperty"></child-component>

假定someChildProperty是子组件的属性,上例不会如预期那样工作。父组件模板并不感知子组件的状态。
如果要绑定子组件作用域内的指令到一个组件的根节点,你应当在子组件自己的模板里做:

Vue.component('child-component', {
// 有效,因为是在正确的作用域内
template:'<div v-show="someChildProperty">Child</div>',
data:function(){
return{
someChildProperty:true
}
}
})

好了,根据上述,我们可以推断,在上例中,child-component是父组件,而template的内容是为子组件。
这个推断是否正确呢?我在百度上参考了别人的一些说法,有的则声称其实在自定义组件childcomponent的一个实例前面会生成一个隐藏的根元素,父组件就是这个根元素。
SF的一个提问里面有各种说法,令人疑惑。


等我捋清楚再说,这里暂定推断是对的

props用于父组件向子组件传递数据,常配合bind指令使用
示例:

<div id="test">
<input v-model="parentmsg">
<child-compo :childmsg="parentmsg"></child-compo>
</div>
<script>
        var vm = new Vue({
            el: '#test2',
            data: {
                parentmsg: ''
            },
            components: {
                'child': {
                    props: ["childmsg"],
                    template: '<span>{{childmsg}}</span>'
                }
            }
        })

})
</script>

别搞错了,父组件不是input,这里使用input双向绑定parentmsg是为了动态定义传给父组件的数据,这里传给了父组件绑定的childmsg,而在组件的定义中props是["childmsg"],ok,这样子组件就和父组件连通了,所以template中可以调用childmsg。
返朴归真一下,我们不要动态,而是耿直地直接传一个定值:

<div id="test">
<input v-model="parentmsg">
<child-compo childmsg="this is child msg"></child-compo>
</div>

这样应该更好理解props传值的过程~
另外props还具备验证机制,当传入props的数据不符合验证的时候,会给出警告。
这里props的写法是:

Vue.component('example', {
  props: {
    // 基础类型检测 (`null` 指允许任何类型)
    propA: Number,
    // 可能是多种类型
    propB: [String, Number],
    // 必传且是字符串
    propC: {
      type: String,
      required: true
    },
    // 数值且有默认值
    propD: {
      type: Number,
      default: 100
    },
    // 数组/对象的默认值应当由一个工厂函数返回
    propE: {
      type: Object,
      default: function () {
        return { message: 'hello' }
      }
    },
    // 自定义验证函数
    propF: {
      validator: function (value) {
        return value > 10
      }
    }
  }
})

type 可以是下面原生构造器:

  • String
  • Number
  • Boolean
  • Function
  • Object
  • Array
  • Symbol
    注意一下,如果vue.js使用的是生产版本(压缩版本),后台是不会报错的,所以要记得去官网下载开发版本!
    配合input双向绑定使用验证机制更佳~


    图片.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,962评论 19 139
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,079评论 0 29
  • 1.安装 可以简单地在页面引入Vue.js作为独立版本,Vue即被注册为全局变量,可以在页面使用了。 如果希望搭建...
    Awey阅读 11,097评论 4 129
  • 首先声明下:各位做过围观哥的领导们,绝对不是说你! 你那么英明神武,怎么可能是猪呢? 1 围观哥刚入职场时,跟了一...
    围观哥阅读 594评论 0 0
  • 行进中的孩子,努力开放的花儿。 少了点阳光的陪伴,感觉少些什么...
    静好_a2df阅读 270评论 0 0