基本示例
1 | <div id="box"> |
data
必须是一个函数
当我们定义组件时,你可能会发现它的 data
并不是像这样直接提供一个对象:
1 | data: { |
取而代之的是,一个组件的 data
选项必须是一个函数,因此每个实例可以维护一份被返回对象的独立的拷贝:
1 | data: function () { |
通过 Prop 向子组件传递数据
基本示例:
1 | <div id="#blog-post-demo"> |
然而在一个典型的应用中,你可能在 data
里有一个博文的数组:
1 | new Vue({ |
并想要为每篇博文渲染一个组件就可以这么做:
1 | <blog-post |
监听子组件事件
示例:
1 | <div id="#blog-posts-events-demo"> |
使用事件抛出一个值
有的时候用一个事件来抛出一个特定的值是非常有用的。例如我们可能想让 <blog-post>
组件决定它的文本要放大多少。这时可以使用 $emit
的第二个参数来提供这个值:
1 | <button v-on:click="$emit('enlarge-text', 0.1)">Enlarge text</button> |
然后当在父级组件监听这个事件的时候,我们可以通过 $event
访问到被抛出的这个值:
1 | <blog-post ... v-on:enlarge-text="postFontSize += $event"></blog-post> |
或者,如果这个事件处理函数是一个方法:
1 | <blog-post ... v-on:enlarge-text="onEnlargeText"></blog-post> |
那么这个值将会作为第一个参数传入这个方法:
1 | methods: { |
在组件上使用 v-model
自定义事件也可以用于创建支持 v-model
的自定义输入组件。记住:
1 | <input v-model="searchText" /> |
等价于:
1 | <input |
当用在组件上时,v-model
则会这样:
1 | <custom-input |
为了让它正常工作,这个组件内的 <input>
必须:
- 将其
value
特性绑定到一个名叫value
的 prop 上 - 在其
input
事件被触发时,将新的值通过自定义的input
事件抛出
写成代码之后是这样的:
1 | Vue.component("custom-input", { |
现在 v-model
就应该可以在这个组件上完美地工作起来了:
1 | <custom-input v-model="searchText"></custom-input> |
通过插槽分发内容
和 HTML 元素一样,我们经常需要向一个组件传递内容,像这样:
1 | <alert-box> Something bad happened. </alert-box> |
使用 Vue 自定义的 slot
元素让这变得非常简单:
1 | Vue.component("alert-box", { |
动态组件
有的时候,在不同组件之间进行动态切换是非常有用的,比如在一个多标签的界面里。
通过 Vue 的<component
元素加一个特殊的 is
特性来实现:
1 | <!-- 组件会在 `currentTabComponent` 改变时改变 --> |
在上述示例中,currentTabComponent
可以包括
- 已注册组件的名字,或
- 一个组件的选项对象
注意事项
上述的这个和一些接下来的示例使用了 JavaScript 的模板字符串来让多行的模板更易读。它们在 IE 下并没有被支持,所以如果你需要在不 (经过 Babel 或 TypeScript 之类的工具) 编译的情况下支持 IE,请使用折行转义字符取而代之。
解析 DOM 模板时的注意事项
有些 HTML 元素,诸如
<ul>
、<ol>
、<table>
和<select>
,对于哪些元素可以出现在其内部是有严格限制的。而有些元素,诸如<li>
、<tr>
和<option>
,只能出现在其它某些特定的元素内部。这会导致我们使用这些有约束条件的元素时遇到一些问题。例如:
1
2
3<table>
<blog-post-row></blog-post-row>
</table>这个自定义组件
<blog-post-row>
会被作为无效的内容提升到外部,并导致最终渲染结果出错。幸好这个特殊的is
特性给了我们一个变通的办法:1
2
3<table>
<tr is="blog-post-row"></tr>
</table>需要注意的是如果我们从以下来源使用模板的话,这条限制是*不存在*的:
- 字符串 (例如:
template: '...'
) - 单文件组件 (
.vue
) <script type="text/x-template"></script>
- 字符串 (例如: