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

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

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

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

React.js

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

Q&A

解決済

1回答

3416閲覧

Reactにて、selectを使って画像を変更したいです。

we_puee

総合スコア1

JavaScript

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

React.js

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

0グッド

0クリップ

投稿2020/07/13 16:03

編集2020/07/13 16:06

前提・実現したいこと

reactの練習で、selectを使って人の画像を変更するプログラムを書きたいのですが、エラーが出てしまい、思うようにいきません。
プルダウンで変更すると、以下のようなエラーが出てしまいます。
恐らく、setStateが行われる関数(imgChange)まで、optionのvalueの値が渡っていないのだと思うのですが、、
どなたかアドバイスをご教授頂けないでしょうか。

ちなみにエラーメッセージは同じものが二つ出ています。

発生している問題・エラーメッセージ

Uncaught TypeError: Cannot read property 'value' of undefined at onChange (<anonymous>:49:38) at HTMLUnknownElement.callCallback (react-dom.development.js:182) at Object.invokeGuardedCallbackDev (react-dom.development.js:231) at invokeGuardedCallback (react-dom.development.js:286) at invokeGuardedCallbackAndCatchFirstError (react-dom.development.js:300) at executeDispatch (react-dom.development.js:383) at executeDispatchesInOrder (react-dom.development.js:408) at executeDispatchesAndRelease (react-dom.development.js:3401) at executeDispatchesAndReleaseTopLevel (react-dom.development.js:3410) at forEachAccumulated (react-dom.development.js:3382)

該当のソースコード

<body> <div id="root"></div> <script type="text/babel"> (() => { const pcts = [ "img0のサンプル", "img1のサンプル", "img2のサンプル", "img3のサンプル" ]; function AppHeader(props) { return ( <div> <img src={props.pct} /> <select name="slcGiv" onChange={() => props.imgChange(this.value)}> <option value="0">たけし</option> <option value="1">ももこ</option> <option value="2">ゆうた</option> <option value="3">えみこ</option> </select> </div> ); } class App extends React.Component { constructor() { super(); this.state = { pcts: pcts, pct: "img0のサンプル" }; this.imgChange = this.imgChange.bind(this); } imgChange(num) { const pcts = this.state.pcts.slice(); const pos = num; const pct = pcts[pos] this.setState({ pct: pct }); } render() { return ( <div className="container"> <AppHeader pct={this.state.pct} imgChange={this.imgChange} /> </div> ); } } ReactDOM.render( <App />, document.getElementById('root') ); })(); </script> </body>

試したこと

なにが間違っているのか分からず、手が出ません。

補足情報(FW/ツールのバージョンなど)

react javascript html/css VScode

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは

最小限の修正で済ませるとすれば、select の changeリスナーとして与えている関数を以下のように修正すればよいかと思います。

diff

1- onChange={() => props.imgChange(this.value)} 2+ onChange={evt => props.imgChange(+evt.target.value)}

補足

参考までに、ご質問に挙げられているコードを諸点でリファクタリングした一例も挙げておきます。(画像はdummyimageを使用しています。)

jsx

1const members = [ 2 { name: "たけし", pct: "https://dummyimage.com/100x100/1e00ff/fff.png&text=img0" }, 3 { name: "ももこ", pct: "https://dummyimage.com/100x100/ff0000/fff.png&text=img1" }, 4 { name: "ゆうた", pct: "https://dummyimage.com/100x100/059100/fff.png&text=img2" }, 5 { name: "えみこ", pct: "https://dummyimage.com/100x100/e000e0/fff.png&text=img3" } 6]; 7 8const AppHeader = ({ selectedIndex, onChange }) => ( 9 <div> 10 <img src={members[selectedIndex].pct} /> 11 <select name="slcGiv" onChange={onChange}> 12 {members.map((member, i) => 13 <option key={`member-${i}`} value={i} selected={i === selectedIndex}> 14 {member.name} 15 </option>) 16 } 17 </select> 18 </div> 19); 20 21class App extends React.Component { 22 constructor() { 23 super(); 24 this.state = { selectedIndex: 0 }; 25 } 26 27 handleChange = evt => { 28 this.setState({ selectedIndex: +evt.target.value }); 29 } 30 31 render() { 32 return ( 33 <div className="container"> 34 <AppHeader 35 selectedIndex={this.state.selectedIndex} 36 onChange={this.handleChange} 37 /> 38 </div> 39 ); 40 } 41} 42 43ReactDOM.render( 44 <App />, 45 document.getElementById('root') 46);

投稿2020/07/13 18:53

編集2020/07/13 21:50
jun68ykt

総合スコア9058

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

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

we_puee

2020/07/14 00:58

jun68yktさん、非常に丁寧にご回答いただき、ありがとうございます。無事解決致しました。 私はまだ初学者で、補足で頂いた一例には理解出来ない点も多いのですが、いつかこのような綺麗なコードが書けるように日々頑張りたいと思います。 ありがとうございました。
jun68ykt

2020/07/14 03:19

どういたしまして???? > 無事解決致しました。 とのことでよかったです????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問