Я думаю, вы можете заменить:
<img v-bind:src="'/images/json-ld/images/' + imageName" .. />
на
<img v-bind:src="image" .. />
// Or, using bind shortcut
<img :src="image" .. />
, и тогда предварительный просмотр должен работать нормально.
Demo # 1
new Vue({
el: '#app',
data() {
return {
image: null,
}
},
methods: {
showFilePreview(e) {
let files = e.target.files || e.dataTransfer.files;
if (!files.length) return;
this.createImage(files[0]);
},
createImage(file) {
let reader = new FileReader();
let vm = this;
reader.onload = (e) => {
vm.image = e.target.result;
};
reader.readAsDataURL(file);
}
}
})
#app { padding: 10px; }
#preview img { max-width: 100%; max-height: 150px; margin-top:10px;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>
<div id="app">
<input type="file" @change="showFilePreview" />
<div id="preview">
<img v-if="image" :src="image" />
</div>
</div>
Кроме того, вы можете упростить код, удалив this.createImage(files[0])
и использовать URL.createObjectURL()
для загрузки URL изображения:
Демонстрация # 2
new Vue({
el: '#app',
data() {
return {
image: null,
}
},
methods: {
showFilePreview(e) {
let files = e.target.files || e.dataTransfer.files;
if (!files.length) return;
this.image = URL.createObjectURL(files[0]);
}
}
})
#app { padding: 10px; }
#preview img { max-width: 100%; max-height: 150px; margin-top:10px;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>
<div id="app">
<input type="file" @change="showFilePreview" />
<div id="preview">
<img v-if="image" :src="image" />
</div>
</div>