Vue.js
with webpack
Webアプリで、動的画像を表示する必要がある場合があります。画像のファイル名が変数に保存されているimg
を表示したい。その変数はcomputed
プロパティであり、Vuex
ストア変数を返します。この変数はbeforeMount
に非同期的に取り込まれます。
<div class="col-lg-2" v-for="pic in pics">
<img v-bind:src="'../assets/' + pic + '.png'" v-bind:alt="pic">
</div>
しかし、私がちょうどするとき、それは完全に動作します:
<img src="../assets/dog.png" alt="dog">
私の場合、これは fiddle に似ていますが、ここではimg URLで機能しますが、実際のファイルパスでは機能しません。
それを行う正しい方法は何ですか?
私はこれを次のコードで動作させました
getImgUrl(pet) {
var images = require.context('../assets/', false, /\.png$/)
return images('./' + pet + ".png")
}
およびHTMLで:
<div class="col-lg-2" v-for="pic in pics">
<img :src="getImgUrl(pic)" v-bind:alt="pic">
</div>
しかし、以前のアプローチがうまくいかなかった理由はわかりません。
以下にwebpackが使用する略記を示しますので、require.context
を使用する必要はありません。
HTML:
<div class="col-lg-2" v-for="pic in pics">
<img :src="getImgUrl(pic)" v-bind:alt="pic">
</div>
Vueメソッド:
getImgUrl(pic) {
return require('../assets/'+pic)
}
そして、私は here の最初の2つの段落が説明するなぜこれが機能するのか?まあ。
ペットの写真を他のすべての画像アセットと一緒に取得するのではなく、サブディレクトリ内に置くことをお勧めします。そのように:./assets/pets/
最善の方法は、単純な方法を使用して、指定されたインデックスで画像の正しい文字列を作成することです。
methods: {
getPic(index) {
return '../assets/' + this.pics[index] + '.png';
}
}
次に、v-for
内で次の操作を実行します。
<div class="col-lg-2" v-for="(pic, index) in pics">
<img :src="getPic(index)" v-bind:alt="pic">
</div>
JSFiddleは次のとおりです(明らかに画像は表示されないので、画像の横にsrc
を配置しました):
これは非常に簡単な答えです。 :D
<div class="col-lg-2" v-for="pic in pics">
<img v-bind:src="`../assets/${pic}.png`" v-bind:alt="pic">
</div>
私にとって最もうまくいく最も簡単な方法は、APIからデータを取得することでした。
methods: {
getPic(index) {
return this.data_response.user_Image_path + index;
}
}
getPicメソッドは、ファイルの名前であるパラメーターを1つ取り、サーバーからファイルの絶対パスを返します。ファイル名はsimple ...
これは私がこれを使用したコンポーネントの例です:
<template>
<div class="view-post">
<div class="container">
<div class="form-group">
<label for=""></label>
<input type="text" class="form-control" name="" id="" aria-describedby="helpId" placeholder="search here">
<small id="helpId" class="form-text user-search text-muted">search for a user here</small>
</div>
<table class="table table-striped ">
<thead>
<tr>
<th>name</th>
<th>email</th>
<th>age</th>
<th>photo</th>
</tr>
</thead>
<tbody>
<tr v-bind:key="user_data_get.id" v-for="user_data_get in data_response.data">
<td scope="row">{{ user_data_get.username }}</td>
<td>{{ user_data_get.email }}</td>
<td>{{ user_data_get.userage }}</td>
<td><img :src="getPic(user_data_get.image)" clas="img_resize" style="height:50px;width:50px;"/></td>
</tr>
</tbody>
</table>
</div>
</div>
</template>
<script>
import axios from 'axios';
export default {
name: 'view',
components: {
},
props:["url"],
data() {
return {
data_response:"",
image_path:"",
}
},
methods: {
getPic(index) {
return this.data_response.user_Image_path + index;
}
},
created() {
const res_data = axios({
method: 'post',
url: this.url.link+"/view",
headers:{
'Authorization': this.url.headers.Authorization,
'content-type':this.url.headers.type,
}
})
.then((response)=> {
//handle success
this.data_response = response.data;
this.image_path = this.data_response.user_Image_path;
console.log(this.data_response.data)
})
.catch(function (response) {
//handle error
console.log(response);
});
},
}
</script>
<style scoped>
</style>
require
関数を試すことができます。このような:
<img :src="require(`@/xxx/${name}.png`)" alt class="icon" />