Skip to content
This repository was archived by the owner on May 1, 2025. It is now read-only.

Commit 6a46367

Browse files
authored
feat: content/2.concepts/6.state-manegement (#37)
1 parent 11e759d commit 6a46367

File tree

5 files changed

+65
-6
lines changed

5 files changed

+65
-6
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<template>
2+
<CounterA />
3+
<CounterB />
4+
</template>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<script setup lang="ts">
2+
const count = useState('count', () => 0)
3+
</script>
4+
5+
<template>
6+
<div>
7+
<h2>Counter A</h2>
8+
<p>Count: {{ count }}</p>
9+
<button type="button" @click="count++">
10+
Increment
11+
</button>
12+
</div>
13+
</template>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<script setup lang="ts">
2+
const count = useState('count', () => 0)
3+
</script>
4+
5+
<template>
6+
<div>
7+
<h2>Counter B</h2>
8+
<p>Count: {{ count }}</p>
9+
<button type="button" @click="count++">
10+
Increment
11+
</button>
12+
</div>
13+
</template>
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import type { GuideMeta } from '~/types/guides'
2+
3+
export const meta: GuideMeta = {
4+
startingFile: 'app.vue',
5+
features: {
6+
fileTree: true,
7+
},
8+
}

content/2.concepts/6.state-manegement/index.md

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,31 @@
22
ogImage: true
33
---
44

5-
# State Management
5+
# 状態管理
66

7-
<!-- TODO:
8-
- What is State Management?
9-
- Problems on SSR
10-
- How to implement State Management in a Nuxt.js app (useState)
11-
-->
7+
Vue.js での 状態管理 (State Management) とは、アプリケーションでリアクティブな状態 (ステート) を管理することを言います。\
8+
[Vue.js 公式ドキュメント 状態管理](https://ja.vuejs.org/guide/scaling-up/state-management)
9+
10+
複数のコンポーネント間で状態を共有する際、Vue.js ではリアクティビティー API を用いたシンプルな状態管理を行うことができます。\
11+
[Vue.js 公式ドキュメント リアクティビティー API によるシンプルな状態の管理](https://ja.vuejs.org/guide/scaling-up/state-management#simple-state-management-with-reactivity-api)
12+
13+
しかし、[SSR の考慮](https://ja.vuejs.org/guide/scaling-up/state-management#ssr-considerations) にも書かれているように、Nuxt で SSR を行っている場合には [いくつかの問題](https://ja.vuejs.org/guide/scaling-up/ssr#cross-request-state-pollution) が起こる可能性があります。
14+
15+
Vue.js の公式ドキュメントでは [Pinia](https://pinia.vuejs.org/) と言う状態管理ライブラリを使う方法が紹介されていますが、Nuxt が提供する `useState()` コンポーザブル もその解決策の一つです。\
16+
(もちろん、[Nuxt で Pinia を使用する](https://nuxt.com/docs/getting-started/state-management#usage-with-pinia) ことも可能です。)
17+
18+
## useState()
19+
20+
[useState() コンポーザブル](https://nuxt.com/docs/api/composables/use-state) は SSR フレンドリーな状態管理と、コンポーネント間で状態を共有するためのシンプルな方法を提供します。\
21+
`useState()` は共有状態を定義するための SSR フレンドリーな `ref()` です。\
22+
前述の通り、Vue.js のリアクティビティー API (e.g. `ref()`) を用いてコンポーネントを跨いだ状態管理を SSR で行う場合、いくつかの問題が発生する可能性があります。\
23+
そのため、Nuxt では `<script setup>``setup()` 関数の **** では、`ref()` での状態を定義せず、代わりに `useState()` を使用することがベストプラクティスとされています。
24+
25+
このプレイグラウンドの例では、`"count"` をキーに `CounterA` コンポーネントと `CounterB` コンポーネントで状態を共有しています。\
26+
`CounterA` によってレンダリングされたボタンをクリックしたときに、`CounterB` のステートも更新されることに注目してみてください。
27+
28+
より詳細な説明は、[Nuxt 公式ドキュメント 状態管理](https://nuxt.com/docs/getting-started/state-management) を参照してください。
29+
30+
:::note
31+
`useState()` のデータは JSON にシリアライズされるため、クラス、関数、シンボルなど、シリアライズできないものを含まないことに注意が必要です。
32+
:::

0 commit comments

Comments
 (0)