Nested components 组件之间的嵌套

嵌套方式

1. Gloablely

一次注册, 全局使用的 component

a. 在 src 文件夹下创建一个 Test.vue 文件:

<template>
    <ul>
      <li v-for="name in names">{{ name }}</li>
    </ul>
</template>

<script>
export default {
  data () {
    return {
      names: ['Rachel', 'Ross', 'Emma']
    }
  }
}
</script>

<style>

</style>

b. 在 main.js 文件中, 全局注册 Test component, 添加如下:

import Test from './Test.vue'

Vue.component('test', Test);

c. 在 App.vue 文件中, 为 Test component 占位:

<template>
  <div>
    <p>{{ title }}</p>
    <!-- 放置 Test component 的位置, 必须在总的 div 里 -->
    <test></test>
  </div>
</template>

2. Locally

只在所添加的文件中有效.

a. 删除上一步在 main.js 文件中添加的内容.

b. 在 App.vue 中, 占位的位置不变, 另外添加如下内容:

<script>
// 引入文件
import Test from './Test.vue'

export default {
  components: {
    'test': Test,
  },

  data () {
    return {
      title: "My first Vue page"
    }
  }
}
</script>

Component CSS (scoped)

如果要想让 style 样式只对自身的 component 生效, 只要在 style 标签上 添加 scoped:

<style scoped>
    h1 {
      color: green
    }
</style>

Props

把每个页面需要用到的数据都写在 app.vue 组件中, 然后以 props 的形式传递给各个组件(各个页面). 这样做的好处就是, 如果有 10 个页面共用一些数据, 就可以实现, 一处修改, 全部更新的效果, 而不需要改 10 个页面.

通过下面的例子, 展示具体实现的方式:
首先, 把原本要用于 Article.vue 页面的 data 数据都挪到 app.vue 文件中.
app.vue 文件:

<template>
  <div>
    <!-- 对应 article.vue 组件 -->
    <!-- 通过数据绑定的方式, 把数据传递给 article.vue 组件 -->
    <my-article v-bind:family="family"></my-article>
  </div>
</template>

<script>
// 引入 article.vue 组件文件
import Article from './components/article.vue';

export default {
  components: { // 注册组件
    'my-article': Article,
  },

  data () {
    return {
    // 要用于 Article.vue 页面的数据
      family: [
        {name: 'Rachel', hobby: 'skating', show: false},
        {name: 'Ross', hobby: 'codding', show: false},
        {name: 'Emma', hobby: 'watch cartoon', show: false},
      ]
    }
  }
}
</script>

Article.vue 文件:

<template>
  <div>
    <b-list-group>
      <b-list-group-item v-for="people in family" v-on:click="people.show = !people.show">
        <h2>name: {{ people.name }}</h2>
        <h3 v-show="people.show">hobby: {{ people.hobby }}</h3>
      </b-list-group-item>
    </b-list-group>
  </div>
</template>

<script>
  export default {
    // 通过 props 接收来自 parent component 的数据
    props: {
      family: { // 数据名称
        type: Array, // 验证数据类型, 必须为数据, 否则报错
        required: true // 验证必须传递这个数据, 否则报错
      }
    },

    data () {
      return { // 原本这里的数据, 已被挪到 parent component 中

      }
    }
  }
</script>

上面两个文件中, 关于数据传递的关系示意图:

# Nested components 组件之间的嵌套

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer 于 5年前 加精
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!