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

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

新規登録して質問してみよう
ただいま回答率
85.44%
React.js

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

Q&A

解決済

2回答

785閲覧

【React】モーダル画面で選択肢を選んだ後、ホーム画面に戻ってその内容を反映させるための書き方を教えてください。

echizeyayota

総合スコア106

React.js

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

0グッド

0クリップ

投稿2023/06/26 10:13

お世話になっています。
下記の質問についてご教示を願います。

【質問の主旨】

ReactとDeepLのAPIを使って翻訳アプリを作っています。ホーム画面(App.js)でピンク色で囲っているTextBoxコンポーネントをクリックするとモーダル画面(Modal.js)に移動して、翻訳の対象となる原文の言語を選べる仕組みになっています。

(ホーム画面)

イメージ説明

このモーダル画面で選んだ言語が、ホーム画面で反映されるようようにするためには、App.jsをどのように書き換えれば良いでしょうか?

(モーダル画面)

イメージ説明

【質問の補足】

ここまで自分が作成したApp.js と Modal.jsのコードは以下の通りです。

1. App.js

import TextBox from "./components/TextBox"; import Arrows from "./components/Arrows"; import Button from "./components/Button"; import Modal from "./components/Modal"; import { useState } from "react"; const App = () => { const [showModal, setShowModal] = useState(null); const [inputLanguage, setInputLanguage] = useState("EN"); const [outputLanguage, setOutputLanguage] = useState("JA"); const handleClick = () => { setInputLanguage(outputLanguage); setOutputLanguage(inputLanguage); } return ( <div className="app"> {!showModal && <> <TextBox selectedLanguage={inputLanguage} style="input" setShowModal={setShowModal} /> <div className="arrow-container" onClick={handleClick}> <Arrows /> </div> <TextBox selectedLanguage={outputLanguage} style="output" setShowModal={setShowModal} /> </>} {showModal && <Modal setShowModal={setShowModal} chosenLanguage={showModal === "input" ? inputLanguage : outputLanguage} setChosenLanguage={showModal === "input" ? setInputLanguage : setOutputLanguage} />} </div> ); } export default App;

2. Modal.js

import { useState } from "react"; const Modal = ({ setShowModal, chosenLanguage, setChosenLanguage }) => { const [selectedOption, setSelectedOption] = useState(""); const handleSelectedChange = (e) => { setSelectedOption(e.target.value); } console.log(selectedOption); return ( <div className="option-list"> <div className="search-bar"> <select className="source-language" value={selectedOption} onChange={handleSelectedChange} > <option value="BG">BG</option> <option value="CS">CS</option> <option value="DA">DA</option> <option value="DE">DE</option> <option value="EL">EL</option> <option value="EN">EN</option> <option value="ES">ES</option> <option value="ET">ET</option> <option value="FI">FI</option> <option value="FR">FR</option> <option value="HU">HU</option> <option value="ID">ID</option> <option value="IT">IT</option> <option value="JA">JA</option> <option value="KO">KO</option> <option value="LT">LT</option> <option value="LV">LV</option> <option value="NB">NB</option> <option value="NL">NL</option> <option value="PL">PL</option> <option value="PT">PT</option> <option value="RO">RO</option> <option value="RU">RU</option> <option value="SK">SK</option> </select> <div className="close-button" onClick={() => setShowModal(null)}> <svg focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" > <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"></path> </svg> </div> </div> </div> ) } export default Modal;

以上、よろしくお願い申し上げます。

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

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

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

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

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

guest

回答2

0

ベストアンサー

components/Modal.js 側では useStateによって選択された言語をステートとして持つのは不要かと思われますので、以下の修正でいかがでしょうか?

diff

1-import { useState } from "react"; 2- 3 const Modal = ({ setShowModal, chosenLanguage, setChosenLanguage }) => { 4- 5- const [selectedOption, setSelectedOption] = useState(""); 6- 7 const handleSelectedChange = (e) => { 8- setSelectedOption(e.target.value); 9+ setChosenLanguage(e.target.value); 10+ setShowModal(null); 11 } 12 13- console.log(selectedOption); 14- 15 return ( 16 <div className="option-list"> 17 <div className="search-bar"> 18 <select 19 className="source-language" 20- value={selectedOption} 21+ value={chosenLanguage} 22 onChange={handleSelectedChange} 23 > 24 <option value="BG">BG</option>

参考までに以下はModal.js を上記のように修正してみたサンプルです。

(※ Button, Arrows, TextBox は質問にコードが無かったので当方で適当なダミーを作りました。)

投稿2023/06/26 17:27

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

echizeyayota

2023/06/27 06:17

bataille910 さん アドバイスありがとうございます。 ご提案いただいたコードの通り自分のコードを修正すると、意図通りの動作をするようになりました。 大変助かります。今後ともどうぞよろしくお願いします。
guest

0

この回答はGPT-4による自動生成回答です

Modal.jshandleSelectedChange 関数内で、選択された言語を親コンポーネント(App.js)に渡すように変更しましょう。そのために、setChosenLanguage を呼び出します。

1. Modal.js の変更

javascript

1const handleSelectedChange = (e) => { 2 setSelectedOption(e.target.value); 3 setChosenLanguage(e.target.value); // この行を追加 4}

これで、モーダル画面で選択された言語が App.jsinputLanguage または outputLanguage に反映されるようになります。

2. App.js の変更

App.js には変更は不要です。Modal.js の変更により、選択された言語が inputLanguage または outputLanguage に反映されるようになりました。

これで、モーダル画面で選択した言語がホーム画面に反映されるようになります。

投稿2023/06/26 10:14

teratail-ai

Powered by GPT-4

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

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

echizeyayota

2023/06/26 10:26

ご回答ありがとうございます。 handleSelectedChange 関数内にsetChosenLanguage(e.target.value)を加えました。 ですがこれだけではモーダル画面からホーム画面に自動で遷移して、モーダル画面で選択した言語をホーム画面で確認することができません。 モーダル画面で選択した言語をホーム画面で確認できるようにするまでは、Modal.js(場合によってはApp.jsも)をどのように書き換えれば良いでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問