vue.js - 如何减少 Vue 3 Composition API 中的样板代码(例如路由器、商店)
问题描述
使用 Vue 3 组合 API,每个视图都需要具备以下条件:
import { useRouter, useRoute } from 'vue-router'
import { useStore } from 'vuex'
export default {
setup() {
const router = useRouter()
const store = useStore()
// ...
}
}
有没有办法以某种方式只声明一次,将它们传递给创建的应用程序,然后在应用程序视图中简单地使用它们而不需要这些声明?使用 vue2,这些是在应用程序初始化时传递的,然后this.$store
/this.$router
简单地工作。
一个带有全局变量的想法,它很容易引起问题:在 中app.vue
,这些可以像这样声明一次:
import { useStore } from 'vuex'
export default {
setup() {
globalthis.store = useStore()
然后store
将在任何地方工作。
解决方案
组件实例不可用,setup()
因为组件尚未创建,因此this
组合 API 中没有上下文可使用this.$store
。
setup()
我相信在没有任何其他导入的情况下使存储/路由器变量可用的唯一方法是将它们附加到window
/globalThis
作为全局变量(忽略 globals 的警告):
// router.js
import { createRouter } from 'vue-router'
export default createRouter({/*...*/})
// store.js
import { createStore } from 'vuex'
export default createStore({/*...*/})
// main.js
import router from './router'
import store from './store'
window.$router = router
window.$store = store
请注意,对于 Vuex 4 和 Vue Router 4,选项 API和模板中的 store 和 router 仍然可用,分别为$store
和:$router
<template>
<div>{{ $store.state.myProp }}</div>
<button @click="$router.back()">Back</button>
</template>
<script>
export default {
mounted() {
console.log(this.$store.state.myProp)
console.log(this.$router.currentRoute)
}
}
</script>
推荐阅读
- javascript - http post request params 包含空数组值,将被 axios 删除
- video-streaming - 如何将 HLS.js 与 Angular 集成?
- javascript - 当按钮:['colvis'] 激活时,复选框单击事件在数据表行中不起作用
- javascript - React 在移动 recaptch 就绪回调时抛出 CORs 错误
- r - 插入符号 rpart 决策树绘图结果
- android - 如何在android的默认材料日期选择器中获取开始日期和结束日期的日期对象?
- laravel - Schema 类如何从其他类访问方法
- forex - 画一条线的指标,看看我能赚多少点
- angular - Angular:chart.js 图表未显示
- react-native - 卸载时跟踪本机“IOS”或Android“应用程序