页面很简单就是一个上传按钮和一张图片
<div class="wrap">
<input type="file" ref="test" @change="demo" />
<img v-if="imgPath" v-bind:src="imgPath"/>
</div>
这里我们用图片blob转换成base64进行预览,写法如下,看似没有啥问题,但是图片就是显示不出来。
<script type="text/javascript">
var vm = new Vue({
el: '.wrap',
data : {
'imgPath': ''
},
methods: {
demo: function() {
var file = this.$refs.test.files[0];
var reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function(e) {
var str = reader.result;
var urlDecoded = decodeURIComponent(str);
this.imgPath = urlDecoded;
}
}
}
})
</script>
我们知道FileReader对象的onload方法是异步加载的,所有我们不能在onload方法里面直接对data进行赋值。这个时候我们需要先把this赋给一个变量,然后进行再引用,方法如下
<script type="text/javascript">
var vm = new Vue({
el: '.wrap',
data: {
'imgPath': ''
},
methods: {
demo: function() {
/****先将this赋给一个变量****/
var _this = this;
var file = this.$refs.test.files[0];
var reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function(e) {
var str = reader.result;
var urlDecoded = decodeURIComponent(str);
/****对变量进行赋值****/
_this.imgPath = urlDecoded;
}
}
}
})
</script>
最后看一下图片预览的效果