pinia: определение геттеров и действий в функциональном обозначении
Я нахожусь в процессе реализации хранилища pinia в нотации функций, и мне интересно, как объявить геттеры и действия.
Реализованы ли они как простые функции без различия?
import { defineStore } from 'pinia'
import HttpService from '../services/BaseHttpService';
import { ref } from 'vue'
import { User } from '../models/user.model';
const httpService = new HttpService('/users');
export const useUserStore = defineStore('user', () => {
const authedUser = ref(new User())
const users = ref<User[]>([])
function authed() {
return typeof authedUser.value['@id'] === "string";
}
function login(data: { email: string, password: string }) {
const http = new HttpService('/login');
return http.post(data).then((response) => {
authedUser.value = response
users.value = [...users.value, response]
})
}
function getter() {
return users.value;
}
function action(id: number) {
httpService.get(id).then((response) => {
users.value = [...users.value, response]
})
}
return {authedUser, users, authed, login}
})
1 ответ
Как уже было сказано, вы можете использоватьcomputed
переменная для получения геттеров и сеттеров. Я дам решение на TypeScript, которое должно работать в Javascript, если вы удалите аннотации типов. Я нашел свое первоначальное решение по этой проблеме, комментарий, который немного выше гласит :
Интерфейс для записи:
export declare interface WritableComputedOptions<T> { get: ComputedGetter<T>; set: ComputedSetter<T>; }
это выглядело бы примерно так (я не знал, как работает ваш класс User, поэтому, возможно, он немного сломан):
import { defineStore } from 'pinia'
import HttpService from '../services/BaseHttpService';
import { ref, computed } from 'vue'
import { User } from '../models/user.model';
const httpService = new HttpService('/users');
export const useUserStore = defineStore('user', () => {
const users = ref<User[]>([])
const authedUser = computed<User | null>({
get: () => {
// find the (single) user that is logged in.
let authedUsers = users.value.filter((user: User) => {user.isLoggedIn()})
// return the user that is logged in and null otherwise
return authedUsers.length === 1 ? authedUsers[0] : null
},
set: (user: User) => {
//check if there is a logged in user(s)
let authedUsers = users.value.filter((user) => {user.isLoggedIn()})
if (authedUsers.length >== 0) {
authedUsers.forEach((authedUser: User) => {authedUser.logOut()}
}
if (users.value.includes(user) === false){
users.value.push(user)
}
user.logIn()
}
}
})
function login(data: { email: string, password: string }) {
const http = new HttpService('/login');
return http.post(data).then((response: User) => {
authedUser.value = response
// we already do this in the setter function
// users.value = [...users.value, response]
})
}
return {authedUser, users, login}
})
Не уверен, что мутируетusers
при настройкеauthedUser
хотя это антипаттерн...