소품


이 페이지에서는 구성 요소 기본 사항을 읽었다고 가정합니다. 아직 컴포넌트에 대해 잘 모르신다면 먼저 읽어보시길 권합니다.


Directory


Prop 유형


지금까지 우리는 문자열 배열로 나열된 prop만 보았습니다.
props: ['title', 'likes', 'isPublished', 'commentIds', 'author']
그러나 일반적으로 각 prop은 지정된 값 유형을 갖기를 원합니다. 이 시점에서 소품의 각 이름과 유형의 이름과 값을 사용하여 소품을 개체로 나열할 수 있습니다.
props: {
  title: String,
  likes: Number,
  isPublished: Boolean,
  commentIds: Array,
  author: Object,
  callback: Function,
  contactsPromise: Promise // or any other constructor
}

이는 구성 요소에 대한 문서를 제공할 뿐만 아니라 잘못된 유형이 발견되는 경우 문서도 제공합니다. 브라우저의 JavaScript 콘솔에서 사용자에게 메시지를 표시합니다. 이 페이지의 나머지 부분에서는
유형 검사 및 기타 소품 유효성 검사

를 볼 수 있습니다.

정적 또는 동적 Prop 전달


이와 같이, 여러분은 다음과 같이 정적 값을 prop에 전달할 수 있다는 것을 이미 알고 있습니다:

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

prop는 v-bind<를 통해 전달될 수 있다는 것도 알고 있습니다. /code > 동적 할당, 예: 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。


传入一个数字

<!-- 即便 `42` 是静态的,我们仍然需要 `v-bind` 来告诉 Vue -->
<!-- 这是一个 JavaScript 表达式而不是一个字符串。-->
<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 传入,你可以使用不带参数的 v-bind (取代 v-bind:prop-name)。例如,对于一个给定的对象 post

post: {
  id: 1,
  title: 'My Journey with Vue'
}

위의 두 예에서 우리가 전달한 값은 문자열 유형이지만 실제로는 모든 유형의 값이 prop에 전달될 수 있습니다.

숫자 전달

<blog-post v-bind="post"></blog-post>

부울 값을 전달하세요


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

배열로 전달

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

객체로 전달

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

객체의 모든 속성을 전달하세요

객체의 모든 속성을 소품으로 전달하려면 다음을 수행하세요. 매개변수 없이 v-bind를 사용하세요(v-bind:prop-name 대체). 예를 들어, 주어진 개체 post에 대해:
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
      }
    }
  }
})

다음 템플릿:

function Person (firstName, lastName) {
  this.firstName = firstName
  this.lastName = lastName
}

은 다음과 동일합니다: 🎜
Vue.component('blog-post', {
  props: {
    author: Person
  }
})
🎜🎜🎜🎜🎜🎜단방향 데이터 흐름🎜🎜🎜🎜🎜All Each prop은 부모와 자식 prop 사이에 🎜단방향 하향 바인딩🎜을 형성합니다. 부모 prop에 대한 업데이트는 자식 구성 요소로 아래쪽으로 흐르지만 그 반대는 아닙니다. 이렇게 하면 하위 구성 요소가 실수로 상위 구성 요소의 상태를 변경하여 애플리케이션의 데이터 흐름을 이해하기 어려워지는 것을 방지할 수 있습니다. 🎜🎜또한 상위 구성 요소가 업데이트될 때마다 하위 구성 요소의 모든 소품이 최신 값으로 새로 고쳐집니다. 즉, 하위 구성 요소 내부의 소품을 변경하면 🎜안 됩니다 🎜. 이렇게 하면 Vue는 브라우저 콘솔에 경고를 표시합니다. 🎜🎜prop를 변경하려고 할 때 두 가지 일반적인 상황이 있습니다: 🎜🎜 1. 🎜이 prop은 초기 값을 전달하는 데 사용되며 하위 구성 요소는 이를 로컬 prop 데이터로 사용하려고 합니다. 🎜이 경우 로컬 데이터 속성을 정의하고 이 prop을 초기 값으로 사용하는 것이 좋습니다: 🎜
<bootstrap-date-input data-date-picker="activated"></bootstrap-date-input>
🎜 2. 🎜이 prop은 기본 값으로 전달되므로 변환해야 합니다. 🎜이 경우 계산된 속성을 정의하기 위해 이 prop의 값을 사용하는 것이 더 좋습니다. 🎜
<input type="date" class="form-control">
🎜🎜JavaScript에서 객체와 배열은 참조로 전달되므로 배열이나 객체 유형의 prop의 경우 하위 구성 요소의 개체 또는 배열 자체는 상위 구성 요소의 상태에 영향을 미칩니다. 🎜🎜🎜🎜🎜

