props相当于一个组建的输入,和JS中function(a,b){}中的a和b很像,是一种参数

如图展示

      const foo={
        props:['title'],
        template:'<div>局部组件{{title}}</div>',
      };

      const a=new Vue({
        el:'#app',
        components:{foo},
        template:'<div><foo title="this si props"></foo></div>'
      })

一、props类型

1)字符串数组形式列出的 prop:,写法如下 

props: ['title', 'likes', 'isPublished', 'commentIds', 'author']

 2)还可以使用对象的形式指定每一个prop的类型,在它们遇到错误的类型时从浏览器的 JavaScript 控制台提示用户,写法如下

props: {
  title: String,
  likes: Number,
  isPublished: Boolean,
  commentIds: Array,
  author: Object,
  callback: Function,
  contactsPromise: Promise // or any other constructor
}

 还可以这么写

props:{'title':{type:string}}

 正确例子如下:

     const foo={
        props:{'title':{
          type:Number
        }},
        template:'<div>局部组件{{title}}</div>',
      };

      const a=new Vue({
        el:'#app',
        components:{foo},
        template:'<div><foo v-bind:title="2"></foo></div>'
      })

 

 错误例子如下:

     const foo={
        props:{'title':{
          type:Number
        }},
        template:'<div>局部组件{{title}}</div>',
      };

      const a=new Vue({
        el:'#app',
        components:{foo},
        template:'<div><foo title="this si props"></foo></div>'
      })

 注意  当传的值是数字的时候需要使用v-bind写法或者简写:字段名,否则会给编译为字符串

 

 二、prop“传入”的类型:

1)传入的数据可以是动态的也可以是静态的

     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>

2)传入一个数字

使用v-bind告诉vue 42是数字不是字符串

<!-- 即便 `42` 是静态的,我们仍然需要 `v-bind` 来告诉 Vue -->
<!-- 这是一个 JavaScript 表达式而不是一个字符串。-->
<blog-post v-bind:likes="42"></blog-post>

<!-- 用一个变量进行动态赋值。-->
<blog-post v-bind:likes="post.likes"></blog-post>

3)传入一个布尔值

prop没有值,意味着true

<!-- 包含该 prop 没有值的情况在内,都意味着 `true`。-->
<blog-post is-published></blog-post>

<!-- 即便 `false` 是静态的,我们仍然需要 `v-bind` 来告诉 Vue -->
<!-- 这是一个 JavaScript 表达式而不是一个字符串。-->
<blog-post v-bind:is-published="false"></blog-post>

<!-- 用一个变量进行动态赋值。-->
<blog-post v-bind:is-published="post.isPublished"></blog-post>

4)传入一个数组

<!-- 即便数组是静态的,我们仍然需要 `v-bind` 来告诉 Vue -->
<!-- 这是一个 JavaScript 表达式而不是一个字符串。-->
<blog-post v-bind:comment-ids="[234, 266, 273]"></blog-post>

<!-- 用一个变量进行动态赋值。-->
<blog-post v-bind:comment-ids="post.commentIds"></blog-post>

5)传入一个对象

<!-- 即便对象是静态的,我们仍然需要 `v-bind` 来告诉 Vue -->
<!-- 这是一个 JavaScript 表达式而不是一个字符串。-->
<blog-post
  v-bind:author="{
    name: 'Veronica',
    company: 'Veridian Dynamics'
  }"
></blog-post>

<!-- 用一个变量进行动态赋值。-->
<blog-post v-bind:author="post.author"></blog-post>

6)传入一个对象所有property

如果你想要将一个对象的所有 property 都作为 prop 传入,你可以使用不带参数的 v-bind (取代 v-bind:prop-name)。例如,对于一个给定的对象 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>

三、props的默认值写法

利用default的写上默认值,当没有给prop传参就是执行展示默认值

1)带有默认值的数字

 const foo={
        props:{'title':{
          type:Number,
          default:0,
        }},
        template:'<div>局部组件{{title}}</div>',
      };

      const a=new Vue({
        el:'#app',
        components:{foo},
        template:'<div><foo ></foo></div>'
      })

2) 带有默认值的对象

      const foo={
        props:{'title':{
          type:Object,
          default: function () {
        return { message: 'hello' }
      },
        }},
        template:'<div>局部组件{{title.message}}</div>',
      };

      const a=new Vue({
        el:'#app',
        components:{foo},
        template:'<div><foo ></foo></div>'
      })

 

四、自定义函数验证传参

利用validator自定义验证函数当return true时说明传过来的参数通过验证当return false时就没有通过验证控制台会提示警告

写法如下

      const foo={
        props:{'title':{
          type:[String, Number,Object],
          default: function () {
        return { message: 'hello' }
      },
          validator:function(val){
            
            return val==='a';
          }
        }},
        template:'<div>局部组件{{title}}</div>',
      };

      const a=new Vue({
        el:'#app',
        components:{foo},
        template:'<div><foo title="a"></foo></div>'
      })

五、传值一定要写必填

利用required: true实现,如果不写控制台也会报错

     const foo={
        props:{'title':{
          type:[String, Number,Object],//传入的参数类型可以是字符串、数字以及对象
          required:true
         }},
        template:'<div>局部组件{{title}}</div>',
      };

      const a=new Vue({
        el:'#app',
        components:{foo},
        template:'<div><foo></foo></div>'
      })

 

六、prop都是单项数据流,是只读文件不可改写

父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。

只读的写法:

     const foo={
        props:{'title':{
          type:[String, Number,Object],
          required:true
         }},
        template:'<div>局部组件{{title}}<button @click="read()">读取</button></div>',
        methods:{
          read(){
               console.log(this.title)
          }
        }

      };

      const a=new Vue({
        el:'#app',
        components:{foo},
        template:'<div><foo title="this is prop"></foo></div>',

      })

 

Logo

前往低代码交流专区

更多推荐