vue3自定义hooks/可组合函数方式

 更新时间:2022年05月31日 08:40:55   作者:醉逍遥neo  
这篇文章主要介绍了vue3自定义hooks/可组合函数方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

自定义hooks/可组合函数

vue3 composition api下mixins的替代方式(自定义hooks / 可组合函数)

传统方式下封装的mixins在引入文件里都是通过this来调用属性或方法,

而在vue3的composition API下this是undefined,实际上这两者就是冲突的,

只能封装一套全新的方式来使用类似mixins的功能。

我们称这种全新的方式为自定义hooks(注:写这篇文章时vue官方还没有这个概念,基本靠自己摸索,参照react的习惯而称之为自定义hooks,现在已经有了官方定义:可组合函数)。

1.mixins方式的痛点

传统的mixins有很多让人诟病的地方,mixins 的深度合并非常隐式,这让代码逻辑更难理解和调试,具体表现为如下几点:

  • mixins 容易冲突:因为每个特性的属性都被合并到同一个组件中,组件内同名的属性或方法会把mixins里的覆盖掉。
  • 可重用性有限:我们不能向 mixins 传递任何参数来改变它的逻辑,这降低了它们在抽象逻辑方面的灵活性。
  • 数据来源不清晰:组件里所使用的mixins里的数据或方法在当前组件代码里搜索不到,易造成错误的解读,比如被当成错误代码或冗余代码而误删。

2.传统mixins方式示例

myMixins.ts:

export default {
  data () {
    return {
      aa: 1
    }
  },
  mounted () {
    this.testFn()
  },
  methods: {
    testFn () {
      console.log('testFn')
    }
  }
}

index.vue:

<template>
  <div>{{ aa }}</div>
</template>
<script lang="ts">
import { defineComponent, onMounted } from 'vue'
import myMixins from './myMixins'
export default defineComponent({
  mixins: [myMixins],
  mounted () {
    console.log('index mounted')
  }
})
</script>

如上所示,封装的myMixins实际上只做了两件事,一是在mounted钩子函数里执行testFn方法,二是暴露一个aa的变量给外部使用;index.vue里引入后在dom里使用了aa。

这算是mixins最典型的两个用途,一是自己执行一些公共逻辑,外部引入时不用管,二是定义一些data变量给外部引入后使用。

3.自定义hooks方式示例

1、代码封装

先上代码,myHooks.ts:

import { ref, onMounted } from 'vue'
export default function () {
  const aa = ref(1)
  function testFn () {
    console.log('testFn')
  }
  onMounted(() => {
    testFn()
  })
  return {
    aa
  }
}

index.vue:

<template>
  <div>{{ aa }}</div>
</template>
<script lang="ts">
import { defineComponent, onMounted } from 'vue'
import myHooks from './myHooks'
export default defineComponent({
  setup () {
    const { aa } = myHooks()
    onMounted(() => {
      console.log('index mounted')
    })
    return {
      aa
    }
  }
})
</script>

可以看到,这里没有再使用mixins属性来引入逻辑代码,本质上只是封装了一个ts文件引入使用而已,这样使用后,数据来源清晰可见,代码引用有依有据。

2、为什么导出的是function

因为导出为对象的话就意味着在import导入时就执行了封装的逻辑,而我们封装的逻辑是用composition api包装了的的特殊代码,这些代码只能在setup里才能正常使用,所以需要导出一个函数,这样就可以在组件

setup里调用该函数来指定执行时机。

导出为function还有一个用途是方便传参,这样可以在不同的组件引用时做一些差异化逻辑处理。

3、封装建议

导出的function只需要return组件里要引用的数据;对于组件里不需要引用的就不需要return,组件里只调用导入的函数即可。

组件里的自定义hooks调用代码最好放在setup里第一行位置,这样比较明确,不容易被遗漏。

响应式api的使用风格保持统一,其实这也是整个项目风格统一的问题,对于setup里定义的数据做响应式处理,要么都用ref,要么都用reative,保持统一,这样在使用时不至于有的带.value有的不带。 

