質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

1回答

2962閲覧

React stateの更新がズレる件について

TK.....hasi

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/10/03 06:56

編集2021/10/03 07:03

質問をする上での前提

Reactで実装しています。
textareaに入力されたら入力内容にstateを更新するということをしています。

発生している問題

console.logでstateの値を出力すると、前回の(一つ前に操作したものが出力される)
1→2→3→4→5  という順番でtextareaに入力していく。
出力結果 []→1→12→123→1234→12345
望む出力結果 1→12→123→1234→12345

補足

有識者の方はご存知かと思いますが、useStateの初期値を配列にしているからこの問題が発生しているわけではなさそうです。
調べていたところ、stateの更新は非同期で行われるためリアルタイムで更新されるわけではないとのことでしたが、同じような実装している方は同様の問題に直面している様子がなく質問させていただきます。

該当のソースコード

import React, {useState} from 'react' import { Input } from './components/input'; const App = () => { const [textareaA, setTextAreaA] = useState([]); const onChangeTextArea = (e) => setTextAreaA([e.target.value]) return ( <Input text="textarea" onChange={() => onChangeTextArea} /> ); } export default App; =============================================================================== Input.jsx export const Input = (props) => { const { text, onChange } = props return ( <> <label>{text}</label> <textarea cols="50" rows="20" onChange={onChange()} /> </> ) }

初歩的なことで恐れ入ります。
有識者の方いらっしゃいましたら、ご教授いただけないでしょうか?

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/10/03 07:36

setTextAreaA の直後に console.log(textareaA) したってことですよね。textareaA の値が更新されるのは次にその関数コンポーネントが呼ばれた時です。
退会済みユーザー

退会済みユーザー

2021/10/03 07:56

どこに console.logを入れたのか質問に書いとらんので何とも言えんのやけど、 textareaA を useStateしている行 const [textareaA, setTextAreaA] = useState([]);  の直後で console.log(textareaA); を入れたんやったら、このconsole.log からの出力は [] で始まっても不思議じゃあらへん。 それと、質問の本題とはちゃうけど、 onChange={() => onChangeTextArea} とか onChange={onChange()} とか、このままじゃ動かんやろ?と思える点がちらほらあるのも気になってますぅ。
TK.....hasi

2021/10/03 13:33

hoshi-takanori様 ご回答ありがとうございます。 そうなんですね。 次に関数コンポーネントが呼ばれたときでなく即時更新する方法があれば実現できそうです。 suwmn50799様 失礼いたしました。 console.logを入れた箇所は、setTextAreaA の直後に console.log(textareaA)をしました。 >このままじゃ動かんやろ?と思える点がちらほらあるのも気になってますぅ 私の環境だと問題なく動作しているようです。なぜ動作しないように思えたのでしょうか?
hoshi-takanori

2021/10/03 16:54

即時更新する方法はないというか、set〜 を呼べばすぐにそのコンポーネントは更新されるので、それで問題ないはずというか…。そもそも何がしたいのでしょうか? あと、 onChange={() => onChangeTextArea} と onChange={onChange()} が組み合わさった結果、動くことは動くのですが、自分も最初は「このままじゃ動かんやろ?」と思いました。紛らわしい書き方だと思います。
退会済みユーザー

退会済みユーザー

2021/10/04 11:25

TK.....hasiさん > なぜ動作しないように思えたのでしょうか? onChange={() => onChangeTextArea} と onChange={onChange()} を、それぞれ個別に見たときに、お目にかからないコードだったためです。 hoshi-takanoriさんが > 組み合わさった結果、動くことは動く とおっしゃっている点は確認できました。
guest

回答1

0

https://zenn.dev/syu/articles/3c4aa813b57b8c

こちらの記事と似たような原因ではないでしょうか

投稿2021/10/18 10:22

編集2021/10/18 16:17
tkaaad97

総合スコア64

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問