#javascript #typescript #vue.js #vuex #vuejs3
Вопрос:
Можно ли получить доступ к методам класса через состояние Vuex?
В следующей ситуации я хочу позвонить fullName()
, чтобы отобразить отформатированное имя пользователя.
TypeError: store.state.user.fullName is not a function
Классы
export class User {
constructor(
public id: string = '',
public first_name: string = '',
public last_name: string = '',
) {}
fullName = (format: 'forward' | 'reverse' = 'forward') => {
if (format === 'forward') return `${this.first_name} ${this.last_name}`
if (format === 'reverse') return `${this.last_name}, ${this.first_name}`
}
}
export interface RootState {
user: User
}
Vuex
export const key: InjectionKey<Store<RootState>> = Symbol()
export default createStore<RootState>({
strict: true,
state: {
user: new User(),
},
})
Компонент
setup(){
const state = useState(key)
return {
name: computed(_ => store.state.user.fullName('forward'))
}
}
Ответ №1:
Как кажется, Vuex удаляет методы класса, сохраняя только его простые значения.
Мой обходной путь для восстановления методов класса состоял в том, чтобы скопировать состояние пользователя Vuex в новый экземпляр пользователя.
const user = computed(_ => Object.assign(new User(), store.state.user))
Комментарии:
1. Я не уверен, что это лишает их, я не знаю об этом поведении и подозреваю, что вы сделали что-то не так со своей стороны. Класс пошел не так, и вы вообще не должны его использовать. Полное имя является методом экземпляра без уважительной причины и жестко запрограммировано для использования нереактивных свойств
this
, проверьте, какfullName =
на самом деле работает синтаксис сахара.