Обновлять
После того, как я опубликовал этот ответ, я заметил, что определение его так, как я представил Typescript, перестало обнаруживать поля state
. Я предполагаю, что это потому, что я использовал any
как тип. Возможно, я мог бы определить тип вручную, но для меня это звучит как повторение. Таким образом, на данный момент я получил функцию вместо расширения класса (я был бы рад сообщить мне другое решение, если кто-то его знает).
import { Store } from 'vuex'
import VueRouter from 'vue-router'
// ...
export default (router: VueRouter) => {
return new Store({
// router = Vue.observable(router) // You can either do that...
super({
state: {
// router // ... or add `router` to `store` if You need it to be reactive.
// ...
},
// ...
})
}
import Vue from 'vue'
import App from './App.vue'
import createStore from './store'
// ...
new Vue({
router,
store: createStore(router),
render: createElement => createElement(App)
}).$mount('#app')
Первоначальное содержание ответа
Я лично только что сделал обертку для типичного класса Store
.
import { Store } from 'vuex'
import VueRouter from 'vue-router'
// ...
export default class extends Store<any> {
constructor (router: VueRouter) {
// router = Vue.observable(router) // You can either do that...
super({
state: {
// router // ... or add `router` to `store` if You need it to be reactive.
// ...
},
// ...
})
}
}
Если вам нужно $route
, вы можете просто использовать router.currentRoute
. Просто помните, что Вам скорее понадобится router
реактивный, если Вы хотите, чтобы Ваш getters
с router.currentRoute
работал должным образом.
А в main.ts (или .js) я просто использую его с new Store(router)
.
import Vue from 'vue'
import App from './App.vue'
import Store from './store'
// ...
new Vue({
router,
store: new Store(router),
render: createElement => createElement(App)
}).$mount('#app')
15.11.2020
Vue.http
предназначен для использования таким образом, нет необходимости делать это глобальным. 23.11.2016