🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

React.js

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

Q&A

1回答

2115閲覧

セレクトボックスで選んだ値に対応させた画像を表示させたい

hello_whats_up

総合スコア57

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

React.js

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

1グッド

1クリップ

投稿2019/11/21 03:00

編集2019/11/21 04:28

#解決したいこと
react-selectを用いたセレクトボックスでラベルを選択し、それに対応させた画像を表示させたいのですが、セレクトボックスの値に応じてimagesのstateを変化させたいのですが、やり方が分かりません。
途中までのソースコードは以下のとおりです.

初期状態(何も選択されてないとき)はimagesのvalue:0の値を表示させ、選択されたらそれに対応した画像を表示させたいです。

ここまでで、セレクトボックスで値をせんたくするところまでしかできていないです<img/>タグには適当に値をいれています。
handleChangeselectの中で所望の処理を実装させて適切な値を<img/>のsrcで渡したいです。

よろしくおねがいします。

class UserInfo extends React.Component { constructor(props) { super(props); this.state = { names: [ { value: 1, label: "A" }, { value: 2, label: "B" }, { value: 3, label: "C" }, { value: 4, label: "D" } ], images: [ { value: 0, label: "./images/0.png" }, { value: 1, label: "./images/1.png" }, { value: 2, label: "./images/2.png" }, { value: 3, label: "./images/3.png" }, { value: 4, label: "./images/4.png" } ], userImage: "" }; } handleChangeselect = userImage => { this.setState({ userImage }); }; render() { return ( <div className="User-container"> <div className="photo-and-name"> <img src='./images/o.png' alt="" /> <Select className="select-name" options={this.state.names} styles={{ [styleKeys]: styleFn }} placeholder="ユーザーを選択" onChange={this.handleChangeselect} /> </div> ); } }
suminotablo👍を押しています

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

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

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

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

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

m.ts10806

2019/11/21 03:30

「うまくいきません」だけでは何一つ問題点が伝わりません。「質問するときのヒント」を参照し他者に確実に伝える表現に調整してください
hello_whats_up

2019/11/21 04:12

修正しました。ご指摘ありがとうございます。
Y.H.

2019/11/21 04:14

> 途中までのソースコード > 初期状態(何も選択されてないとき)はimagesのvalue:0の値を表示させ、選択されたらそれに対応した画像を表示させたいです。 このソースコードでは具体的にどこまでできていて何ができていないのですか?
guest

回答1

0

img タグの src 属性に関数を適用させましょう。
まずは関数についてですが、

javascript

1srcImage = imageId => { 2 const image = this.state.images.filter(i => (i.value === imageId))[0] 3 return image.label 4}

とすることで、imagesvalue の値を引数に取り、対応する label を返す関数が出来ました。
あとはタグの部分で呼ぶだけですが、おそらく undefined の時には 0 にしたいのであろうと思うので、
まず、constructorで

javascript

1userImage: 0

としておいて

javascript

1<img src={srcImage(this.state.userImage)} alt="" />

とするのがきれいですかね。

また、すべての画像ファイルが {番号}.png という形式で入っているのであれば、文字列結合で十分なので、images 配列は必要ないかと思います。

投稿2019/11/22 09:10

nerianighthawk

総合スコア544

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

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

hello_whats_up

2019/11/23 06:12

回答ありがとうございます。 現状このように実装しているのですが、画像が変更されません。 おかしい部分をご教示いただきたいです。 ``` mport React from "react"; import Select from "react-select"; import "../css/CurrentUserInfo.css"; const styleKeys = [{ key: "indicatorsContainer" }]; const styleFn = base => ({ ...base, border: "5px solid #bac6d" }); class CurrentUserInfo extends React.Component { constructor(props) { super(props); this.state = { names: [ { value: 0, label: "A" }, { value: 1, label: "B" }, { value: 2, label: "C" }, { value: 3, label: "D" } ], images: [ { value: 0, label: "./images/0.png" }, { value: 1, label: "./images/1.png" }, { value: 2, label: "./images/2.png" }, { value: 3, label: "./images/3.png" }, { value: 4, label: "./images/4.png" } ], userImage: 0 }; } srcImage = imageId => { const image = this.state.images.filter(i => i.value === imageId)[0]; return image.label; }; render() { return ( <div className="User-container"> <div className="photo-and-name"> <img src={this.srcImage(this.state.userImage)} alt="" /> <Select className="select-name" options={this.state.names} styles={{ [styleKeys]: styleFn }} placeholder="ユーザーを選択" onChange={this.srcImage(this.state.userImage)} /> </div> </div> ); } } export default CurrentUserInfo ```
nerianighthawk

2019/11/25 00:34

コメント遅れてしまいすみません。 <Slect> タグの onChage はもともと使っていた handleChange 関数でよかったかと思います。
hello_whats_up

2019/11/25 01:36

返信ありがとうございます。 教えていただいた方法で実装すると、srcImage関数のところで"TypeError: Cannot read property 'label' of undefined"とエラーになるのですが、なぜでしょう?
nerianighthawk

