我已经将一个个人项目从Vue 2迁移到Vue 3,但是偶然发现了一个错误,我似乎不知道如何修复-所以我希望这里有人可以帮助我。
我试过用谷歌搜索,从多个网站上阅读了大量的帖子和文档。但没有什么能让我更接近。
我试图重组Vuex商店,因为一个线程建议,但它没有什么区别。我试图改变导入的相对路径,但没有什么区别。我试图删除组件中的存储,以确保组件按预期工作-它确实工作。
所以现在我希望这里有人能帮助我,因为我想我只是问了错误的问题,寻找错误的答案。
所以我们来原谅我可怜的代码,还在学习。
package.json的版本:
{
"name": "project",
"version": "0.0.1",
"description": "description",
"productName": "my app",
"author": "author",
"private": true,
"scripts": {
"lint": "eslint --ext .js,.ts,.vue ./",
"format": "prettier --write \"**/*.{js,ts,vue,scss,html,md,json}\" --ignore-path .gitignore",
"test": "echo \"No test specified\" && exit 0"
},
"dependencies": {
"@quasar/extras": "^1.0.0",
"core-js": "^3.6.5",
"quasar": "^2.0.0",
"vue": "^3.0.0",
"vue-router": "^4.0.0",
"vuex": "^4.0.1"
},
"devDependencies": {
"@babel/eslint-parser": "^7.13.14",
"@quasar/app": "^3.0.0",
"@types/node": "^12.20.21",
"@typescript-eslint/eslint-plugin": "^5.10.0",
"@typescript-eslint/parser": "^5.10.0",
"eslint": "^7.14.0",
"eslint-config-prettier": "^8.1.0",
"eslint-plugin-vue": "^7.0.0",
"prettier": "^2.5.1"
},
"browserslist": [
"last 10 Chrome versions",
"last 10 Firefox versions",
"last 4 Edge versions",
"last 7 Safari versions",
"last 8 Android versions",
"last 8 ChromeAndroid versions",
"last 8 FirefoxAndroid versions",
"last 10 iOS versions",
"last 5 Opera versions"
],
"engines": {
"node": ">= 12.22.1",
"npm": ">= 6.13.4",
"yarn": ">= 1.21.1"
}
}
字符串
来自控制台的错误:
TypeError: store.state.alarmStore is undefined
alarms AllAlarms.vue:16
run reactivity.esm-bundler.js:187
get value reactivity.esm-bundler.js:1150
sortedAlarms AllAlarms.vue:39
型
AllAlarms.vue
<template>
<q-page class="bg-dark">
<page-header
title="Alarmer"
:left-button="leftButton"
:right-button="rightButton"
/>
<alarm-item-list :alarms="sortedAlarms" :edit-mode="editMode" />
</q-page>
</template>
<script lang="ts">
import { computed, ComputedRef, defineComponent, Ref, ref } from 'vue';
import { Router, useRouter } from 'vue-router';
import { Store } from 'vuex';
import { StateInterface, useStore } from 'src/store';
import { Alarm, HeaderButton } from 'src/components/models';
import PageHeader from 'src/components/PageHeader.vue';
import AlarmItemList from 'src/components/AlarmItemList.vue';
export default defineComponent({
name: 'AllAlarms',
components: { AlarmItemList, PageHeader },
setup() {
const router: Router = useRouter();
const store: Store<StateInterface> = useStore();
// The line below is the line 16 in the error
const alarms: ComputedRef<Array<Alarm>> = computed(
() => store.state.alarmStore.alarms
);
const editMode: Ref<boolean> = ref(false);
const leftButton: ComputedRef<HeaderButton> = computed(() => {
return {
icon: editMode.value ? 'close' : 'settings',
label: editMode.value ? 'Close' : 'Settings',
onClick: () => {
editMode.value = !editMode.value;
},
};
});
const rightButton: HeaderButton = {
icon: 'add',
label: 'Add',
onClick: () => {
void router.push({
name: 'create',
});
},
};
const sortedAlarms: ComputedRef<Array<Alarm>> = computed(() => {
// The line below is the line 39 from the error
const _alarms: Array<Alarm> = [...alarms.value];
return _alarms.sort((a1: Alarm, a2: Alarm): number => {
return a1.triggerTime.getTime() - a2.triggerTime.getTime();
});
});
return {
leftButton,
rightButton,
editMode,
sortedAlarms,
};
},
});
</script>
型
src/store/index.ts
import { store } from 'quasar/wrappers';
import { InjectionKey } from 'vue';
import {
createStore,
Store as VuexStore,
useStore as vuexUseStore,
} from 'vuex';
import alarm from 'src/store/alarm';
import { AlarmStateInterface } from 'src/store/alarm/state';
import melody from 'src/store/melody';
import { MelodyStateInterface } from 'src/store/melody/state';
/*
* If not building with SSR mode, you can
* directly export the Store instantiation;
*
* The function below can be async too; either use
* async/await or return a Promise which resolves
* with the Store instance.
*/
export interface StateInterface {
// Define your own store structure, using submodules if needed
alarmStore: AlarmStateInterface;
melodyStore: MelodyStateInterface;
}
// provide typings for `this.$store`
declare module '@vue/runtime-core' {
interface ComponentCustomProperties {
$store: VuexStore<StateInterface>;
}
}
// provide typings for `useStore` helper
export const storeKey: InjectionKey<VuexStore<StateInterface>> =
Symbol('vuex-key');
export default store(function (/* { ssrContext } */) {
const Store = createStore<StateInterface>({
modules: {
alarm,
melody,
},
// enable strict mode (adds overhead!)
// for dev mode and --debug builds only
strict: !!process.env.DEBUGGING,
});
return Store;
});
export function useStore() {
return vuexUseStore(storeKey);
}
型
src/store/alarm/index.ts
import { Module } from 'vuex';
import { StateInterface } from '../index';
import state, { AlarmStateInterface } from './state';
import actions from './actions';
import getters from './getters';
import mutations from './mutations';
export default {
namespaced: true,
actions,
getters,
mutations,
state,
} as Module<AlarmStateInterface, StateInterface>;
型
src/store/alarm/state.ts
import { Alarm } from 'src/components/models';
export interface AlarmStateInterface {
newAlarm: Alarm;
updatableAlarm: Alarm;
alarms: Array<Alarm>;
}
function state(): AlarmStateInterface {
return {
newAlarm: {
id: 0,
active: true,
triggerTime: new Date(),
specificDays: {
mon: false,
tue: false,
wed: false,
thu: false,
fri: false,
sat: false,
sun: false,
},
melody: {
id: 0,
name: '',
filePath: '',
},
},
updatableAlarm: {
id: 0,
active: true,
triggerTime: new Date(),
specificDays: {
mon: false,
tue: false,
wed: false,
thu: false,
fri: false,
sat: false,
sun: false,
},
melody: {
id: 0,
name: '',
filePath: '',
},
},
alarms: [
{
id: 1,
active: true,
triggerTime: new Date('2022-03-26T07:20:00'),
specificDays: {
mon: true,
tue: false,
wed: true,
thu: false,
fri: true,
sat: false,
sun: false,
},
melody: {
id: 1,
name: 'Melodi 1',
filePath: 'TODO',
},
},
{
id: 2,
active: false,
triggerTime: new Date('2022-03-26T07:15:00'),
specificDays: {
mon: false,
tue: true,
wed: false,
thu: true,
fri: false,
sat: true,
sun: true,
},
melody: {
id: 1,
name: 'Melodi 1',
filePath: 'TODO',
},
},
{
id: 3,
active: true,
triggerTime: new Date('2022-03-26T07:19:00'),
specificDays: {
mon: false,
tue: false,
wed: true,
thu: true,
fri: true,
sat: true,
sun: false,
},
melody: {
id: 1,
name: 'Melodi 1',
filePath: 'TODO',
},
},
],
};
}
export default state;
型
我很抱歉的许多行代码-只是希望有人发现我犯的错误。如果需要其他信息,请告诉我。
先谢谢你了。
编辑:正如Estus Flask提到的:
export default store(function (/* { ssrContext } */) {
const Store = createStore<StateInterface>({
modules: {
alarmStore: alarm, // I updated this
melodyStore: melody, // And this
},
// enable strict mode (adds overhead!)
// for dev mode and --debug builds only
strict: !!process.env.DEBUGGING,
});
return Store;
});
型
1条答案
按热度按时间ccrfmcuu1#
正如Estus Flask提到的:
没有
alarmStore
。你调用了模块alarm
。我已经更新了问题的答案在底部-只是一个盲目的错误。