Задать вопрос
@sgidlev

Как получить измененный state из Pinia в Vue3?

Приветствую.
Изучаю основы Vue3 в связке с Pinia и столкнулся с проблемой получения данные State во View.

Создал Сторадж src/stores/post.js

import { defineStore } from "pinia";

export const usePostStore = defineStore({
  id: "post",
  state: () => ({
    posts: [],
    loading: false,
    error: null,
  }),
  actions: {
    async fetchPosts() {
      this.posts = [];
      this.loading = true;
      try {
        this.posts = await fetch(
          "https://jsonplaceholder.typicode.com/posts"
        ).then((response) => response.json());
      } catch (error) {
        this.error = error;
      } finally {
        this.loading = false;
      }
    },
  },
});


Теперь во View пытаюсь получить данные State posts.

<script setup>
import { storeToRefs } from "pinia";

import { usePostStore } from "@/stores/post";

const postStore = usePostStore();
const { posts } = storeToRefs(postStore);

postStore.fetchPosts();
console.log(posts);

</script>

<template>
  <div v-for="post in posts" :key="post.id">
    <h1>
      {{ post.title }}
    </h1>
    <p>
      {{ post.body }}
    </p>
  </div>
</template>


При обращении через:
console.log(postStore.posts);
я получаю дефолтное состояние post, а именно пустой массив []

В template без проблем пробрасываются посты, но как получить данные постов после вызова метода fetchPosts()?

Я нашел только способ через Subscribe получить измененное состояние:

postStore.$subscribe((mutation, state) => {
  console.log(mutation, state);
  console.log(mutation.events.newValue.id);
});


Но мне кажется есть способ попроще.
  • Вопрос задан
  • 792 просмотра
Подписаться 1 Средний Комментировать
Решения вопроса 1
Fragster
@Fragster
помогло? отметь решением!
Потому что fetchPosts() возвращает промис.
Надо как-то так:
postStore.fetchPosts().then(()=> {console.log(postStore.posts)})

Ну или сделать весь компонент асинхронным и использовать async/await синтаксис и поместить его в Suspense
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы