单个根元素

当构建一个 <blog-post> 组件时,你的模板最终会包含的东西远不止一个标题:

  1. <h3>{{ title }}</h3>

最最起码,你会包含这篇博文的正文:

  1. <h3>{{ title }}</h3>
  2. <div v-html="content"></div>

然而如果你在模板中尝试这样写,Vue 会显示一个错误,并解释道 every component must have a single root element (每个组件必须只有一个根元素)。你可以将模板的内容包裹在一个父元素内,来修复这个问题,例如:

  1. <div class="blog-post">
  2. <h3>{{ title }}</h3>
  3. <div v-html="content"></div>
  4. </div>

看起来当组件变得越来越复杂的时候,我们的博文不只需要标题和内容,还需要发布日期、评论等等。为每个相关的信息定义一个 prop 会变得很麻烦:

  1. <blog-post
  2. v-for="post in posts"
  3. v-bind:key="post.id"
  4. v-bind:title="post.title"
  5. v-bind:content="post.content"
  6. v-bind:publishedAt="post.publishedAt"
  7. v-bind:comments="post.comments"
  8. ></blog-post>

所以是时候重构一下这个 <blog-post> 组件了,让它变成接受一个单独的 post prop:

  1. <blog-post
  2. v-for="post in posts"
  3. v-bind:key="post.id"
  4. v-bind:post="post"
  5. ></blog-post>
  1. Vue.component('blog-post', {
  2. props: ['post'],
  3. template: `
  4. <div class="blog-post">
  5. <h3>{{ post.title }}</h3>
  6. <div v-html="post.content"></div>
  7. </div>
  8. `
  9. })

上述的这个和一些接下来的示例使用了 JavaScript 的模板字符串来让多行的模板更易读。它们在 IE 下并没有被支持,所以如果你需要在不 (经过 Babel 或 TypeScript 之类的工具) 编译的情况下支持 IE,请使用折行转义字符取而代之。

现在,不论何时为 post 对象添加一个新的属性,它都会自动地在 <blog-post> 内可用。