当前位置: 首页 > article >正文

Vue2.7 如何使用Vue3新增的useStore、useRouter、useRoute

在 Vue 2.7 中,从 Vue 3 移植回了的一些特性,使得 Vue 2 用户也可以享有Vue3的便利。但是很多Vue3的东西是不能直接使用的。最常用的就是Vue3中的useStore、useRouter、useRoute几个hook。以下将介绍如何在Vue2.7中使用这些hook。(参考了网上其他大佬的内容和github上的部分源码):
1、新建VueApi.ts文件。useStore、useRouter、useRoute 都从这个模块中引用(区别于Vue3直接从Vue模块中引用)
2、实现:

/** 对 vue-router 和 vuex 做兼容处理,以便使用组合式API  */
import { effectScope, getCurrentInstance, reactive } from 'vue';
import { Route } from 'vue-router';
import { Store } from 'vuex';

/**
 * 使用vuex的$store
 * @returns  this.$store
 */
export const useStore = () => {
  const vm = getCurrentInstance();
  if (!vm) throw new Error('useStore() can only be used inside setup() or functional components.');
  return vm.proxy.$store;
};

/**
 * 使用vue-router的$router
 * @returns this.$router
 */
export const useRouter = () => {
  const vm = getCurrentInstance();
  if (!vm) throw new Error('useRouter() can only be used inside setup() or functional components.');
  return vm.proxy.$router;
};

let currentRoute: Route;

/**
 * 使用vue-router的$route
 * @returns this.$route
 */
export function useRoute() {
  const router = useRouter();
  if (!router) {
    return undefined;
  }
  if (!currentRoute) {
    const scope = effectScope(true);
    scope.run(() => {
      currentRoute = reactive(assign({}, router.currentRoute));
      router.afterEach((to) => {
        assign(currentRoute, to);
      });
    });
  }
  return currentRoute;
}

/**
 * 合并对象
 * @param {object} target 原对象
 * @param {object} source 新对象
 * @returns {object} 合并后的对象
 */
function assign(target: any, source: any) {
  for (const key of Object.keys(source)) {
    target[key] = source[key];
  }
  return target;
}

3、代码中使用(在选项式api中不能使用hook,请直接使用this.xxx的方式)

<script setup>
import { useRoute, useRouter, useStore } from '@/utils/vueApi';
const store = useStore();
const router = useRouter();
const route = useRoute();
...
</script>

http://www.kler.cn/a/535728.html

相关文章:

  • java时间相关类
  • Spring 核心技术解析【纯干货版】- IX:Spring 数据访问模块 Spring-Jdbc 模块精讲
  • 2025开源DouyinLiveRecorder全平台直播间录制工具整合包,多直播同时录制、教学直播录制、教学视频推送、简单易用不占内存
  • ollama部署deepseek实操记录
  • 前端知识速记:POST和GET
  • c++中priority_queue的应用及模拟实现
  • mysql mvcc 锁 关系
  • C语言:函数栈帧的创建和销毁
  • Windows图形界面(GUI)-QT-C/C++ - Qt QSpinBox
  • 16.状态模式(State Pattern)
  • arcgis for js范围内天地图高亮,其余底图灰暗
  • LLM驱动的NL2SQL方法论:现状、难点、优化
  • Less使用教程和步骤_less的使用
  • TfidfVectorizer
  • 若依框架使用(低级)
  • 软件工程导论三级项目报告--《软件工程》课程网站
  • TaskBuilder低代码开发项目实战—创建项目
  • 【数据科学】一个强大的金融数据接口库:AKShare
  • Blender 3D建模——AI脚本3D建模技巧
  • (五)QT——QDialog 对话框
  • 第八篇:数据库的安全性与权限管理
  • 求解大规模单仓库多旅行商问题(LS-SDMTSP)的成长优化算法(Growth Optimizer,GO),MATLAB代码
  • Android原生开发问题汇总
  • react使用DatePicker日期选择器
  • UE学习日志#23 C++笔记#9 编码风格
  • Ubuntu重启搜狗输入法