vue的props属性

  • Post author:
  • Post category:vue




vue的props


类型:Array | Object

详细:

props 可以是数组或对象,用于接收来自父组件的数据。 props

可以是简单的数组,或者使用对象作为替代,对象允许配置高级选项,如类型检测、自定义验证和设置默认值。

基于对象的语法使用以下选项:

type:可以是下列原生构造函数中的一种:String、Number、Boolean、Array、Object、Date、Function、Symbol、任何自定义构造函数、或上述内容组成的数组。会检查一个

prop 是否是给定的类型,否则抛出警告。Prop 类型的更多信息在此。 default:any 为该 prop 指定一个默认值。如果该

prop 没有被传入,则换做用这个值。对象或数组的默认值必须从一个工厂函数返回。 required:Boolean 定义该 prop

是否是必填项。在非生产环境中,如果这个值为 truthy 且该 prop 没有被传入的,则一个控制台警告将会被抛出。

validator:Function 自定义验证函数会将该 prop 的值作为唯一的参数代入。在非生产环境下,如果该函数返回一个 falsy

的值 (也就是验证失败),一个控制台警告将会被抛出。你可以在这里查阅更多 prop 验证的相关信息。

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


在深入了解prop之前需要了解清楚组件的概念

https://cn.vuejs.org/v2/guide/components.html#%E7%BB%84%E4%BB%B6%E7%9A%84%E7%BB%84%E7%BB%87



定义prop并说明大小写问题

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

Vue.component('blog-post', {
  // 在 JavaScript 中是 camelCase 的
  props: ['postTitle'],
  template: '<h3>{{ postTitle }}</h3>'
}) // 父子组件里传入和传入内容

<!--HTML 中是 kebab-case--> 
<!--注册组件后 这个地方就是一个<h3></h3>-->
<blog-post post-title="hello!"></blog-post>


传递静态或动态的prop

一个 prop 被注册之后,你就可以像这样把数据作为一个自定义 attribute 传递进来:

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

在这里插入图片描述

<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>

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

<!-- 用一个变量进行动态赋值。-->
<blog-post v-bind:is-published="post.isPublished"></blog-post>
<!-- 即便数组是静态的,我们仍然需要 `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>
<!-- 即便对象是静态的,我们仍然需要 `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>


单向数据流

**所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,**但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。


父组件传到子组件的值有时候可以直接用,有时候不能直接用,需要转换形式。

这个 prop 用来传递一个初始值;这个子组件接下来希望将其作为一个本地的 prop 数据来使用。在这种情况下,最好定义一个本地的 data property 并将这个 prop 用作其初始值:

props: ['initialCounter'],
data: function () {
  return {
    counter: this.initialCounter
  }
}

这个 prop 以一种原始的值传入且需要进行转换。在这种情况下,最好使用这个

prop 的值来定义一个计算属性

props: ['size'],
computed: {
  normalizedSize: function () {
    return this.size.trim().toLowerCase()
  }
}


验证

为了定制 prop 的验证方式,你可以为 props 中的值提供一个带有验证需求的对象

Vue.component(‘my-component’, { props: {


// 基础的类型检查 (

null



undefined

会通过任何类型验证)

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 [‘success’, ‘warning’, ‘danger’].indexOf(value) !== -1

}

} } })

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



学习自vue官网

https://cn.vuejs.org/v2/guide/components-props.html