Evan's blog Evan's blog
首页
关于
  • 分类
  • 标签
  • 归档
  • H5&CSS3
  • JS
  • TS
  • Node
  • Webpack
  • Vue2
  • Vue3
  • 微信小程序
  • Andorid
  • Flutter
推荐
GitHub (opens new window)

conanan

真相只有一个
首页
关于
  • 分类
  • 标签
  • 归档
  • H5&CSS3
  • JS
  • TS
  • Node
  • Webpack
  • Vue2
  • Vue3
  • 微信小程序
  • Andorid
  • Flutter
推荐
GitHub (opens new window)
  • 基础

  • 组件

  • 动画

  • Composition Api

    • 旧解决方案
      • Mixin
        • 介绍
        • 使用
        • Mixin的合并规则
        • 全局混入Mixin
      • extends—使用更少
      • 总结
    • 响应式Api
    • 计算属性&侦听器
    • 其他
  • 高级语法

  • Vue源码

  • VueCLI&Vite

  • VueRouter

  • Vuex

  • 项目

  • Vue3.x
  • Composition Api
xugaoyi
2022-02-03
目录

旧解决方案

# 旧解决方案

# Mixin

# 介绍

目前我们是使用组件化的方式在开发整个Vue的应用程序,但是组件和组件之间有时候会存在相同的代码逻辑,我们希望对相同的代码逻辑进行抽取。

在Vue2和Vue3中都支持的一种方式就是使用Mixin来完成:

  • Mixin提供了一种非常灵活的方式,来分发Vue组件中的可复用功能;
  • 一个Mixin对象可以包含任何组件 Options 选项;
  • 当组件使用Mixin对象时,所有Mixin对象的选项将被混合进入该组件本身的选项中;

# 使用

demoMixin.js

export const demoMixin = {
  data() {
    return {
      message: "Hello DemoMixin"
    }
  },
  methods: {
    foo() {
      console.log("demo mixin foo");
    }
  },
  created() {
    console.log("执行了demo mixin created");
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

01_mixin基本使用.vue

<template>
  <div>
    <h2>{{message}}</h2>
    <button @click="foo">按钮</button>
  </div>
</template>

<script>
  import { demoMixin } from './mixins/demoMixin';

  export default {
    mixins: [demoMixin],
    data() {
      return {
        title: "Hello World"
      }
    },
    methods: {

    }
  }
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# Mixin的合并规则

**如果Mixin对象中的选项和组件对象中的选项发生了冲突,那么Vue会如何操作呢?**这里分成不同的情况来进行处理:

  • 如果是data函数的返回值对象
    • 返回值对象默认情况下会进行合并;
    • 如果data返回值对象的属性发生了冲突,那么会保留组件自身的数据
  • 如果是生命周期钩子函数
    • 生命周期的钩子函数会被合并到数组中,都会被调用
  • 值为对象的选项,例如 methods、components 和 directives,将被合并为同一个对象
    • 比如都有methods选项,并且都定义了方法,那么它们都会生效
    • 但是如果对象的key相同,那么会取组件对象的键值对

# 全局混入Mixin

如果组件中的某些选项,是所有的组件都需要拥有的,那么这个时候我们可以使用全局的mixin

  • 全局的Mixin可以使用应用app的方法 mixin 来完成注册
  • 一旦注册,那么全局混入的选项将会影响每一个组件

# extends—使用更少

允许声明扩展另外一个组件,类似于Mixins。只能 extends Options Api 的东西!!!

BasePage.vue

<template>
  <div>
    <h2>哈哈哈哈啊</h2>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        title: "Hello Page"
      }
    },
    methods: {
      bar() {
        console.log("base page bar");
      }
    }
  }
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

Home.vue

<template>
  <div>
    Home Page
    <h2>{{title}}</h2>
    <button @click="bar">按钮</button>
  </div>
</template>

<script>
  import BasePage from './BasePage.vue';

  export default {
    extends: [BasePage],
    data() {
      return {
        content: "Hello Home"
      }
    }
  }
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 总结

在开发中extends用的非常少,在Vue2中比较推荐大家使用Mixin,而在Vue3中推荐使用Composition API

编辑 (opens new window)
上次更新: 2022/03/23, 17:55:39
Vue 动画
响应式Api

← Vue 动画 响应式Api→

最近更新
01
重点
04-12
02
搭建项目
04-04
03
TS补充
03-30
更多文章>
Theme by Vdoing | Copyright © 2019-2022 conanan | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式