美文网首页
深入了解组件

深入了解组件

作者: 努力与幸运 | 来源:发表于2018-06-25 15:24 被阅读41次

    从今天开始使用markdown编辑。

    全局注册(注册之后可以用在任何新创建的 Vue 根实例 (new Vue) 的模板中)

    Vue.component('component-a', {/* ... */})
    newVue({el:'#app'})
    

    全局注册的行为必须在根 Vue 实例 (通过 new Vue) 创建之前发生

    局部注册(局部注册的组件在其子组件中不可用

    varComponentA = {/* ... */}
    newVue({
    el:'#app'
      components: {
    'component-a': ComponentA,
    'component-b': ComponentB
      }
    }) 
    

    Prop

    HTML 中的特性名是大小写不敏感的,所以浏览器会把所有大写字符解释为小写字符。这意味着当你使用 DOM 中的模板时,camelCase (驼峰命名法) 的 prop 名需要使用其等价的 kebab-case (短横线分隔命名) 命名。

    //js
    Vue.component('blog-post', {
      // 在 JavaScript 中是 camelCase 的
      props: ['postTitle'],
      template: '<h3>{{ postTitle }}</h3>'
    })
    
    //html
    <blog-post post-title="hello!"></blog-post>
    

    以对象形式列出 prop,这些属性的名称和值分别是 prop 各自的名称和类型:

    //JS
    props: {
      title: String,
      likes: Number,
      isPublished: Boolean,
      commentIds: Array,
      author: Object
    }
    

    传递静态或动态Prop

    静态的prop值:

    <blog-post title="Vue work"></blog-post>
    

    动态的prop可以通过v-bind赋值

    <!-- 动态赋予一个变量的值 -->
    <blog-post v-bind:title="post.title"></blog-post>
    
    <!-- 动态赋予一个复杂表达式的值 -->
    <blog-post v-bind:title="post.title + ' by ' + post.author.name"></blog-post>
    

    在上述两个示例中,我们传入的值都是字符串类型的,但实际上任何类型的值都可以传给一个 prop。

    <blog-post v-bind:likes="42"></blog-post>
    <blog-post v-bind:likes="post.likes"></blog-post>
    
    <!-- 包含该 prop 没有值的情况在内,都意味着 `true`。-->
    <blog-post is-published></blog-post>
    <!-- 包含该 prop 没有值的情况在内,都意味着 `true`。-->
    <blog-post v-bind:is-published="false"></blog-post>
    <blog-post v-bind:is-published="post.isPublished"></blog-post>
    
    <blog-post v-bind:comment-ids="[234, 266, 273]"></blog-post>
    <blog-post v-bind:comment-ids="post.commentIds"></blog-post>
    
    <blog-post v-bind:author="{ name: 'Veronica', company: 'Veridian Dynamics' }"></blog-post> 
    <blog-post v-bind:author="post.author"></blog-post>
    
    post: {
      id: 1,
      title: 'My Journey with Vue'
    }
    <blog-post v-bind="post"></blog-post>
    

    单向数据流

    所有的prop都使得其父子prop之间形成了一个单向下行绑定:父级prop的更新会向下流动到子组件中,但是反过来则不行。
    (1) 这个prop用来传递一个初始值;这个子组件接下来希望将其作为本地的prop数据来使用。

    //最好定义一个本地的 data 属性并将这个 prop 用作其初始值
    props: ['initialCounter'],
    data: function () {
      return {
        counter: this.initialCounter
      }
    }
    

    (2)这个 prop 以一种原始的值传入且需要进行转换

    //最好使用这个 prop 的值来定义一个计算属性
    props: ['size'],
    computed: {
      normalizedSize: function () {
        return this.size.trim().toLowerCase()
      }
    }
    

    注意在 JavaScript 中对象和数组是通过引用传入的,所以对于一个数组或对象类型的 prop 来说,在子组件中改变这个对象或数组本身将会影响到父组件的状态。

    prop 验证

    可以为 props 中的值提供一个带有验证需求的对象,而不是一个字符串数组

    Vue.component('my-component',{
      prop:{
        //基础的类型检查(null匹配任何类型)
    propA:Number,
      //多个可能的类型
    propB:[String,Number],
    //必填的字符串
    propC:{
    //type 取值:String、Number、Boolean、Array、Object、Date、Function、Symbol
      type:String,
    required:true
    }
    //带有默认值的数字
    }
    })
     
    

    当 prop 验证失败的时候,(开发环境构建版本的) Vue 将会产生一个控制台的警告。
    当type是function时,这样用

    funtion Person(firstname,lastName){
    this.firstName = firatName;
    this.lastName = lastName;
    }
    //使用方法
    Vue.component('blog-post',{
    props:{
      author:Person
    }
    })
    

    不希望组件的根元素继承特性,在组件的选项中设置 inheritAttrs: false

    相关文章

      网友评论

          本文标题:深入了解组件

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