vue3(hooks)

vue3的hooks相当于是封装公共方法的js文件

/**计数器+-方法的hooks文件**/
import { ref } from 'vue'
export default function() {
    const counter = ref(0)
    const increment = () => {
        counter.value++
    }
    const devrement = () => {
        counter.value--
    }
 
    return {
        counter,
        increment,
        devrement
    }
}

引入以及使用方法如下

<template>
    <div>
        <h1>我的名字是:{{info.name}}</h1>
        <h1>我的年龄是:{{info.age}}</h1>
        <h1>当前计数为:{{counter}}</h1>
        <button @click="increment">点击加一</button>
        <button @click="devrement">点击减一</button>
    </div>
</template>
<script>  //这里也可以使用setup语法糖写法
import { reactive } from 'vue';
//引入hooks文件 文件名当作变量名
import useCounter from '../hooks/useCounter.js';
export default {
    setup(){
        const info = reactive({name:'dxx',age:18})
        //将hooks文件里的方法和变量全部解构出来使用
        const { counter, increment, devrement } = useCounter()
        //最后将方法和变量导出
        return {
            info,
            counter,
            increment,
            devrement
        }
    }
}
</script>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue中使用Cesium加载shp文件、wms服务、WMTS服务问题

    vue中使用Cesium加载shp文件、wms服务、WMTS服务问题

    这篇文章主要介绍了vue中使用Cesium加载shp文件、wms服务、WMTS服务问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Vue mixins详解与使用技巧

    Vue mixins详解与使用技巧

    Vue mixins提供了一个非常灵活的方式来分发Vue组件中的可复用功能,通过全局混入和局部混入,可以将预定义的方法、数据等混合到Vue组件中,这种技术可以简化代码,提高开发效率,并允许在不同组件间共享功能
    2024-09-09
  • 详解利用eventemitter2实现Vue组件通信

    详解利用eventemitter2实现Vue组件通信

    这篇文章主要介绍了详解利用eventemitter2实现Vue组件通信,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • vue3中实现双向数据绑定的方法

    vue3中实现双向数据绑定的方法

    Vue3中,双向数据绑定主要通过v-model指令实现,v-model是一个语法糖,结合了v-bind和v-on指令来实现数据的双向绑定,它在内部做了绑定数据和监听输入事件两件事,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • vue实现左右滑动效果实例代码

    vue实现左右滑动效果实例代码

    左右滚动的效果,在日常开发中比较常见,这篇文章主要给大家介绍了关于vue实现左右滑动效果的相关资料,需要的朋友可以参考下
    2021-05-05
  • 如何修改Vue项目运行的IP和端口

    如何修改Vue项目运行的IP和端口

    这篇文章主要介绍了修改Vue项目运行的IP和端口的方法,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • 关于在vue中实现过渡动画的代码示例

    关于在vue中实现过渡动画的代码示例

    Vue是一款流行的前端框架,支持过渡动画的实现是其中的一项重要特性,在Vue中,使用过渡动画可以为用户提供更加友好的用户体验,下面我将为大家介绍一下子如何在Vue中实现过渡动画,需要的朋友可以参考下
    2023-06-06
  • Vue 去除路径中的#号

    Vue 去除路径中的#号

    大家都知道vue-router有两种模式,hash模式和history模式,带#的则是hash模式。接下来给大家带来了Vue 去除路径中的#号的解决方法,感兴趣的朋友一起看看吧
    2018-04-04
  • 解决Vue打包后访问图片/图标不显示的问题

    解决Vue打包后访问图片/图标不显示的问题

    这篇文章主要介绍了 解决Vue打包后访问图片/图标不显示的问题,本文给大家介绍的非常详细,具有一定的参考解决价值,需要的朋友可以参考下
    2019-07-07
  • 详解Vue 开发模式下跨域问题

    详解Vue 开发模式下跨域问题

    本篇文章主要介绍了Vue 开发模式下跨域问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06

最新评论