Vue3 hooks实战必备!

476 阅读3分钟

一、前言

众所周知,Vue 2中的mixin和Vue 3中的hooks是两种不同的组件复用方式。但这两者有一定的区别,Vue 2中的mixin是一种将一组选项合并到组件中的方式,可以在多个组件中共享相同的逻辑和选项。但是mixin的使用会导致命名冲突和组件间的依赖关系不清晰。而Vue 3中的hooks是一种更加灵活和可组合的方式来复用组件逻辑。通过使用hooks,可以将组件的状态和生命周期逻辑拆分为独立的函数,使得逻辑更加清晰和可复用。同时,hooks的使用也避免了命名冲突和依赖关系不清晰的问题。总的来说,Vue 3的hooks比Vue 2的mixin更加灵活、可组合和易于维护。它提供了一种更好的组件复用方式,使得组件的逻辑更加清晰和可读性更高。

Vue 3的hooks是从React中的hooks概念得到启发,并在Vue 3版本中引入的。Vue 3的hooks提供了一种新的组件编写方式,使得组件的逻辑可以更加清晰和可复用。通过使用hooks,可以在函数式组件中使用状态、生命周期钩子等功能,以更加灵活和简洁的方式编写Vue组件。

对于逻辑抽离和全局共享,都会想到使用vuex和pinia这两种工具,但是有了Vue3的hooks的写法,基本上项目就无需使用这两种工具了。

二、案例

利用一个简单的登录案例,使用Vue3 hooks的写法将其代码封装。登录信息一般会有账号、密码和后端返回的token(这里使用JWT登录方式),主要的业务有设置用户信息、登录操作、登出操作、设置token信息。我们现在先创建一个useUserStore.ts文件,其主要暴露一个函数(因为函数有相对独立的作用域,这和组件是一个函数是同个道理),供页面逻辑复用。写法非常类似vuex或pinia,主要代码如下:

import { ref } from "vue";
import router from "@/router";

export interface IUser {
  account?: string
  password?: string
}

export interface IState {
  info: IUser
  token: string
}

const state = ref<IState>({
  info: {
    account: '',
    password: ''
  },
  token: ''
})

export function useUserStore() {

  /**
   * 设置用户信息
   */
  const setUserInfo = (info: IUser): void => {
    state.value.info = info
  }

  /**
   * 设置token
   */
  const setToken = (token: string) => {
    state.value.token = token
  }

  /**
   * 用户登录
   */
  const login = () => {
    // TODO:登录逻辑
    console.log(state.value.info);
    router.push('/home')
  }

  /**
   * 登出
   */
  const logout = () => {
    // TODO:登出逻辑
  }

  return {
    state,
    setUserInfo,
    setToken,
    login,
    logout
  }
}

我们在一个页面上进行测试,输入账号密码,点击登录,跳转到路径为/home的页面。

<div>
    <label for="account">账号</label>
    {{ state.userInfo }}
    <input v-model="state.info.account" type="text" name="" id="account" class=" outline-none border-[1px] borde-[#999] border-solid">
    <label for="password">密码</label>
    <input v-model="state.info.password" type="password" name="" id="password"
      class="border-[1px] borde-[999] border-solid outline-none ">
    <button @click="login" class="ml-10 border-[1px] borde-[999] border-solid py-1 px-2">登录</button>
  </div>

  <p>------------------------------------------------------------------------------</p>

  <div v-if="route.path !== '/'">
    <RouterView></RouterView>
  </div>
import { useUserStore } from '@/store/user/useUserStore'
import { useRoute } from 'vue-router';

const route = useRoute()

const {
  state,
  login,
} = useUserStore()

可以看到调用的时候非常方便,我们在home.vue页面打印用户登录信息,当输入验证数据是否可全局共享。

 <div>
    <p>用户信息:{{ state.info }}</p>
  </div>
import { useUserStore } from '@/store/user/useUserStore';
const {state} = useUserStore()

image.png

在页面上可以显示用户信息,但在现实登录时,用户信息应具有时效性,所以需要跟缓存进行结合。以上就是一个通过使用Vue3 hooks简单封装的案例,希望对你有所帮助!

欢迎关注公众号---代码分享站