Prop Validation


우리는 당신이 알고 있는 유형과 같은 구성 요소 prop에 대한 유효성 검사 요구 사항을 지정할 수 있습니다. 요구 사항이 충족되지 않으면 Vue는 브라우저 콘솔에서 경고합니다. 이는 다른 사람이 사용할 구성 요소를 개발할 때 특히 유용합니다.

props의 유효성을 검사하는 방법을 사용자 정의하려면 문자열 배열 대신 props의 값에 대한 유효성 검사 요구 사항을 객체에 제공할 수 있습니다. 예: props 中的值提供一个带有验证需求的对象,而不是一个字符串数组。例如:

<bootstrap-date-input
  data-date-picker="activated"
  class="date-picker-theme-dark"
></bootstrap-date-input>

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

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

类型检查

type 可以是下列原生构造函数中的一个:

  • String

  • Number

  • Boolean

  • Array

  • Object

  • Date

  • Function

  • Symbol

额外的,type 还可以是一个自定义的构造函数,并且通过 instanceof 来进行检查确认。例如,给定下列现成的构造函数:

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

你可以使用:

{
  required: true,
  placeholder: 'Enter your username'
}

来验证 author prop 的值是否是通过 new Person 创建的。


非 Prop 的特性


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

因为显式定义的 prop 适用于向一个子组件传入信息,然而组件库的作者并不总能预见组件会被用于怎样的场景。这也是为什么组件可以接受任意的特性,而这些特性会被添加到这个组件的根元素上。

例如,想象一下你通过一个 Bootstrap 插件使用了一个第三方的 <bootstrap-date-input> 组件,这个插件需要在其 <input> 上用到一个 data-date-picker 特性。我们可以将这个特性添加到你的组件实例上:

Vue.component('base-input', {
  inheritAttrs: false,
  props: ['label', 'value'],
  template: `
    <label>
      {{ label }}
      <input
        v-bind="$attrs"
        v-bind:value="value"
        v-on:input="$emit('input', $event.target.value)"
      >
    </label>
  `
})

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


替换/合并已有的特性

想象一下 <bootstrap-date-input>

<base-input
  v-model="username"
  required
  placeholder="Enter your username"
></base-input>

prop 검증이 실패하면 Vue(개발 환경 빌드 버전)는 콘솔 경고를 생성합니다. 🎜
🎜구성 요소 인스턴스가 생성되기 전에 🎜 해당 prop이 확인되므로 인스턴스의 속성(예: data, computed 등)이 확인됩니다. )이 기본값이거나 유효성 검사기 기능을 사용할 수 없습니다. 🎜
🎜🎜

🎜Type check🎜🎜🎜🎜type은 다음과 같은 네이티브일 수 있습니다. 구성 함수 중 하나: 🎜

  • 🎜String🎜
  • 🎜Number 🎜
  • 🎜부울🎜
  • 🎜배열🎜
  • 🎜객체🎜
  • 🎜날짜🎜
  • 🎜함수🎜
  • 🎜기호< / code>🎜
🎜 게다가 type도 사용자 정의 생성자가 될 수 있으며 instanceof를 통해 확인할 수 있습니다. 예를 들어 다음과 같은 미리 만들어진 생성자가 있는 경우: 🎜rrreee🎜 🎜rrreee🎜를 사용하여 author prop의 값이 new Person을 통해 생성되었는지 확인할 수 있습니다. 🎜🎜
🎜

