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

目录
  • 自定义hooks/可组合函数
    • 1.mixins方式的痛点
    • 2.传统mixins方式示例
    • 3.自定义hooks方式示例
  • 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>

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

(0)

相关推荐

  • vue3中的hooks总结

    目录 vue3的hooks总结 计数器的hook vue3自定义hooks vue3的hooks总结 vue3中的hooks其实是函数的写法,就是将文件的一些单独功能的js代码进行抽离出来,放到单独的js文件中.这样其实和我们在vue2中学的mixin比较像.下面我们总结一下如何去书写hooks. 首先应该先建立一个hooks文件夹:其目的是为了存放hook文件. 建立相关的hook文件:一般使用use开头. 计数器的hook useTitle的hooks useScrollPostion用来监

  • vue3使用自定义hooks获取dom元素的问题说明

    目录 使用自定义hooks获取dom元素问题 分享下楼主自己的观点 vue获取/操作组件的dom元素 下面是我的代码内容(非全部内容) 最后总结 使用自定义hooks获取dom元素问题 在自定义hooks的onMounted事件里面 获取ref元素,组件调用hooks的时候必须要传递响应式对象. 分享下楼主自己的观点 代码如下 <script> // demo.vue import { defineComponent, ref } from 'vue' import useBars from

  • vue3-HOOKS模块化处理方式

    目录 vue3模块化处理 vue hooks理解与使用 demo源码示意 vue3模块化处理 vue3版本的更新,就是能搞更好的重用机制,可以把想要得模块独立出去 eg:显示一个当前时间的工能,在多个页面需要调用的时候不用重复的调用 可以在src目录下,新建一个文件夹hooks(所有抽离出来的功能模块都可以放到这个文件夹里), 然后再新建一个文件useNowTime.js,这里使用use开头是一个使用习惯,代表是一个抽离出来的模块 import { ref } from "vue";

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

    目录 自定义hooks/可组合函数 1.mixins方式的痛点 2.传统mixins方式示例 3.自定义hooks方式示例 vue3(hooks) 自定义hooks/可组合函数 vue3 composition api下mixins的替代方式(自定义hooks / 可组合函数) 传统方式下封装的mixins在引入文件里都是通过this来调用属性或方法, 而在vue3的composition API下this是undefined,实际上这两者就是冲突的, 只能封装一套全新的方式来使用类似mixin

  • Vue3编程流畅技巧自定义Hooks

    目录 Vue3自定义Hooks让写Vue3更畅快 Vue3自定义Hooks定义: 为什么Vue3要用自定义Hook?: 写Vue3请摆脱Vue2无脑this的思想: 几张动图复习Composition Api的好 Composition Api解耦Vue2 Option Api实现低耦合高内聚 定义一下Vue3的自定义Hook: 实例: Vue3自定义Hooks和Vue2时代Mixin关系: 1.Mixin难以追溯的方法与属性 2.无法向Mixin传递参数来改变逻辑 3.Mixin同名变量会被覆

  • vue3在自定义hooks中使用useRouter报错的解决方案

    目录 自定义hooks中使用useRouter报错 useRouter useRoute 使用Vue.use()报错“Cannot read property ‘use‘ of undefined” 原因 正解 自定义hooks中使用useRouter报错 随着vue3的更新,vue-router也更新到了4.x useRouter 相当于vue2的this.$router全局的路由实例,是router构造方法的实例 useRoute 相当于vue2的this.$route表示当前激活的路由的状

  • Vue3使用hooks函数实现代码复用详解

    目录 前言 VUE2我们是怎么做的呢? VUE3中我们怎么处理复用代码逻辑的封装呢? 说那么多,不如直接上代码来看差异 前言 项目开发过程中,我们会遇到一些情况,就是多个组件都可以重复使用的一部分代码逻辑,功能函数,我们想要复用,这可怎么办呢? VUE2我们是怎么做的呢? 在vue2 中有一个东西:Mixins 可以实现这个功能 mixins就是将这些多个相同的逻辑抽离出来,各个组件只需要引入mixins,就能实现代码复用 弊端一: 会涉及到覆盖的问题 组件的data.methods.filte

  • React函数组件useContext useReducer自定义hooks

    目录 一.hooks(useContext) 二.hooks(useReducer) 三.hooks(useContext搭配useReducer使用) 四.自定义hooks 一.hooks(useContext) 接收一个 context 对象(React.createContext 的返回值)并返回该 context 的当前值.当前的 context 值由上层组件中距离当前组件最近的 <MyContext.Provider> 的 value prop 决定. 新建useContext.js

  • vue3自定义dialog、modal组件的方法

    vue3-layer:基于Vue3.0开发的PC桌面端自定义对话框组件. 基于vue3构建的PC网页端自定义弹出框组件.全面覆盖各种弹窗应用场景,拥有10+种弹窗类型.30+种自定义参数配置.7+种弹窗动画效果,支持拖拽.缩放.最大化.全屏及自定义激活当前置顶层等功能. 前几天分享过一个Vue3.0移动端弹层组件V3Popup,如果感兴趣也可以去看看. https://www.jb51.net/article/203415.htm v3layer在开发设计之初灵感来自有赞Vant3.0.饿了么E

  • vue3 自定义指令详情

    目录 一.注册自定义指令 1.1.全局自定义指令 1.2.局部自定义指令 二.自定义指令中的生命周期钩子函数 三.自定义指令钩子函数的参数 四.自定义指令参数 一.注册自定义指令 以下实例都是实现一个输入框自动获取焦点的自定义指令. 1.1.全局自定义指令 在vue2中,全局自定义指令通过 directive 挂载到 Vue 对象上,使用 Vue.directive('name',opt). 实例1:Vue2 全局自定义指令 Vue.directive('focus',{ inserted:(e

  • vue2.x中h函数(createElement)与vue3中的h函数详解

    目录 1. vue2.x的 h 函数(createElement) 2. vue3 h函数配置项 2.1 v-model实现(以下开始为官网实现) 2.2 v-on 2.3 事件修饰符 2.4 插槽 2.5 component 和 is 2.6 自定义指令 2.7 内置组件 2.8 渲染函数的返回值 2.9 JSX 总结 1. vue2.x的 h 函数(createElement) 使用方法及介绍:(参考官网提取) h函数第一个是标签名字 或者是组件名字,第二个参数是配置项,第三个参数是 inn

  • vue3的hooks用法总结

    目录 vue3的hooks总结 一.计数器的hook vue3中hooks的介绍及用法小结 一. 什么是hooks 二.hooks的用法 vue3的hooks总结 vue3中的hooks其实是函数的写法,就是将文件的一些单独功能的js代码进行抽离出来,放到单独的js文件中.这样其实和我们在vue2中学的mixin比较像.下面我们总结一下如何去书写hooks.首先应该先建立一个hooks文件夹:其目的是为了存放hook文件. 建立相关的hook文件:一般使用use开头. 一.计数器的hook us

随机推荐