\r\n\r\n\r\n```\r\n\r\n","answerCount":3,"upvoteCount":0,"datePublished":"2020-03-22T20:45:27.193Z","dateModified":"2020-03-22T20:45:27.193Z","acceptedAnswer":{"@type":"Answer","text":"computedを使った方法になるとこんな感じですかね。\r\nelectron-vue環境での確認ですがvueの仕様には従っているので大丈夫だと思います。\r\n\r\ncomputedでpicked要素の変更を検知してimgの参照画像を変更します。\r\nproduct.image要素のキーとラジオボタンvalueの名前を合わせることで動的に変更できます。\r\n\r\nimgで読み込む画像パスを変数で動的に変えることも考えたのですが、\r\n画像を動的に使うにはrequire関数でモジュール化しておく必要があり、\r\nrequire関数の引数には変数が使えないようなのでこういう形になりました。\r\n```vue\r\n\r\n・・・\r\n \r\n \r\n \r\n
\r\n \r\n \r\n
\r\n Picked: {{ picked }} \r\n
\r\n\r\n \r\n・・・\r\n\r\n\r\n\r\n```","dateModified":"2020-03-23T03:35:25.319Z","datePublished":"2020-03-23T03:35:25.319Z","upvoteCount":1,"url":"https://teratail.com/questions/248772#reply-360070"},"suggestedAnswer":[{"@type":"Answer","text":"現時点で `v-model='picked'` と 画像の `:src=product.image` は変更されたイベントが紐付いていません。\r\n\r\nその場合、`:src=product.image` は 算出プロパティ(computed)使ってラップし、ラジオボタンにチェックがついている値に応じて算出プロパティの戻り値を変更するようにするとよいと思います。\r\n\r\n```html\r\n\r\n
\r\n```\r\n\r\n```javascript\r\n computed: {\r\n innerImageUrl() {\r\n let imgSrc\r\n // picked になったアイテムのValueとProductを紐付けるコードを書く\r\n // 例えば this.picked の値に応じて imgSrcにはthis.product.imageをセットするなど\r\n return imgSrc\r\n }\r\n },\r\n```","dateModified":"2020-03-23T03:32:15.154Z","datePublished":"2020-03-23T03:32:15.154Z","upvoteCount":0,"url":"https://teratail.com/questions/248772#reply-360069","comment":[]},{"@type":"Answer","text":"今環境が無いので文法間違いとかあるかもですが・・・\r\n```html\r\n\r\n
\r\n\r\n\r\n
\r\n\r\n```\r\n簡単に実現するならこのような感じで出しわけられると思います。\r\n\r\n参考\r\nhttps://jp.vuejs.org/v2/guide/conditional.html\r\n\r\n\r\nあとはsrcにセットするURLの出しわけを行うcomputedメソッドを作ってそれ:srcで呼び出すとかでもいけるきがします。","dateModified":"2020-03-23T02:29:11.520Z","datePublished":"2020-03-23T02:29:11.520Z","upvoteCount":1,"url":"https://teratail.com/questions/248772#reply-360046","comment":[{"@type":"Comment","text":"ご指摘の通り修正したのですが、下記のエラーが表示されます\r\n\r\nerror 'v-if' directives require that attribute value vue/valid-v-if\r\n 14:30 error Parsing error: Unexpected end of expression vue/no-parsing-error\r\n 14:31 error Parsing error: missing-whitespace-between-attributes vue/no-parsing-error\r\n 14:34 error Parsing error: unexpected-character-in-attribute-name vue/no-parsing-error","datePublished":"2020-03-23T09:32:28.666Z","dateModified":"2020-03-23T09:32:28.666Z"},{"@type":"Comment","text":"もう他の方のコメントで解決されたかと思いますが一応\r\nIF行のクオートが不足していましたね\r\n\r\n・・・\r\n\r\nのようにしたら大丈夫だったのかもしれません。\r\nご参考まで","datePublished":"2020-03-25T05:52:36.595Z","dateModified":"2020-03-25T05:52:36.595Z"}]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"トップ","url":"https://teratail.com"},{"@type":"ListItem","position":2,"name":"Vue.jsに関する質問","url":"https://teratail.com/tags/Vue.js"},{"@type":"ListItem","position":3,"name":"Vue.js","url":"https://teratail.com/tags/Vue.js"}]}}}いつもお世話になっております。
現在ECサイトのモックアップを練習していまして、
<目標>
・ラジオボタンで表示される画像を切替えたい
下記の画像のように、photo1をクリックすると、PickedがOneと表示され、photo2をクイックするとTwoと表示するところまでできたのですが、imgをどう挿入すればいいかがわかりません。
画像自体は、componentsの中のimagesに入れようと考えています。
試したこと、下記のコードの中のvalue="one"部分を、value="画像のURL"にしたのですが、やはりimgタグではいので上手く行きませんでした.
普段はPythonなどでバックエンドの方しか触っておらず、HTML&CSSですら、かなり前に学んだことがある程度なので、初歩的なミスを犯してはいると思いますが、ご助力いただけると幸いです。

コード下(Vue.js, Boostrap)
Vue.js
1<template>
2<div class="category-page">
3 <h3>{{product.title}}</h3>
4 <b-row>
5 <b-col cols="5">
6 <input type="radio" id="one" value="one" v-model="picked">
7 <label for="one">photo1</label>
8 <br>
9 <input type="radio" id="two" value="Two" v-model="picked">
10 <label for="two">photo2</label>
11 <br>
12 <span>Picked: {{ picked }} </span>
13 <img :src="product.image" class="product-image" />
14
15 </b-col>
16 <b-col cols="7">
17 <p>
18 {{product.description}}
19 </p>
20
21 <p>
22 Option selected: {{defaultOption.title}}
23 </p>
24
25 <p>
26 Price: ${{defaultOption.price}}
27 </p>
28
29 <button v-on:click="counter += 1">+</button>
30 {{counter}}
31 <button v-on:click="counter -= 1">-</button>
32
33 </b-col>
34 </b-row>
35</div>
36</template>
37
38<script>
39import axios from "axios";
40export default {
41 name: 'ProductPage',
42 data: function() {
43 return {
44 picked: {},
45 counter: 0,
46 product: {},
47 defaultOption: {}
48 }
49 },
50 mounted() {
51 axios
52 .get("https://euas.person.ee/products/" + this.$route.params.productId)
53 .then(response => {
54 this.product = response.data;
55 this.defaultOption = this.product.options[0];
56 });
57 }
58}
59</script>
60
61<style scoped>
62.product-image {
63 width: 300px;
64}
65</style>

ベストアンサー
computedを使った方法になるとこんな感じですかね。
electron-vue環境での確認ですがvueの仕様には従っているので大丈夫だと思います。
computedでpicked要素の変更を検知してimgの参照画像を変更します。
product.image要素のキーとラジオボタンvalueの名前を合わせることで動的に変更できます。
imgで読み込む画像パスを変数で動的に変えることも考えたのですが、
画像を動的に使うにはrequire関数でモジュール化しておく必要があり、
require関数の引数には変数が使えないようなのでこういう形になりました。
vue
1<template>
2・・・
3 <b-col cols="5">
4 <input type="radio" id="one" value="one" v-model="picked">
5 <label for="one">photo1</label>
6 <br>
7 <input type="radio" id="two" value="two" v-model="picked">
8 <label for="two">photo2</label>
9 <br>
10 <span>Picked: {{ picked }} </span>
11 <img :src="productImage" class="product-image" />
12
13 </b-col>
14・・・
15</template>
16
17<script>
18・・・
19 // データ構造
20 data() {
21 return {
22 picked: {},
23 counter: 0,
24 product: {
25 image: {
26 one: require('@/img/one.png'),
27 two: require('@/img/two.png'),
28 },
29 },
30 defaultOption: {},
31 };
32 },
33・・・
34 computed: {
35 productImage() {
36 return this.product.image[this.picked];
37 },
38 },
39・・・
40</script>
今環境が無いので文法間違いとかあるかもですが・・・
html
1<span v-if='picked === 'one'>
2<img src="画像URL1" class="product-image" />
3</span>
4<span v-else-if='picked === 'two'>
5<img src="画像URL2" class="product-image" />
6</span>
簡単に実現するならこのような感じで出しわけられると思います。
参考
https://jp.vuejs.org/v2/guide/conditional.html
あとはsrcにセットするURLの出しわけを行うcomputedメソッドを作ってそれ:srcで呼び出すとかでもいけるきがします。
現時点で v-model='picked' と 画像の :src=product.image は変更されたイベントが紐付いていません。
その場合、:src=product.image は 算出プロパティ(computed)使ってラップし、ラジオボタンにチェックがついている値に応じて算出プロパティの戻り値を変更するようにするとよいと思います。
html
1
2<img :src="computedImageSrc" class="product-image" />
javascript
1 computed: {
2 innerImageUrl() {
3 let imgSrc
4 // picked になったアイテムのValueとProductを紐付けるコードを書く
5 // 例えば this.picked の値に応じて imgSrcにはthis.product.imageをセットするなど
6 return imgSrc
7 }
8 },
15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

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

テンプレート機能で
簡単に質問をまとめる
質問する
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/03/23 08:59
2020/03/23 09:02
退会済みユーザー
2020/03/23 09:14
2020/03/23 09:21
退会済みユーザー
2020/03/23 09:24
退会済みユーザー
2020/03/23 09:27
退会済みユーザー
2020/03/23 09:29 編集
2020/03/23 09:37
退会済みユーザー
2020/03/23 09:43