소품
이 페이지에서는 구성 요소 기본 사항을 읽었다고 가정합니다. 아직 컴포넌트에 대해 잘 모르신다면 먼저 읽어보시길 권합니다.
Directory
기능 상속 비활성화 HTML의 프로페티 이름은 CASE의 프 로프 케이스 (Camelcase vs Kebab-Case) html의 경우 둔감하기 때문에 프로세서를 찾아 보면 모든 대문자가 소문자로 해석됩니다. 즉, DOM에서 템플릿을 사용할 때 camelCase prop 이름은 동등한 케밥 케이스 이름을 사용해야 합니다.
Vue.component('blog-post', { // 在 JavaScript 中是 camelCase 的 props: ['postTitle'], template: '<h3>{{ postTitle }}</h3>' })
<!-- 在 HTML 中是 kebab-case 的 --> <blog-post post-title="hello!"></blog-post>
다시 말하지만, 문자열 템플릿을 사용하면 이 제한이 존재하지 않습니다.
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 会在一个组件实例创建之前进行验证,所以实例的属性 (如
data
、computed
等) 在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🎜🎜🎜🎜 🎜기존 기능 교체/병합🎜🎜🎜🎜Imagine 날짜 선택기 플러그인의 테마를 사용자 정의하려면 다음과 같은 특수 클래스 이름을 추가해야 할 수도 있습니다: 이 경우 두 개의 서로 다른 对于绝大多数特性来说,从外部提供给组件的值会替换掉组件内部设置好的值。所以如果传入 禁用特性继承 如果你不希望组件的根元素继承特性,你可以在组件的选项中设置 这尤其适合配合实例的 有了 注意: 대부분의 기능의 경우 외부에서 제공됩니다. 구성 요소의 값은 내부적으로 설정된 값을 대체합니다. 구성 요소. 따라서 기능 상속이 비활성화되었습니다🎜🎜 구성 요소의 루트 요소가 속성을 상속하지 않도록하려면 구성 요소 옵션에서 type
은 다음과 같은 네이티브일 수 있습니다. 구성 함수 중 하나: 🎜
🎜 게다가 String
🎜Number
🎜부울
🎜배열
🎜객체 code >🎜
날짜
🎜함수
🎜기호< / 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> ;에 자동으로 추가됩니다. code>를 루트 요소에 추가합니다. 🎜🎜
🎜<bootstrap 템플릿 -날짜 입력>
은 다음과 같습니다: 🎜rrreeeclass
값을 정의합니다: class
的值:form-control
,这是在组件的模板内设置好的date-picker-theme-dark
,这是从组件的父级传入的type="text"
就会替换掉 type="date"
并把它破坏!庆幸的是,class
和 style
特性会稍微智能一些,即两边的值会被合并起来,从而得到最终的值:form-control date-picker-theme-dark
。inheritAttrs: false
。例如:$attrs
属性使用,该属性包含了传递给一个组件的特性名和特性值,例如:inheritAttrs: false
和 $attrs
,你就可以手动决定这些特性会被赋予哪个元素。在撰写基础组件的时候是常会用到的:inheritAttrs: false
选项不会影响 style
和 class
form-control
, 이는 구성 요소의 템플릿< li>date-picker에 설정됩니다. -theme-dark
, 이는 구성 요소의 상위 항목에서 전달됩니다type="text"
를 전달하면 type="date"
가 바뀌고 삭제됩니다! 다행히 class
및 style
속성이 조금 더 스마트해졌습니다. 즉, 양쪽 값을 결합하여 최종 값을 얻습니다: form-control date- 선택기-테마-어두움
. inheritAttrs: false
를 설정하면 됩니다. 예: 🎜rrreee🎜이는 구성 요소에 전달된 속성 이름과 속성 값을 포함하는 인스턴스의 $attrs
속성과 함께 사용하기에 특히 적합합니다. 예: 🎜rrreee🎜With inheritAttrs : false
및 $attrs
, 이러한 속성이 할당될 요소를 수동으로 결정할 수 있습니다. 글쓰기기본 구성 요소가 자주 사용됩니다. 🎜rrreee 🎜참고:
inheritAttrs: false
옵션은 style
및 class
의 바인딩에 영향을 미치지 않습니다. 🎜🎜🎜이 모드를 사용하면 어떤 요소가 실제 루트 요소인지 걱정하지 않고 원시 HTML 요소와 더 유사한 기본 구성 요소를 사용할 수 있습니다. 🎜rrreee🎜🎜🎜