聊聊vue3中hook特性和mixin

490 阅读1分钟

写在前面

vue3中最为核心的特性就是组合式API,即是将业务逻辑相关的变量,methods都可以写在一起,对于可以抽离的逻辑,vue3中使用了类似于react的hooks,和vue2相比的mixin有较大的区别,下面来看下两者区别

vue3中的hook特性

直接上代码,对于home.vue,对于一段可复用的逻辑组件

<template>
  <div class="home">
    <div>{{ state.a }}</div>
  </div>
</template>

<script lang="ts">
import { defineComponent, reactive } from "vue";
import testHook from "../hooks/useTest";

export default defineComponent({
  name: "HomeView",
  components: {},
  setup() {
    const { m: n } = testHook();
    let state = reactive({
      a: 11,
    });
    state.a = n;

    return {
      state,
    };
  },
});
</script>

该vue组件使用useTest这个hook, 对于useTest.ts

import { onMounted } from "vue";

const testHook = function () {
  onMounted(() => {
    console.log("11");
  });
  const m = 1;
  return {
    m,
  };
};

export default testHook;

可以在该hooks中使用vue的钩子

  • 可以看到,在vue3中通过hook的方式,很好复用了useTest中的逻辑

vue2中的mixin

home.vue

import auth from '../../mixin/auth';
export default {
    name: 'CommentListItem',
    mixins: [treeArrLength, auth],
    data(){
        return {}
    }

mixin/auth.js

    export default {
    computed: {
        ...mapState(['isShareTokenLogin', 'authorityList']),
    }
    methods: {}

vue3中hooks的特点与优势

  • 很清楚是从哪个hooks中引入的,对比vue2中很多mixin时就会不知道是从哪里来的

  • 可以基于解构设置别名,防止命名冲突, vue2中可能会冲突

  • 写的hooks函数可以脱离整个组件存在,可以在hooks中使用onMounted, computed等(当然vue2也能实现这一点)