美文网首页
Vue组件基础

Vue组件基础

作者: MajorDong | 来源:发表于2020-01-08 17:17 被阅读0次

Vue组件基础

每用一次组件,就会有一个它的新实例被创建

data必须是一个函数

一个组件的data选项必须是一个函数,因此每个函数可以维护一份被返回对象的独立拷贝。

避免一个实例,影响到其他所有实例。

动态传递prop

<blog-post
  v-for="post in posts"
  v-bind:key="post.id"
  v-bind:title="post.title"
></blog-post>

可以使用v-bind来动态传递prop。一开始不清楚要渲染的具体内容,比如从一个api获取博文列表的时候,是非常有用的。

单个根元素

每个组件必须只有一个根元素

当组件变得越来越复杂的时候,为每个相关信息定义一个prop会变得很麻烦。

所以让它变成一个单独的post prop

<blog-post
  v-for="post in posts"
  v-bind:key="post.id"
  v-bind:post="post"
></blog-post>
<script>
Vue.component('blog-post', {
  props: ['post'],
  template: `
    <div class="blog-post">
      <h3>{{ post.title }}</h3>
      <div v-html="post.content"></div>
    </div>
  `
})
</script>

在组件上使用v-model

自定义事件也可以用于创建v-model的自定义组件

v-mdoel实际上为语法糖

<input v-model="searchText">
//等价于
<input
  v-bind:value="searchText"
  v-on:input="searchText = $event.target.value"
>

当用在组件上时,v-model则会这样

<custom-input
  v-bind:value="searchText"
  v-on:input="searchText = $event"
></custom-input>

为了让它正常工作,这个组件内的<input>

  • 将其value特性绑定到一个名叫value的prop上
  • 在其input事件被触发时,将新的值通过自定义的input事件抛出
Vue.component('custom-input', {
  props: ['value'],
  template: `
    <input
      v-bind:value="value"
      v-on:input="$emit('input', $event.target.value)"
    >
  `
})
//重写input事件传出的值,因为v-model在自定义组件和在<input>上不一致

通过插槽分发内容

在需要的地方加入插槽

动态组件

<!-- 组件会在 `currentTabComponent` 改变时改变 -->
<component v-bind:is="currentTabComponent"></component>

动态和异步组件

解析DOM模版时的注意事项

有些 HTML 元素,诸如<ul>,<ol>,<table><select>,对于哪些元素可以出现在其内部是有严格限制的。而有些元素,诸如 <li>,<tr>,<option>,只能出现在其它某些特定的元素内部

使用这些有约束条件的元素时会遇到一些问题

<table>
  <blog-post-row></blog-post-row>
</table>

这个自定义组件<blog-post-row> 会被作为无效的内容提升到外部,并导致最终渲染结果出错。幸好这个特殊的 is 特性给了我们一个变通的办法:

<table>
  <tr is="blog-post-row"></tr>
</table>

需要注意的是以下来源使用模版的话,这条限制是不存在的

相关文章

网友评论

      本文标题:Vue组件基础

      本文链接:https://www.haomeiwen.com/subject/xpmsactx.html