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

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

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

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

Q&A

解決済

1回答

3060閲覧

React SetStateが即時更新されない仕組みなので、ほかの手段で即時更新する方法をご存知でしょうか

mehul2021

総合スコア2

JavaScript

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

0グッド

0クリップ

投稿2021/08/25 02:19

編集2021/08/25 03:42

前提・実現したいこと

お世話になっております。初歩的なご質問かもしれず、大変恐縮ではございますが、ご質問させていただきます。

実現したいことは、ボタンをクリックしたときに、Material UIのDrawerを開いて、その中のTextFieldのValueに対して、このコンポーネント内で生成するステートをsetStateで外部のコンポーネントから持ってきたデータを入れて、表示したいのですが、

クリックされてこちらのコンポーネントが最初にレンダリングされるときには、setStateでの更新が反映されず、空欄になってしまいます。(Drawerを閉じて、再度クリックすると、反映されます)

SetStateは仕組み上即時更新されないようですので、他の方法がないか色々試しているのですが、上手くいきません。他の方法で即時に反映させる方法をご存知な方はいらっしゃいますでしょうか。

React, Typescriptで書いております

該当のソースコード

typescript

1 2const list = ( 3 anchor: Anchor, 4 localState:any, 5 setLocalState:any, 6 state:any, 7 setState:any, 8 dispatch: any, 9 ) => ( 10 <div 11 role="presentation" 12 > 13 <TextField 14 label="Company Name" 15 type="text" 16 name="potential_name" 17 InputProps={{ inputProps: { min: 0, max: 1000 } }} 18 InputLabelProps={{ 19 shrink: true, 20 }} 21 value={localState.potential_name} // こちらのvalueを最初のレンダリングでも反映させたいと思っております 22 onChange={e => setLocalState({ ...localState, potential_name: e.target.value })}/> 23 </div> 24 ) 25 26type Anchor = 'top' | 'left' | 'bottom' | 'right'; 27 28export default function TemporaryDrawer() { 29 30 const dispatch: AppDispatch = useDispatch() 31 32 const selectedDeal = useSelector(selectSelectedPotentialDeal) 33 34 const [localState, setLocalState] = useState<READ_POTENTIAL_DEAL>({ 35 id: 0, 36 potential_name: '', 37 description: '', 38 }) 39 40 const [state, setState] = React.useState({ 41 top: false, 42 left: false, 43 bottom: false, 44 right: false, 45 }); 46 47 const toggleDrawer = (anchor: Anchor, open: boolean) => 48 ( 49 event: React.KeyboardEvent | React.MouseEvent, 50 ) => 51 { 52 53 if ( 54 event.type === 'keydown' && 55 ((event as React.KeyboardEvent).key === 'Tab' || 56 (event as React.KeyboardEvent).key === 'Shift') 57 ) { 58 return; 59 } 60 setState({ ...state, [anchor]: open }); 61 }; 62 63 const clickHandler = (anchor:Anchor) => { 64 65 setLocalState(selectedDeal) // こちらのsetStateでステートを更新しています 66 setState({ ...state, ['right']: true }) // こちらでDrawerを開きます 67 } 68 69 return ( 70 71 <div> 72 {(['right'] as Anchor[]).map((anchor) => ( 73 <React.Fragment key={anchor}> 74 <Button onClick={() => clickHandler(anchor)} > 75 {anchor} 76 </Button> 77 <Drawer anchor={anchor} open={state[anchor]} onClose={toggleDrawer(anchor, false)}> 78 {list(anchor, localState, setLocalState, state, setState, dispatch, selectedDeal)} 79 </Drawer> 80 </React.Fragment> 81 ))} 82 </div> 83 ); 84} 85 86

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

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

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

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

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

maisumakun

2021/08/25 02:25

> クリックされてこちらのコンポーネントが最初にレンダリングされるときには、setStateでの更新が反映されず、空欄になってしまいます。 どのコンポーネントにどんな値が表示されるはずのものがそうなっていない、ということでしょうか?
mehul2021

2021/08/25 03:35

maisumakunさん、 コメント誠にありがとうございます。 TextFieldの中にある「 value={localState.potential_name}」のvalueに、localStateに格納しているselectedDeal配列のpotential_nameの値が表示されるのですが、最初のレンダリングでは表示されません。 以下の流れでございます - const selectedDeal = useSelector(selectSelectedPotentialDeal) こちらで外部のコンポーネントから配列をselectedDeal に格納 -const [localState, setLocalState] = useState ... こちらでステートを生成して初期化 - <Button onClick={() => clickHandler(anchor)} のボタンをクリックで、const clickHandler = (anchor:Anchor) => { setLocalState(selectedDeal) でステートlocalStateを更新しています。 ここで更新したlocalState(中身はselectedDeal )が表示されるのですが、 最初のこの時点ではステートが更新されないため、TextFieldの中にある「 value={localState.potential_name}」は空欄となります。 setStateは、即時にステート(ここでいうlocalState)を更新しないので、最初のボタンをクリックして1回目のsetLocalState(selectedDeal)では、即時にステートが更新されないので、空欄になってしまいます。 こちらを解決する手段(最初のレンダリングでもlocalStateに更新した情報をいれたい)がないか模索しております。
maisumakun

2021/08/25 03:50

listをコンポーネントではなく単なる関数として扱っていますが、これにはどのような理由がありますか?
mehul2021

2021/08/25 04:08 編集

コメント誠にありがとうございます。 >listをコンポーネントではなく単なる関数として扱っていますが、これにはどのような理由がありますか? こちらはMaterial UIのデモコードをできるだけ変えずに使っているためでございます。(特に理由はございません) listの部分を変更することで、対応できる可能性がございましたら、ご教示いただきたいです。どうぞよろしくお願い致します。
maisumakun

2021/08/25 04:11

すみません、Material UIには詳しくないので、ちょっと追いきれないかもしれないです。
guest

回答1

0

ベストアンサー

localStateuseStateで作った後あたりに、こないな三行

diff

1 const [localState, setLocalState] = useState<READ_POTENTIAL_DEAL>({ 2 id: 0, 3 potential_name: '', 4 description: '', 5 }) 6 7+ React.useEffect(() => { 8+ setLocalState(selectedDeal); 9+ }, [selectedDeal]);

を追加してみるといけるんちゃう? 何かしら変わると思うで。

ただし、これですべての問題が片付くとは思われへん。とゆうのも、質問にあるコードには

typescript

1{list(anchor, localState, setLocalState, state, setState, dispatch, selectedDeal)}

とあって、list() に7個のパラメータ渡してて、最後のパラメータはselectedDealになっとるけど、list() の定義のほうは

typescript

1const list = ( 2 anchor: Anchor, 3 localState:any, 4 setLocalState:any, 5 state:any, 6 setState:any, 7 dispatch: any, 8 ) => (

になっとって、パラメータは6個で、selectedDeal 受け取らんことになっとるゆうことで、まだいろいろ試行錯誤中のコードゆう気がしてるもんでな。

投稿2021/08/25 06:04

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

mehul2021

2021/08/25 06:45

suwmn50799さん、 コメント誠にありがとうございます。 教えて頂いた3行で、上手く解決いたしました!(最初のレンダリングでもステートの値が更新され、valueに反映されました!) 自分の方でもuseEffectで色々試していたのですが、上手くいっておらず、大変助かりました。教えて頂いた3行を参考に再度useEffectの機能を確認したいと思います。アドバイス誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問