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

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

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

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

TypeScript

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

React.js

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

Q&A

解決済

1回答

2266閲覧

useContextで取得した値を変更したい

afro097

総合スコア6

JavaScript

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

TypeScript

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

React.js

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

0グッド

0クリップ

投稿2021/03/22 01:42

useContex使ってstate管理・更新したく作成したのですが、
初回は値が変わらなく、2回クリックすると値が変更され無事に処理ができます。

初回に値が変わらない理由としていろいろ探ってみたのですが、
自分では解決できなかったため、どなたかご教授いただけますでしょうか。

context.provider

import React, { useState } from "react"; export const MainModalContext = React.createContext({ mainModalOpen: () => {}, mainModal: false, }); export const subModalContext = React.createContext(false); const ContextProvider: React.FC = (props) => { const [mainModal, setMainModal] = useState(false); const mainModalOpen = () => { setMainModal(true); console.log(mainModal); }; return ( <MainModalContext.Provider value={{ mainModalOpen, mainModal }}> {props.children} </MainModalContext.Provider> ); }; export default ContextProvider;

クリック後modalOpenが実行され、
useContextで取得したmainModalOpen()が実行されます。
※初回false 2回目true

const { mainModalOpen, mainModal } = useContext(MainModalContext); const modalOpen = (id: string) => { console.log(mainModal); mainModalOpen(); setGetPlansId(id); };

初回から値をtrueに変更したいのですが、
どなたかご教授いただけますと幸いです。

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

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

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

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

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

maisumakun

2021/03/22 02:22

「初回false」というのは、setMainModal(true);直後のconsole.log(mainModal);で確認したものでしょうか?
afro097

2021/03/22 03:17

ご質問ありがとうございます。 その通りでございます。 console.log(mainModal);の位置を mainModalOpen();の下に記述しても結果は変わりませんでした。
guest

回答1

0

ベストアンサー

その通りでございます。

setState非同期で実行されますので、直後でconsole.logなどで値を確認しても、変わらないのが正常な動作です。

変化した値で再描画されますので、関数コンポーネントの直下にconsole.logを仕掛けるなどで確認してみましょう。

投稿2021/03/22 03:25

maisumakun

総合スコア145208

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

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

afro097

2021/03/22 13:01

確認したところ直りました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問