React Hooks useState
48714 ワード
useStateバー
useStateは関数にstateを提供します.パラメータinitialstateを受信し、ステータスとステータスを変更するsetState関数を返します.
前提はreactクラスを作成し、setState()とpropsの使用方法を理解することです.
最初の例から始めます.
簡単なuseState-Counterの例
import React, { Component } from 'react'
class CounterClass extends Component {
state = {
count: 0
}
incrementCount = () => {
this.setState({
count: this.state.count + 1
})
}
render() {
const { count } = this.state
return (
<div>
<button onClick={this.incrementCount}>Count {count}</button>
</div>
)
}
}
export default CounterClass
これらのカウンタを作成するには、3つのステップに分けられます.
次に、関数構成部品とステータスフックを使用します.
import React, { useState } from 'react'
function HookCounter() {
const [count, setCount] = useState(0)
return (
<div>
<button onClick={() => {
setCount(count + 1)
}}>Count {count}</button>
</div>
)
}
export default HookCounter
効果はクラス構成部品と同じです.useStateの使い方を見てみましょう.
const [state, setState] = useState(initialState)
このコード行は、更新ステータスのステータスと関数を返します.
初期レンダリング中に返される状態は、渡された最初のパラメータ(initialstate)と同じ値です.
setState関数は、ステータスを更新するために使用されます.新しいステート値を受け取り、コンポーネントの再レンダリングをキューに配置します.
Hooks使用規則
useState with Previous State
このセクションでは、以前のステータスの使用方法について説明します.ステータス値が古いステータス値に依存する場合は、古いステータスが使用されます.
カウンタの例で+1または-1ボタンを追加
import React, { useState } from 'react'
function HookCounter() {
const initialCount = 0
const [count, setCount] = useState(initialCount)
return (
<div>
Count: {count}
<button onClick={() => {
setCount(initialCount)
}}>Reset</button>
<button onClick={() => {
setCount(count + 1)
}}> + 1 </button>
<button onClick={() => {
setCount(count - 1)
}}> - 1 </button>
</div>
)
}
export default HookCounter
効果は大丈夫そうですが、これでは安全ではありません!これはカウンタを変更する正しい方法ではありません.理由を教えてあげよう
上記の例では、1つのボタンと5つのボタンを追加するたびに
import React, { useState } from 'react'
function HookCounter() {
const initialCount = 0
const [count, setCount] = useState(initialCount)
+ const increment5 = () => {
+ for (let i = 0; i < 5; i++) {
+ setCount(count + 1)
+ }
+ }
return (
<div>
Count: {count}
<button onClick={() => {
setCount(initialCount)
}}>Reset</button>
<button onClick={() => {
setCount(count + 1)
}}> + 1 </button>
<button onClick={() => {
setCount(count - 1)
}}> - 1 </button>
+ <button onClick={increment5}> + 5 </button>
</div>
)
}
export default HookCounter
+5をクリックして1つだけ追加します.これはsetCountメソッドが非同期で即時応答と更新を行うことができず,一度に複数回送信されたカウントは依然として以前の値であり,更新されていないためである.
コードは以下のように変更してください.
import React, { useState } from 'react'
function HookCounter() {
const initialCount = 0
const [count, setCount] = useState(initialCount)
const increment5 = () => {
for (let i = 0; i < 5; i++) {
+ setCount(prevCount => prevCount + 1)
}
}
return (
<div>
Count: {count}
<button onClick={() => {
setCount(initialCount)
}}>Reset</button>
<button onClick={() => {
setCount(count + 1)
}}> + 1 </button>
<button onClick={() => {
setCount(count - 1)
}}> - 1 </button>
<button onClick={increment5}> + 5 </button>
</div>
)
}
export default HookCounter
前の状態を使用するには、関数を使用して値を渡し、変更後に新しい値を返す必要があります.
+ 1``-1
の関数も変更されます.改善されたコードは次のとおりです.import React, { useState } from 'react'
function HookCounter() {
const initialCount = 0
const [count, setCount] = useState(initialCount)
const increment5 = () => {
for (let i = 0; i < 5; i++) {
setCount(prevCount => prevCount + 1)
}
}
return (
<div>
Count: {count}
<button onClick={() => {
setCount(initialCount)
}}>Reset</button>
<button onClick={() => {
setCount(prevCount => prevCount + 1)
}}> + 1 </button>
<button onClick={() => {
setCount(prevCount => prevCount - 1)
}}> - 1 </button>
<button onClick={increment5}> + 5 </button>
</div>
)
}
export default HookCounter
整理する
previousStateを使用する場合は、setter関数を使用してsetStateメソッドにパラメータを渡します.正しい以前の状態を特定するために.
再レンダリング時に、ユーザ状態が返す最初の値は、常に更新後に最新の値になります.
useState with Object
useStateのステータスがオブジェクトの場合、setStateを呼び出すときに注意しなければならない点がいくつかあります.ユーザー・ステータスは、オブジェクトを自動的にマージおよび更新しません.展開演算子と結合した関数setStateを使用して、オブジェクトをマージおよび更新できます.
エラー例firstName&lastName
HookCounter.tsx
import React, { useState } from 'react'
function HookCounter() {
const [name, setName] = useState({
firstName: '',
lastName: ''
})
return (
<form>
<input
type="text"
value={name.firstName}
onChange={e => {
setName({
firstName: e.target.value
})
}}
/>
<input
type="text"
value={name.lastName}
onChange={e => {
setName({
lastName: e.target.value
})
}}
/>
<h2>Your first name is {name.firstName}</h2>
<h2>Your last name is {name.lastName}</h2>
</form>
)
}
export default HookCounter
タグを入力したonChangeでsetNameを設定するたびに、オブジェクトの1つのプロパティのみが操作されます.firstNameに値を指定した場合にのみlastNameプロパティが消えます.これは誤った作成方法です.tsxを使用してコンポーネントを作成したため、コンパイラはエラーを直接報告します.
コンソールウィンドウを表示します.
集計オブジェクトの手動変更
拡散演算子を使用してこのオブジェクトの問題を解決するには
import React, { useState } from 'react'
function HookCounter() {
const [name, setName] = useState({
firstName: '',
lastName: ''
})
return (
<form>
<input
type="text"
value={name.firstName}
onChange={e => {
setName({
...name,
firstName: e.target.value
})
}}
/>
<input
type="text"
value={name.lastName}
onChange={e => {
setName({
...name,
lastName: e.target.value
})
}}
/>
<h2>Your first name is {name.firstName}</h2>
<h2>Your last name is {name.lastName}</h2>
<h2>{JSON.stringify(name)}</h2>
</form>
)
}
export default HookCounter
整理する
state hooksでオブジェクトを操作する場合、オブジェクトのプロパティは自動的にマージされませんので、手動でマージする必要があります.スプレッドシート演算子を使用できます.
useState with Array
目次
ボタンをクリックして、1~10の任意の数値をリストに追加します.
UseStateWithArray.tsx
import React, { useState } from 'react'
interface ItemType {
id: number
value: number
}
function UseStateWithArray() {
const [items, setItems] = useState<ItemType[]>([])
const addItem = () => {
setItems([
...items,
{
id: items.length,
value: Math.ceil(Math.random() * 10)
}
])
}
return (
<div>
<button onClick={addItem}>add a number</button>
<ul>
{
items.length > 0 && items.map((item: ItemType) => (
<li key={item.id}>{item.value}</li>
))
}
</ul>
</div>
)
}
export default UseStateWithArray
整理するhooksでは、Type Scriptの使い方に注意してください.次の文書を参照してください.
useState
これがusStateの用途です.ここには簡単な要約があります.
-機能コンポーネントにステータスを指定します.
-クラスコンポーネントでは、stateはオブジェクトですが、usStateでは、stateはオブジェクトではなく、すべてのタイプであってもよい場合があります.
-userStateは、2つの要素の配列を返します.
-最初はステータスの現在の値です.
-2つ目はステータスのsetterメソッドで、呼び出し時に再レンダリングがトリガーされます.
-現在のステータスが前のステータスに依存している場合は、関数をステータスのsetterメソッドに渡し、パラメータを前のステータスとして入力して新しいステータスを返すことができます.
-オブジェクトと配列の場合、状態の以前の変数は自動的に完了しないため、展開演算子を使用して手動で追加する必要があります.
useStateの学習については、ここで説明します.以下では、useEffectの使用方法について説明します.
Reference
この問題について(React Hooks useState), 我々は、より多くの情報をここで見つけました https://velog.io/@tnsdlf158/React-hooks-useStateテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol