复习vue(8)组件化和全局组件

172 阅读2分钟

「这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战」。

组件化和全局组件

组件: 把页面中重复的功能抽离出来封装成一个单独的组件,在任何需要的地方使用该组件即可;提高代码的可复用程度和可维护性;

每个组件都是一个 vue 的实例,那么这个组件也有自己的生命周期,并且也有 data, computed,methods,watch等 这些属性,每个组件都有自己的私有的数据;还可以接收来自上层组件传入的数据;

  • 注册全局组件
    • vue.component(componentName,config)
    • componentName 可以使用驼峰,也可以使用 component-name
    • 但是 HTML 中引用只能写 component-name
    • vue.component 是全局注册组件,可以在各个 vue 实例中直接使用
  • 使用组件
    • 在组件的模板(template)或者(HTML)中使用 <组件名></组件名>
代码示例:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>

<body>
  <div id="app">
    <handsome-man></handsome-man>
  </div>
  <div id="app2">
    <handsome-man></handsome-man>
  </div>

  <script src="vue.js"></script>
  <script>
    // 组件:把页面中重复的的功能抽离出来封装成一个单独的组件,在任何需要的地方使用该组件即可;

    // 每个组件都是一个 Vue 的实例,那么这个组件也有自己的生命周期,并且也有data、computed、methods、watch这些属性,每个组件都有自己私有的数据;还可以接受来自上层组件传入的数据;

    // 注册一个组件:
    // 全局组件 Vue.component(componentName, config)

    // 1. componentName 可以使用驼峰,也可以使用 component-name
    // 2. 但是在HTML中引用时只能写 -
    // 3. Vue.component 是全局注册组件,在其他各个 Vue 实例中可以直接使用

    Vue.component('handsomeMan', {
      data() {
        // 注册组件时 data 属性需要用一个函数返回一个对象
        return {
          msg: '来学习了?'
        }
      },
      template: `<div>{{msg}}</div>`
    });

    let vm1 = new Vue({
      el: '#app',
      data: {}
    });

    let vm2 = new Vue({
      el: '#app2',
      data: {}
    });

  </script>
</body>

</html>

局部组件

  • 局部组件是只能在当前 vue 实例中使用的组件需要在当前组件的 components 属性进行注册;
  • 使用局部组件的步骤
    • 创建组件
    • 注册组件
    • 使用组件
代码示例:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>

<body>

  <div id="app">
    <xiaofei></xiaofei>
    <dafei></dafei>
  </div>

  <script src="vue.js"></script>

  <script type="module">
    // 局部组件使用三部曲
    // 1. 创建组件
    // 2. 注册组件
    // 3. 使用组件

    // import xiaofei from './xiaofei.js';

    // import dafei from './dafei.js';

    let dafei = {
      data() {
        return {
          name: 'dafei',
          content: [
            'sing',
            'dance',
            'rap',
            'basketball'
          ]
        }
      },
      methods: {
        fn() {
          this.name = "大飞";
          this.content = ["唱", "跳", "说唱", "篮球"];
        }
      },
      template: `<div  @click='fn'>{{name + "特长"}}: <span v-for="(item, index) in content" :key="index">{{item}};</span></div>`
    };

    let xiaofei = {
      // 每一个组件都是一个 Vue 的实例,那么每个组件都有自己的生命周期、computed...
      data() {
        return {
          name: 'xiaofei',
          arr: []
        }
      },
      methods: {
        fn() {
          this.name = '小飞';
        }
      },
      template: "<div @click='fn'>{{name}}</div>"
    };

    let vm = new Vue({
      el: '#app',
      data() {
        return {
          x: 1,
          y: 2
        }
      },

      components: {
        // 注册局部组件,像 xiaofei, dafei 这种被注册的称为子组件,而组件的注册时在的实例称为父组件
        xiaofei,
        dafei
      }
    })
  </script>
</body>

</html>