本日は、状態管理とデータバインディングについて勉強します!
初めての人はお金持ちまでの道のり:0日目をまず読んでみてください!よろしくお願いします★
状態管理とデータバインディングとは?
1. 状態管理とは?
状態管理は、アプリの中で変わるデータ(状態)を管理する仕組みのことです。
たとえば、「りんごの数」がどんどん変わるときに、「今、りんごが何個あるか」をアプリ内で記憶することを「状態管理」といいます。
- りんごが1つ増えるたびに「状態」が変わります。
- 状態管理がしっかりしていると、データが変わるたびにその新しいデータをアプリが覚えてくれます。
2. データバインディングとは?
データバインディングは、データと画面表示をつなげる仕組みです。
つまり、状態管理で管理された「りんごの数」が変わったら、データバインディングのおかげで画面の表示も自動で変わります。
- 「りんごの数」という状態が変わると、それが画面にもすぐに反映されます。
- データバインディングのおかげで、プログラムが自動で画面を更新するので、手動で書き換える必要がありません。
状態管理とデータバインディングの違い
- 状態管理:データを「覚える・管理する」部分。
- データバインディング:そのデータが変わったときに、画面も「自動で更新」される部分。
この2つが一緒に働くことで、アプリはスムーズに動きます。
おさらい
Reactの特徴
- パーツを組み合わせる:Reactでは、画面の小さなパーツ(ボタンや入力欄など)を作り、それらを組み合わせて大きな画面を作っていきます。作り方はレゴブロックで何かを作るイメージです。
- JavaScriptをたくさん使う:Reactは、画面のレイアウトをJavaScriptという言葉でたくさん書きます。なので、JavaScriptが好きな人に向いています。
- イベントを自分でしっかり管理:たとえば、ボタンを押したときの動きなどを、自分でしっかり書いていきます。
Vue.jsの特徴
- 簡単に始められる:Vue.jsは、Reactに比べて初めての人でも使いやすい作りになっています。少しの設定で動き出せるので、初心者に優しいです。
- データと画面を簡単につなげる:Vue.jsには、データと画面を自動でつなげてくれる仕組みが組み込まれているので、データが変わると画面も自動で変わります。
- HTML・CSSと一緒に書ける:Vue.jsは、HTMLやCSSも一緒に書けるので、見た目を作るのがわかりやすいです。
Reactの状態管理
useStateフック: Reactでは、useState
フックを使ってコンポーネント内の状態を定義します。状態を変更すると、コンポーネントが再描画され、UIが更新されます。
※コンポーネントは、画面の部品を作るためのまとまりです。ボタンやフォームなど、一つ一つのパーツをコンポーネントとして作っておくと、他の場所でも使い回せて便利です。
import React, { useState } from 'react';
function Counter() { // ここから全てのコードが「Counter」というコンポーネント
const [count, setCount] = useState(0); // 状態を宣言
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
}
コードの詳しい解説
このコードは「カウンター」といって、ボタンを押すと数字が1つずつ増えていく仕組みを作っています。カウンターがどう動いているか、部分ごとに説明します。
import React, { useState } from 'react';
- 最初の
import React, { useState } from 'react';
は「React」というツールと、その中のuseState
という便利な機能を使うための準備です。これで、Reactの仕組みを使ってカウンターを作れるようになります。 - 名称変更不可:
React
とuseState
はReactの組み込み機能であり、名前を変えることはできません。
- 最初の
function Counter() { ... }
- function Counter() { ... }は「Counter」という名前のカウンターを作るための「設計図」です。この設計図の中で、カウンターの仕組みや見た目を決めます。
- 名称変更可:
Counter
はユーザーが自由に変更可能です。
const [count, setCount] = useState(0);
const
は、「この入れ物(変数)に一度だけ名前をつけて、その名前は変えられないよ!」というルールをつける言葉です。setCount
はcount
の数字を変えるためのスイッチです。ボタンを押したときにsetCount
を使って、count
に新しい数字を入れます。useState
は、Reactで変わるデータ(状態)を管理するための機能です。ボタンを押すと数字が増えるなど、データが変わるたびに画面を自動で更新する仕組みを作れます。- 名称変更可:
count
とsetCount
はユーザーが自由に名前を付けられますが、useState
は名称変更不可の組み込みです。
return ( ... )
return
の中には、このコンポーネントがレンダリング(表示)する内容が含まれています。<div>
タグ内にカウンターの値とボタンを配置しています。(return
の中に、実際に画面に見えるものを配置している)- 名称変更不可:
return
はJavaScriptのキーワードで、名称変更不可です。
<p>Count: {count}</p>
- ここでは
count
の現在の値を表示しています。{}
内に変数を記述することで、JSX(JavaScript XML)内でその値が展開されます。(※JSX:JavaScriptの中にHTMLみたいな見た目のコードを書くための仕組み) - 名称変更可:
count
は上記で定義した変数のため、変更可能ですが、<p>
や{}
は名称変更不可のHTMLタグやJSX構文です。
- ここでは
<button onClick={() => setCount(count + 1)}>Increment</button>
<button>
タグはボタンの要素です。onClick
はボタンがクリックされた時に実行されるイベントハンドラです。ここでは無名関数() => setCount(count + 1)
がonClick
に設定されています。- この関数は、ボタンをクリックするたびに
setCount(count + 1)
が実行され、count
の値が1ずつ増加します。 - 名称変更不可:
onClick
は組み込みのイベントプロパティで変更不可ですが、count
やsetCount
は上記で説明したように自由に変更可能です。
まとめ
このコードは、画面に「Count: 数字」が表示され、その下に「Increment(増やす)」ボタンが出ます。このボタンを押すとcount
が1増え、数字が変わります。ReactとuseState
を使うことで、数字が変わったら自動で画面が更新される仕組みになっています。
Vue.jsの状態管理
Vue.jsでは、コンポーネントの状態を管理するためにdata
オプションを使います。data
オプションは、コンポーネントのデータ(状態)を定義し、コンポーネント内で動的に利用できるようにします。状態が変わると、それに応じて画面も自動で更新されます。
<template>
<div>
<p>Count: {{ count }}</p>
<button @click="increment">Increment</button>
</div>
</template>
<script>
export default {
data() {
return {
count: 0, // 初期値
};
},
methods: {
increment() {
this.count += 1; // countの値を1増やす
},
},
};
</script>
コードの詳しい解説
このコードの機能は、reactの状態管理でやったコードと同じです。
1. data()
data
は、Vue.jsコンポーネントの状態(データ)を管理するために使います。このdata
オプションは、関数として定義し、オブジェクトを返す形で書きます。戻されたオブジェクトがコンポーネントの状態として使われます。- この例では、
count
という状態が定義され、初期値は0
です。 - 名称変更不可:
data
はVue.jsで状態を管理するための決まり文句です。この名前は変えられませんが、count
の部分は自由に変えられます。
2. methods
methods
は、コンポーネント内で使える関数を定義するためのオプションです。この例では、increment
という関数を作成し、count
の値を1ずつ増やしています。this.count
と書くことで、このコンポーネントのcount
にアクセスして更新することができます。- 名称変更不可:
methods
はVue.jsの定義のため、変更できませんが、increment
という関数名は自由に変えられます。
3. <template>...</template>
<template>
タグの中に、画面に表示されるHTML要素が書かれています。<p>Count: {{ count }}</p>
で、現在のcount
の値を表示します。{{ count }}
はVue.jsのテンプレート構文で、count
の値がここに表示されます。<button @click="increment">Increment</button>
はボタン要素で、クリックされるとincrement
関数が呼び出され、count
が増えます。- 名称変更不可:
<template>
,<p>
,<button>
などのHTMLタグや、@click
ディレクティブはVue.jsの構文のため、名称を変更することはできません。
4. Vue.jsのリアクティブな仕組み
- Vue.jsでは、
data
で定義した変数はリアクティブ(反応的)であり、count
が変更されると、自動的に画面も更新されます。
機能の比較(ReactとVue.jsの状態管理)
- 状態の管理
- React:
useState
フックを使って、count
という状態とsetCount
という更新関数を管理します。 - Vue.js:
data
オプションでcount
を状態として定義し、this.count
を使って状態を更新します。
- React:
- ボタンのクリックで数値を増やす
- React:
onClick
イベントでsetCount(count + 1)
を呼び出して、カウントを増やします。 - Vue.js:
@click
ディレクティブでincrement
メソッドを呼び出し、count
を増やします。
- React:
- 画面の自動更新
- React:
useState
によって状態が変わると、Reactが自動で再描画(再レンダリング)します。 - Vue.js:Vue.jsもリアクティブシステムによって、
count
が変わると画面が自動で更新されます。
- React:
主な違い
- 状態の定義方法:Reactは
useState
を使い、Vue.jsはdata
オプションを使います。 - イベントの設定方法:Reactでは
onClick
、Vue.jsでは@click
を使います。
これらの違いはありますが、機能としては同じ「ボタンを押すと数字が1ずつ増えるカウンター」を作っています。
Vue.jsのcomputedプロパティ
computedプロパティは、Vue.jsでデータを自動的に計算するための仕組みです。あるデータに基づいて別のデータを作りたいときに使います。例えば、count
の2倍の値を表示したいときに便利です。
※Vue.jsのcomputedプロパティは組み込みのプロパティであり、名称変更はできません。
<template>
<div>
<p>Count: {{ count }}</p>
<p>Double Count: {{ doubleCount }}</p>
<button @click="increment">Increment</button>
</div>
</template>
<script>
export default {
data() {
return {
count: 0,
};
},
computed: {
doubleCount() {
return this.count * 2; // countの2倍を計算
},
},
methods: {
increment() {
this.count += 1;
},
},
};
</script>
この例では、count
が1増えるたびに、doubleCount
(2倍の数)も自動で計算されて表示されます。
・count
:ボタンを押すたびに1ずつ増える数。<p>Count: {{ count }}</p>
で表示されています。
・doubleCount
:count
の2倍の数を計算して表示します。<p>Double Count: {{ doubleCount }}</p>
で表示されています。
Vue.jsのcomputedプロパティは、Excelのセル参照に近い使い方ができます。一度computed
で計算した値(たとえばdoubleCount
)を作っておけば、他の場所で使いたいときにdoubleCount
と書くだけで、自動で計算してくれますし、count
が変わったときだけ再計算してくれるのです。
たとえば、count * 2
という計算をそのまま書いた場合、count
が変わるたびにVue.jsは画面を更新するときに毎回この計算を実行します。Vue.jsのcomputed
プロパティを使えば、一度計算した結果を覚えておき、count
が変わったときだけ再計算します。これにより、無駄な計算を減らして効率的になるのです。(プログラムが何度も計算することを避けられるという意味)
ReactでもuseMemoを使えば、Vue.jsのcomputedプロパティと同じようなことができる。ReactではuseMemo
フックや関数を使う必要があるため、Vue.jsのcomputed
に比べて少しコードが増える。計算やデータの再利用が多いプロジェクトではVue.jsが便利。
Reactのデータバインディング
ReactはJSX内で直接データを埋め込みます。入力フォームでのデータ管理にはvalue
プロパティとイベントハンドラを使います。(※イベントハンドラとは、ボタンを押したり、画面をクリックしたときに何かが起こるようにする仕組みです→イベントハンドラは、まるでスイッチみたいなものです。スイッチを押すと電気がつくように、「ボタンを押したらこうしてね!」という動きをプログラムが覚えてくれます)
import React, { useState } from 'react';
function TextInput() {
const [message, setMessage] = useState('');
return (
<div>
<input
type="text"
value={message}
onChange={(e) => setMessage(e.target.value)}
placeholder="Type something"
/>
<p>Message: {message}</p>
</div>
);
}
import React, { useState } from 'react';
- Reactと、
useState
という機能を使うための準備です。 - Reactは、Facebookが開発した、ユーザーインターフェース(UI)を作るためのJavaScriptライブラリです。
- useStateは、Reactで「状態」を管理するための機能(フック)です。
- 名称変更不可:
React
やuseState
はReactの組み込みのため、名前を変えることはできません。
- Reactと、
function TextInput() { ... }
TextInput
というコンポーネント(部品)を作っています。ここで書いたものが画面に表示される内容になります。- 名称変更可:
TextInput
は自分で自由に名前を変えられます。
const [message, setMessage] = useState('');
- ここで
message
という状態(変わるデータ)と、状態を変えるためのsetMessage
という関数を宣言しています。最初は空っぽの文字列(''
)がmessage
にセットされます。 - 名称変更可:
message
とsetMessage
は自由に名前を変えられますが、useState
は組み込みのため変更不可です。
- ここで
<input ... />
- ここでは、ユーザーが文字を入力できるテキストボックスを作っています。
type="text"
でテキスト入力用に設定し、value={message}
でmessage
の値を表示しています。onChange
イベントハンドラ:ユーザーが文字を入力するたびにonChange
が動き、(e) => setMessage(e.target.value)
が実行されて、message
の値がリアルタイムで更新されます。ここでいうe.target.value
は、テキストボックスに入力された文字を表しています。- 名称変更不可:
type
,value
,onChange
,placeholder
などはHTMLやReactで決まったもののため、名前を変えることはできません。
<p>Message: {message}</p>
- ここで
message
の内容を表示しています。{message}
と書くことで、message
の値がそのまま表示されます。 - ユーザーがテキストボックスに文字を入力すると、
message
も更新され、その内容がここにリアルタイムで反映されます。 - 名称変更不可:
<p>
や{}
は構文として変更できませんが、message
の部分は変更可能です。
- ここで
このコードの働き
- ユーザーがテキストボックスに文字を入力すると、
message
にその文字が保存されます。 message
が変わるたびに、画面に表示される「Message: ...」の部分もリアルタイムで更新されます。
Vue.jsのデータバインディング
Vue.jsはテンプレートエンジンを使っており、{{変数名}}
と書くだけでHTMLにデータが表示されます。v-bind
やv-model
ディレクティブもバインディングに使え、v-model
はフォーム入力とデータを双方向にバインドする際に便利です。
<template>
<input v-model="message" placeholder="Type something"/>
<p>Message: {{ message }}</p>
</template>
<script>
export default {
data() {
return {
message: '',
};
},
};
</script>
コードの詳しい解説
<template>
- ここに、画面に表示されるHTMLの内容を記述します。
※Vue.jsの<template>
部分は、HTMLでいう<body>
の部分に相当します。
- ここに、画面に表示されるHTMLの内容を記述します。
<input v-model="message" placeholder="Type something"/>
<input>
は、ユーザーが文字を入力できるテキストボックスです。v-model="message"
:双方向データバインディングを使っています。入力した内容がmessage
に自動で保存され、message
が変わると入力ボックスにもすぐに反映されます。placeholder="Type something"
:テキストボックスに「Type something」という薄い文字を表示し、ユーザーが何か入力できることを示します。
<p>Message: {{ message }}</p>
<p>
タグの中でmessage
の内容を表示しています。{{ message }}
:Vue.jsのテンプレート構文を使い、message
の値がリアルタイムで表示されるようにしています。
※一重の中括弧({}
)だとJavaScriptのオブジェクトや配列に使う表記と区別がつきにくくなってしまうため、Vue.jsでは二重中括弧を使って特別な「Vueのデータですよ!」と示しています
<script>
- Vue.jsのデータやメソッドなど、アプリの動作部分を記述します。
data()
- Vue.jsのデータ管理のためのオプションです。この例では
message
というデータを定義しており、最初は空(''
)です。 - message:ユーザーが入力した文字がリアルタイムで保存される場所です。
v-model
でmessage
にデータをバインド(つなげる)しているので、入力が変わるとmessage
も自動で更新されます。
- Vue.jsのデータ管理のためのオプションです。この例では
このコードの働き
- ユーザーがテキストボックスに文字を入力すると、
message
にその文字が保存されます。 message
が変わると、<p>Message: {{ message }}</p>
の部分が自動で更新され、入力内容がリアルタイムで表示されます。
このように、Vue.jsのv-model
を使うことで、テキストボックスと表示されるメッセージが簡単に連動するようになっています。
働きの比較
- Reactのコード:
useState
でmessage
の状態を管理し、onChange
イベントでユーザーが入力した文字をmessage
に保存しました。- Reactでは
onChange
イベントとuseState
を使って、入力内容と表示を連動させました。
- Vue.jsのコード:
v-model
を使ってmessage
を直接データバインディングしています。v-model
により、ユーザーが入力した文字が自動でmessage
に保存され、リアルタイムで画面に反映されます。
簡単な違い
- React:
useState
とonChange
で入力内容と表示を連動させます。 - Vue.js:
v-model
だけで自動的に入力内容と表示が連動します。
結果として、どちらも「テキストボックスに入力した内容が下にリアルタイムで表示される」という同じ動作をしていますが、Vue.jsはv-model
でより簡単にデータバインディングを実現している点が特徴です。
ユーザーインタラクション(捕捉)
ユーザーインタラクションとは、ユーザーがウェブページやアプリを使って何か操作したときに、その操作に応じて画面が変化する仕組みのことです。たとえば、ボタンを押したり、入力ボックスに文字を入力したりすることが「ユーザーインタラクション」にあたります。
よくあるユーザーインタラクションの例
- ボタンをクリックする
- たとえば「いいね!」ボタンを押すと、ボタンが青くなり、カウントが増えるなど。
- ReactやVue.jsでは、ボタンのクリックに応じて状態が変わる処理を書きます。
- 文字を入力する
- ユーザーが入力した内容がすぐに画面に反映されるようにしたり、入力内容によってエラー表示が出るようにしたりするのもユーザーインタラクションです。
- マウスを重ねる
- リンクにマウスを重ねたときに文字が強調されたり、画像が大きく表示されたりすることもインタラクションの一つです。
- スクロールする
- ページをスクロールすると新しいコンテンツが読み込まれたり、スクロールの位置によってアニメーションが動いたりすることもユーザーインタラクションに含まれます。
ReactとVue.jsでのユーザーインタラクション
- Reactでは、ボタンのクリックなどに
onClick
のようなイベントハンドラを設定して、ユーザーが操作したときに特定の関数が動くようにします。 - Vue.jsでは、
@click
や@input
などのイベントディレクティブを使って、ユーザーの操作に反応します。
まとめ
ユーザーインタラクションは、ユーザーが何か操作をしたときに、それに応じて画面が変わる仕組みです。これがあることで、ウェブサイトやアプリが動的に感じられ、使いやすくなります。
1~4のイベント処理をReactとVue.jsそれぞれで簡単に紹介
① ボタンをクリックする
- React:
onClick
<button onClick={() => console.log("ボタンがクリックされました")}>クリック</button>
- Vue.js:
@click
<button @click="() => console.log('ボタンがクリックされました')">クリック</button>
② 文字を入力する
- React:
onChange
<input type="text" onChange={(e) => console.log("入力:", e.target.value)} />
- Vue.js:
@input
(※v-modelを使って双方向にデータを結びつけることも可)
<input type="text" @input="(e) => console.log('入力:', e.target.value)" />
<input v-model="message" /> <p>{{ message }}</p>
③ マウスを重ねる
- React:
onMouseEnter
またはonMouseOver
<div onMouseEnter={() => console.log("マウスが重なりました")}>ここにマウスを重ねてください</div>
- Vue.js:
@mouseenter
または@mouseover
<div @mouseenter="() => console.log('マウスが重なりました')">ここにマウスを重ねてください</div>
④ スクロールする
- React:
onScroll
<div onScroll={() => console.log("スクロール中です")}>スクロールしてください</div>
- Vue.js:
@scroll
<div @scroll="() => console.log('スクロール中です')">スクロールしてください</div>
追加のポイント(捕捉)
1. イベントハンドラの概要
ReactとVue.jsのどちらも、**ユーザーの操作(イベント)**に対して画面の動きを設定するための仕組みを持っています。
2. 補足ポイント
- イベントの追加方法:
- React:
onClick
やonChange
などのイベント名をキャメルケース(onClickなど)
で指定します。イベントに関数を渡し、その関数がユーザーの操作に反応して実行されます。 - Vue.js:
v-on
ディレクティブを使いますが、@
記号で省略して書くこともできます。例えば、@click
や@input
のように設定します。
- React:
- 複数イベントの処理:
- React:複数のイベントを使いたい場合は、異なるイベントハンドラをコンポーネント内で別々に設定します。
- Vue.js:
methods
オプション内に複数のメソッドを定義し、それぞれのイベントに対して@イベント名="メソッド名"
と設定することで簡単に処理できます。
3. 条件付きイベント(イベントの有効化・無効化)
どちらも、条件に応じてイベントの動作をコントロールすることが可能です。たとえば、ボタンがクリックできる条件を状態に応じて変えたい場合、以下のように設定します。
- React:
disabled
属性に状態を条件として指定し、onClick
イベントもその条件に応じて実行するか判断します。 - Vue.js:ボタンに
disabled
や@click
を条件に応じて設定できます。
簡潔さ重視か、柔軟性重視か
- React:柔軟なJavaScript関数を使って複雑な処理を行いやすく、条件分岐や複数のイベントを組み合わせた使い方も容易です。
- Vue.js:イベントハンドラが簡潔で、初心者にも分かりやすいです。双方向データバインディングが強力で、特にリアルタイムでデータを更新する場合に便利です。
本日の感想
コードを100%理解しながら学習している訳ではないので知識の消化不良を起こしてしまっている状態です。でもAIはこの学習を勧めているので、その通りにどんどん進めたいと思います。この学習のゴールにいる自分を想像できないまま突き進んでいるので不安ですが、AIの言うとおりに学習したらどうなるかという実験も兼ねているので、このまま全力で突き進みます。
21日目の記事はこちら
React、Vue.jsについて 21日目 2024/10/27(お金持ちまでの道のり)
25-26日目の記事はこちら
SPA(Single Page Application)について 25-26日目 2024/10/31-11/1(お金持ちまでの道のり)
ここに初めて来た人はゼヒ0日目を読んでください。プログラミング知識0のおじさんがお金持ちになるまでのプランと熱い思いが載っています。私と一緒に運要素を排除したゴリゴリの脳筋プレイでお金持ちを目指しませんか?
0日目の記事はこちら
お金持ちまでの道のり:0日目
コードの読み方が全く分からないという方は以下の記事がオススメです。コードの読み方の説明が一番詳しく書かれてある記事です。
ToDoリストアプリの作成 12-15日目 2024/10/18-21(お金持ちまでの道のり)
コメント