React (2)
7550 ワード
反応状態とイベントの処理
handling Events
reactのすべてのイベントはonで開始され、関数が値として必要です.
次の例ではonClickイベントを使用します.
この場合、JSX内部で匿名関数を使用するよりも、個別定義関数を使用する方が簡潔で良い.function App(){
const clickHandler = () => {
console.log("clicked")
}
return (
<button onClick(clickHandler)>click button</button>
)
}
useState()
function App(){
let title = "title"
const clickHandler=()=>{
title = "update"
}
return(
<>
<div>{title}</div>
<button onClick={clickHandler}>click</button>
</>
)
}
上のコードは、ボタンをクリックしたときにtitle値の表示を変更するコードです.
ただし、ボタンをクリックしても、変更したtitle値ではなく、予想とは異なる既存の「title」値しか表示されません.
このような原因は反応の開始方式にある.
初めて素子を評価すると、素子の変数が変化しても再評価して無視しないので、title変数が変化しても素子は変化しません!!😨
では、反応器に素子を再評価するにはどうすればいいのでしょうか.
useStateを使用します.
useStateを使用して構成部品の内部状態を変更すると、反応器は構成部品を再評価します.
useState:
function App(){
const clickHandler = () => {
console.log("clicked")
}
return (
<button onClick(clickHandler)>click button</button>
)
}
function App(){
let title = "title"
const clickHandler=()=>{
title = "update"
}
return(
<>
<div>{title}</div>
<button onClick={clickHandler}>click</button>
</>
)
}
const [title,setTitle] = useState("title")
useStateを使用してコードを記述する場合(次のコードに示す)、titleを変更するたびにコンポーネントが再評価され、title変更の値が表示されます.function App(){
const [title,setTitle] = useState('title')
const clickHandler = () => {
setTitle('update')
}
return (
<div>{title}</div>
<button onClic={clickHandler}>button</button>
)
}
また、Reactは、変数(ここではtitle)をレンダリングするときにその変数を記憶し、最近更新された値を提供します.複数のステータスの処理
方法複数のuseStateの使用
function App(){
const [title,setTitle] = useState('')
const [amount,setAmount] = useState('')
}
方法userStateの初期値をオブジェクトとして保存
これでstateを保存して複数のstateを同時に保存できます...なお、stateを変更する場合、他のstateも展開演算子でコピーする必要があります.
function App(){
const [userInput,setUserInput] = useState({
title : '',
amount : ''
})
const changeHandler = (event) => {
setUsetInput({...userInput, amount : event.target.value})
}
}
しかしこのように更新すると,更新状態のたびに以前の状態に依存する.ほとんどの場合問題はありませんが、同時に多くのステータスが更新されている場合は問題が発生します.
応答のステータス更新はすぐには発生しないため、エラーのステータスsnapshotに依存する可能性があります.
したがって,上記のコードのように,以前の状態に依存する状態更新については,最も以下のように更新する.
次の図に示すように、応答プログラムは常に最新のステータススナップショットを提供するため、問題は発生しません.
const [userInput,setUserInput] = useState({
title : '',
amount : ''
})
const changeHandler = (event) => {
setUsetInput((prevState)=>{
...prevState , amount : event.target.value
})
子コンポーネントから親コンポーネントへの通信(上向き)
次の図のように、Expense構成部品とNew Expense構成部品のデータ交換は要約できません.
この場合、データを交換するために、共通の親コンポーネントからデータを受信できます!New ExpenseコンポーネントからAppコンポーネントにデータを送信する方法
これは、親コンポーネントから子コンポーネントにデータを送信する方法と似ています.
次のコードに示すように、親コンポーネントAPPからpropsに関数を渡すとよい.
function App (){
const addExpenseHandler = (expenseData) => {
console.log(expenseData)
}
return(
<NewExpense onAddExpense={addExpenseHandler}/>
)
}
そして、サブコンポーネントNewExpenseでpropsとして受信したonAddExpenss関数にパラメータとしてデータを入れることで、サブコンポーネントから親コンポーネントのデータを受信することができます.function NewExpense({onAddExpense}){
const [enteredTitle, setEnteredTitle] = useState('')
const titleChangeHandler = (event) => {
setEnteredTitle(event.target.value)
}
const saveExpenseData = () => {
onAddExpense(enteredTitle)
}
return(
<form onSubmit={saveExpenseData}>
<input type="text" value={enteredTitle} onChange={titleChangeHandler} />
<button type="submit">submit</button>
</from>
)
}
ソース:useStateReference
この問題について(React (2)), 我々は、より多くの情報をここで見つけました https://velog.io/@lsh__97/React-2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol