我正在尝试预览在vue.js上传之前选择的多个图像。看起来我做错了什么但无法弄清楚是什么。我会很感激一些指导。在我的组件下面找到:
<template>
<div class="form-group">
<textarea name="body" class="form-control" v-model="body" rows="4" placeholder="What's on your mind"></textarea>
</div>
<div class="form-group">
<div v-if="attach">
<img :src="selectedFile" style="width:70px; height:60px" />
<button type="button" class="btn btn-danger" @click.prevent="cancelImage">Cancel</button>
</div>
<div v-else>
<input type="file" @change="onFileChange" class="btn btn-default" multiple>
</div>
</div>
<div class="form-group">
<button type="button" class="btn btn-primary" @click.prevent="sendPost">Post</button>
</div>
</template>
<script>
export default {
data(){
return {
body: '',
images: [],
attach: false,
selectedFile: ''
}
},
methods: {
onFileChange(e){
var files = e.target.files;
if(files){
var files_count = files.length;
for (let i=0; i<files_count; i++){
var reader = new FileReader();
reader.onload = function(e){
this.selectedFile = e.target.result;
}
reader.readAsDataURL(files[i]);
}
}
}
}
}
</script>
答案 0 :(得分:2)
我将在模板中引入一个div来保存您要预览的文件:
<div v-for="(image, key) in images">
<div>
<img class="preview" v-bind:ref="'image' +parseInt( key )" />
{{ image.name }}
</div>
</div>
然后在onFileChange方法中处理图像预览;
var selectedFiles = e.target.files;
for (var i=0; i < selectedFiles.length; i++){
this.images.push(selectedFiles[i]);
}
for (var i=0; i<this.images.length; i++){
let reader = new FileReader(); //instantiate a new file reader
reader.addEventListener('load', function(){
this.$refs['image' + parseInt( i )][0].src = reader.result;
}.bind(this), false); //add event listener
reader.readAsDataURL(this.images[i]);
}
答案 1 :(得分:2)
这很好。
HTML部分
<script src="https://unpkg.com/vue"></script>
<div id="app">
<input
type="file"
multiple
accept="image/jpeg"
@change="onFileChange"
/>
<div v-for="(image, key) in images" :key="key">
<div>
<img class="preview" :ref="'image'" />
{{ image.name }}
</div>
</div>
</div>
在JS部分
new Vue({
el: '#app',
data: {
images: [],
},
methods: {
onFileChange(e) {
let vm = this;
var selectedFiles = e.target.files;
for (let i = 0; i < selectedFiles.length; i++) {
console.log(selectedFiles[i]);
this.images.push(selectedFiles[i]);
}
for (let i = 0; i < this.images.length; i++) {
let reader = new FileReader();
reader.onload = (e) => {
this.$refs.image[i].src = reader.result;
console.log(this.$refs.image[i].src);
};
reader.readAsDataURL(this.images[i]);
}
}
}
})
答案 2 :(得分:0)
@flexi的答案是正确的。只需再更改一个变量var,就不会出现任何错误。
var selectedFiles = e.target.files;
for (let i=0; i < selectedFiles.length; i++){
this.images.push(selectedFiles[i]);
}
for (let i=0; i<this.images.length; i++){
let reader = new FileReader(); //instantiate a new file reader
reader.addEventListener('load', function(){
this.$refs['image' + parseInt( i )][0].src = reader.result;
}.bind(this), false); //add event listener
reader.readAsDataURL(this.images[i]);
}