__301 vue 组件

102 阅读2分钟

1.什么是组件化

针对前端 ui 的一种对应关系,把前端的业务分成多个组件单独管理

2.组件化思想

组件化思想让开发者能开发出1个个独立课复用的小组件来构造应用

每1个应用都可以抽象成1个组件树

尽可能将页面分成小且可复用的组件,可以让代码更方便组织和管理,扩展性也更强

3.组件化好处*

-组件是独立和可复用的代码组织单元,组件系统是 vue 核心特性之一,让开发者使用小型、独立和通常可复用的组件构建大型应用

-组件化开发能大幅度提高应用开发效率、测试性、复用性等

-能让 web 前端代码实现 "高内聚、低耦合",使前端开发过程变成搭积木的过程

4.组件基本使用

-定义组件

const Login = {
  template: ``,
};

// 不常用
const Login = Vue.extend({
  template: ``,
});

-注册组件

// 全局注册
Vue.component("组件名称", 组件的返回值);

// 局部注册
new Vue({
  components: {
    组件名称: 组件的返回值,
  },
});

-渲染组件

// 组件名作为标签直接渲染

// 动态组件  通过 is 属性设置具体渲染那个组件,一般用于组件的切换
<component :is="组件名"></component>

5.组件中的 data 为什么是1个 function

防止多个组件实例共用1个data,产生数据污染。函数形式会开辟新的内存空间,返回全新的data对象

6.动态组件 异步组件

// 动态组件
<component :is="组件名"></component>

// 异步组件
Vue.component('async-example', function (resolve, reject) {
  setTimeout(function () {
    // 向 `resolve` 回调传递组件定义
    resolve({
      template: '<div>I am async!</div>'
    })
  }, 1000)
})

7.组件通信

- 父传子

1.在渲染的子组件上使用 v-bind 的方式传递父组件的数据

2.在子组件中使用 props 接受传递的数据

ps:

props 的对象写法可以约束传递的数据类型,设置默认值

props 是只读的,不能被修改

-子传父

1.在渲染的子组件使用 v-on 监听子组件的自定义事件 调用父组件的函数

2.在子组件中使用 $emit 的方式发送自定义事件,发送的同时可以传递子组件的数据 ‍

- 兄弟组件

__ 事件总线

// 1.创建1个空的 vue 实例
// main.js
Vue.prototype.$EventBar = new Vue()

// 2.在组件 b 中使用 $emit 发送自定义事件,发送同时可以传递数据
methods: {
  sendMsg() {
    $EventBar.$emit("aMsg", '来自A页面的消息');
  }
}

// 3.在组件 a 中使用 $on 的方式监听自定义事件
 mounted() {
    $EventBar.$on("aMsg", (msg) => {
      // A发送来的消息
      console.log(msg);
    });
  }

- 爷孙传值

$attrs、$listeners

- 跨多组件传值

provide、inject

- $refs、$parent、$root

const child = {
  template: `
    <div>
      <slot name="left">
        left
      </slot>  
      <slot name="middle">
        middle
      </slot>
      <slot name="right" :msg="'子组件的数据'">
        right
      </slot>
    </div>
  `,
  data(): {
    return {
      childmsg: '666'
    }
  },
  created(): {
    // 直接获取父组件数据或函数
    console.log(this.$parent.msg)   // hello vue
  }
};
<child ref="childRef"></child>
new Vue({
  el: "#app",
  data: {
    msg: "hello vue",
  },
  components: {
    child,
  },
  mounted: {
    // 通过ref获取子组件数据或函数
    console.log(this.$refs.childRef.childmsg)  // '666' --ref指向组件实例
  }
});