2019/11/25 02:06

srcImage = imageId => { console.log(imageId) const image = this.state.images.filter(i => i.value === imageId)[0]; return image.label; }; のようにして、imageIdの値を確認してもらってもよろしいでしょうか。
hello_whats_up

2019/11/25 03:11

'0'が表示されているようです。
nerianighthawk

2019/11/25 06:12

私の環境で、同様の処理を書くとうまくいくのですが…何度もすみません。 srcImage = imageId => { console.log(this.state.images) const image = this.state.images.filter(i => i.value === imageId)[0]; return image.label; }; の結果を教えていただいてもいいですか?
hello_whats_up

2019/11/25 06:36

お手数おかけして申し訳ないです。 このような結果になりました。 ``` 0: {value: 0, label: "./images/0.png"} 1: {value: 1, label: "./images/1.png"} 2: {value: 2, label: "./images/2.png"} 3: {value: 3, label: "./images/3.png"} 4: {value: 4, label: "./images/4.png"} length: 5 __proto__: Array(0) ```
nerianighthawk

2019/11/25 08:29

こちらも想定通りですね…なぜでしょう…一つ一つ検証したいのですが、 srcImage = imageId => { const image = this.state.images.filter(i => i.value === imageId)[0]; console.log(image) return image.label; }; の結果はどうなっていますか?
hello_whats_up

2019/11/26 01:44

遅くなってしまいすみません。 `undefined`のようです。
nerianighthawk

2019/11/26 02:44

imageIdが文字列として入ってきている可能性がありますかね。 i.value === imageId を i.value == imageId に=を一つ減らしてうまくいくか確認してもらってもいいですか?
hello_whats_up

2019/11/26 03:35 編集

セレクトボックスを変化させてない状態では ``` {value: 0, label: "./images/0.png"} label: "./images/0.png" value: 0 ``` が表示されており、変化させると`undefined`のようです。 先ほどと同じようですね、、、 <Select/>タグのonChangeで引数を取らせないといけなかったりしますか?
nerianighthawk

2019/11/27 01:08

あー、そうですね。 必ずしも引数を取らせなくてもいいのですが、onChangeで指定した関数には引数を指定しない場合はイベントが入ると思います。 なので、値を取得する場合は ``` handleChangeselect = event => { this.setState({ event.target.value }); }; ``` とするか もしくは<Select /> タグで ``` onChange={(e) => this.handleChangeselect(e.target.value)} ``` のように、どこかしらで、target.value を参照してあげる必要がある気がします。
hello_whats_up

2019/12/05 08:03

画像を、create-react-appでapp生成時のpublicフォルダ内に保存してるのが原因かなとも考えたので、src内にimgフォルダを作って見たりもしたのですが、これだと画像も表示できませんでした。 これは関係ないのでしょうか??
nerianighthawk

2019/12/05 08:56

そこは関係ないと思います。 すみません、 ``` handleChangeselect = event => { this.setState({ event.target.value }); }; ``` と書いていますが、 ``` handleChangeselect = event => { this.setState({ userImage: event.target.value }); }; ``` ですね。 これでうまく行ってほしいのですが…
hello_whats_up

2019/12/05 14:05 編集

TypeError: Cannot read property 'value' of undefined プルダウンで選択すると上のエラーが出てしまいます。 現在のコードがこれです。 画像はpublic/images/*.png から参照しています。 何が原因でだめなのかさっぱり、、、 ``` import React from "react"; import Select from "react-select"; import "../css/CurrentUserInfo.css"; class CurrentUserInfo extends React.Component { constructor(props) { super(props); this.state = { names: [ { value: 0, label: A" }, { value: 1, label: "B" }, { value: 2, label: "C" }, { value: 3, label: "D" } ], images: [ { value: 0, label: "./images/0.png" }, { value: 1, label: "./images/1.png" }, { value: 2, label: "./images/2.png" }, { value: 3, label: "./images/3.png" }, { value: 4, label: "./images/4.png" } ], userImage: 0 }; this.handleChangeSelect = this.handleChangeSelect.bind(this); } handleChangeSelect = event => { this.setState({ userImage: event.target.value }); }; srcImage = imageId => { const image = this.state.images.filter(i => i.value === imageId)[0]; return image.label; }; render() { return ( <div className="User-container"> <div className="photo-and-name"> <img src={this.srcImage(this.state.userImage)} alt="" /> <Select className="select-name" options={this.state.names} styles={{ [styleKeys]: styleFn }} placeholder="ユーザーを選択" onChange={this.handleChangeSelect} /> </div> </div> ); } } const styleKeys = [{ key: "indicatorsContainer" }]; const styleFn = base => ({ ...base, border: "5px solid #bac6d" }); export default CurrentUserInfo; ```
nerianighthawk

2019/12/05 14:24

console.log(event.target) でtargetの中身をみて教えてもらってもいいですか?
hello_whats_up

2019/12/05 14:32

handleChangeSelectのsetStateの前ではundifined、あとでは表示されませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問