🎜🎜Non-Prop 특성🎜🎜🎜🎜🎜비prop 특성은 컴포넌트에 전달되지만 컴포넌트에는 속성이 없음을 의미합니다. 해당 소품 정의 특성. 🎜🎜명시적으로 정의된 props는 하위 구성 요소에 정보를 전달하는 데 적합하기 때문에 구성 요소 라이브러리 작성자는 해당 구성 요소가 어떤 시나리오에 사용될지 항상 예측할 수는 없습니다. 이것이 바로 구성 요소가 임의의 속성을 허용할 수 있는 이유이며 이러한 속성은 구성 요소의 루트 요소에 추가됩니다. 🎜🎜예를 들어, Bootstrap 플러그인을 통해 타사 <bootstrap-date-input> 구성 요소를 사용한다고 가정해 보겠습니다. 이 플러그인은 <에 포함되어야 합니다. ;input> data-date-picker 기능이 사용됩니다. 이 속성을 구성 요소 인스턴스에 추가할 수 있습니다. 🎜rrreee🎜 그러면 이 data-date-picker="activated" 속성이 <bootstrap-date-input> ;를 루트 요소에 추가합니다. 🎜🎜
🎜

🎜기존 기능 교체/병합🎜🎜🎜🎜Imagine<bootstrap 템플릿 -날짜 입력>은 다음과 같습니다: 🎜rrreee

날짜 선택기 플러그인의 테마를 사용자 정의하려면 다음과 같은 특수 클래스 이름을 추가해야 할 수도 있습니다:

rrreee

이 경우 두 개의 서로 다른 class 값을 정의합니다: class 的值:

  • form-control,这是在组件的模板内设置好的

  • date-picker-theme-dark,这是从组件的父级传入的

对于绝大多数特性来说,从外部提供给组件的值会替换掉组件内部设置好的值。所以如果传入 type="text" 就会替换掉 type="date" 并把它破坏!庆幸的是,classstyle 特性会稍微智能一些,即两边的值会被合并起来,从而得到最终的值:form-control date-picker-theme-dark


禁用特性继承

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

rrreee

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

rrreee

有了 inheritAttrs: false$attrs,你就可以手动决定这些特性会被赋予哪个元素。在撰写基础组件的时候是常会用到的:

rrreee

注意: inheritAttrs: false 选项不会影响 style 和 class

  • form-control, 이는 구성 요소의 템플릿
< li>

date-picker에 설정됩니다. -theme-dark, 이는 구성 요소의 상위 항목에서 전달됩니다

대부분의 기능의 경우 외부에서 제공됩니다. 구성 요소의 값은 내부적으로 설정된 값을 대체합니다. 구성 요소. 따라서 type="text"를 전달하면 type="date"가 바뀌고 삭제됩니다! 다행히 classstyle 속성이 조금 더 스마트해졌습니다. 즉, 양쪽 값을 결합하여 최종 값을 얻습니다: form-control date- 선택기-테마-어두움.

🎜🎜

기능 상속이 비활성화되었습니다🎜🎜 구성 요소의 루트 요소가 속성을 상속하지 않도록하려면 구성 요소 옵션에서 inheritAttrs: false를 설정하면 됩니다. 예: 🎜rrreee🎜이는 구성 요소에 전달된 속성 이름과 속성 값을 포함하는 인스턴스의 $attrs 속성과 함께 사용하기에 특히 적합합니다. 예: 🎜rrreee🎜With inheritAttrs : false $attrs, 이러한 속성이 할당될 요소를 수동으로 결정할 수 있습니다. 글쓰기기본 구성 요소가 자주 사용됩니다. 🎜rrreee

🎜참고: inheritAttrs: false 옵션은 styleclass의 바인딩에 영향을 미치지 않습니다. 🎜🎜🎜이 모드를 사용하면 어떤 요소가 실제 루트 요소인지 걱정하지 않고 원시 HTML 요소와 더 유사한 기본 구성 요소를 사용할 수 있습니다. 🎜rrreee🎜🎜🎜