Penjelasan Tentang Pinia Dan Nuxt 3 - CRUDPRO

Penjelasan Tentang Pinia Dan Nuxt 3

Penjelasan Tentang Pinia Dan Nuxt 3

Pinia sekarang menjadi pilihan yang direkomendasikan oleh Vue dan sekarang menjadi bagian resmi dari keseluruhan ekosistem Vue, maintained dan dikembangkan oleh anggota inti tim Vue

Membuat proyek baru

npx nuxi init nuxt3-pinia

Instal pinia

npm i @pinia/nuxt pinia -D

tambahkan modul ke nuxt.config.ts

export default defineNuxtConfig({
  modules: [
    // ...
    '@pinia/nuxt',
  ],
});

Membuat store todo

buat folder penyimpanan di root proyek, lalu buat file todos.ts, kami akan memanggil https://jsonplaceholder.typicode.com/todos ini adalah API tiruan yang mengembalikan daftar todos

Sebelum masuk ke konsep inti, kita perlu tahu bahwa store didefinisikan menggunakan defineStore() dan memerlukan nama yang unik, diteruskan sebagai argumen pertama:

store/todos.ts

import { defineStore } from 'pinia';
export const useTodosStore = defineStore('todos', {});

Di Pinia, status didefinisikan sebagai fungsi yang mengembalikan status awal. Ini memungkinkan Pinia untuk bekerja di Server dan Sisi Klien.

mari buat status todo kosong

state: () => ({
    todos: [],
  }),

Sekarang mari kita buat tindakan, yang akan memanggil titik akhir di atas untuk mengambil daftar todos dan menetapkan data ke status todos

Tindakan setara dengan metode dalam komponen. Mereka bisa didefinisikan dengan properti tindakan di defineStore() dan mereka sempurna untuk mendefinisikan logika bisnis:

async fetchTodos() {
      const { data } = await useFetch('https://jsonplaceholder.typicode.com/todos'); 
      if (data.value) {
        this.todos = data.value;
      }
  }

Nuxt 3 menyediakan composable baru yang disebut useFetch. Ini memungkinkan kita melakukan panggilan GET tanpa harus menginstal axios

kode yang sudah selesai sekarang untuk store/todos.ts
import { defineStore } from 'pinia';

export const useTodosStore = defineStore('todos', {
  state: () => ({
    todos: [],
  }),
  actions: {
    async fetchTodos() {
      const { data }: any = await useFetch('https://jsonplaceholder.typicode.com/todos');
      if (data.value) {
        this.todos = data.value;
      }
    },
  },
});

Cara menggunakan store todos

buka app.vue kita sekarang perlu mengimpor fungsi fetchTodos kita dari store

import { useTodosStore } from '~/store/todos';

saat ini kita perlu merusak penyimpanan kita dan memanggil tindakan, menyatakan yang kita butuhkan, merusak penyimpanan akan merusak reaktivitas.

const { fetchTodos, todos } = useTodosStore();

untuk mempertahankan reaktivitas kita bisa menggunakan properti yang dihitung atau storeToRefs()

Reaktivitas dengan dihitung

gunakan properti yang dihitung untuk membuat status todos reaktif

const store = useTodosStore();

const todos =  computed(() => store.todos)

Reaktivitas dengan storeToRefs()

storeToRefs() memungkinkan kita merusak nilai store sekaligus menjaganya tetap reaktif

import { storeToRefs } from 'pinia'

const store = useTodosStore();
const { todos,} = storeToRefs(store)

bagaimana dengan fungsi

storeToRefs tidak mengizinkan kita untuk merusak fungsi, kita cukup memanggil tindakan dengan store.fetchTodos atau kita dapat merusak nilai store

import { storeToRefs } from 'pinia'

const store = useTodosStore();
const { fetchTodos } = store; // have all non reactiave stuff here 
const { todos } = storeToRefs(store) // have all reactive states here

karena Nuxt 3 mendukung async/menunggu tingkat atas, kami hanya dapat memanggil tindakan fetchTodos

await fetchTodos();

sekarang di html kita, bisakah kita mengulang todo dan menampilkan masing-masing

<template>
  <div>
    <h1>Todos:</h1>
    <ul v-for="todo in todos" :key="todo.id">
      <li>{{ todo.title }}</li>
    </ul>
  </div>
</template>

sekarang kita akan melihat daftar todos

Penjelasan Tentang Pinia Dan Nuxt 3

kode lengkap untuk app.vue

<template>
  <div>
    <h1>Todos:</h1>
    <ul v-for="todo in todos" :key="todo.id">
      <li>{{ todo.title }}</li>
    </ul>
  </div>
</template>
<script lang="ts" setup>
import { storeToRefs } from 'pinia';
import { useTodosStore } from '~/store/todos';
const store = useTodosStore();
const { fetchTodos } = store; // have all non reactiave stuff here
const { todos } = storeToRefs(store); // have all reactive states here
await fetchTodos();
</script>

Alternatif lain mendirikan store pinia

import { defineStore } from 'pinia';
export const useTodosStore = defineStore('todos', () => {
  const todos = ref([]);  // ref by defaults are states,
 // functions get added to actions
  const fetchTodos = async () => { 
    const { data }: any = await useFetch('https://jsonplaceholder.typicode.com/todos');
    if (data.value) {
      todos.value = data.value;
    }
  };
// we must return what we want to use accross the application
  return {
    todos,
    fetchTodos,
  };
});

Cara menyiapkan store ini terasa seperti cara yang sangat familiar dalam membuat komposisi di vue