共计 1203 个字符,预计需要花费 4 分钟才能阅读完成。
在 vue 的项目中做图片上传时, 我通过上传图片后获取到 input 中的 files 属性将其进行处理, 然后将其转换为 base64 传给后台。
这个方法用在非 v -for 上动态生成的 ref 上时, 可以通过 this.$refs.name.files[0] 获取到相关元素, 但是将这个方法用在 v -for 动态上传的列表中, 而且 ref 也是通过动态生成的时候就获取不到目标元素的 files。结论在最后, 可以直接看。
我单独上传图片的方法是
uploadImg(refName) {let file = this.$refs[refName].files[0];
let that = this;
let reader = new FileReader();
let imgUrlBase64;
if (file) {imgUrlBase64 = reader.readAsDataURL(file);
let name = file.name.split(".");
reader.onload = function(e) {
let imgFile= reader.result.substring(reader.result.indexOf(",") + 1
);
let obj = {
img: [
{originalFileName: name[0],
fileExtension: "." + name[1],
fileContent: imgFile
}
]
};
that.$axios
.post("www.baidu.com", {obj: JSON.stringify(obj)
})
.then(res => {
let _data = res.data.xxx;
if (_data.xxx== "1") {
let imgURL = _data.img;
that.imgList.push(imgURL);
}
})
.catch(err => {console.log(err);
});
};
}
}
该方法在不是通过 v -for 生成的 ref 时, 可以正常使用, 但是将这个方法用在 v -for 动态上传的列表中, 而且 ref 也是通过动态生成的时候就遇到了问题。
template 中的代码是:
<ul>
<li v-for="(item, index) in list" :key="index">
<title>{{item.name}}</title>
<input
type="file"
accept="image/png, image/gif, image/jpeg"
:ref="'img' + index"@change="uploadImg('img' + index)"
>
</li>
</ul>
经过一番排查之后, 我发现这个问题是 ref 的问题: 当 template 中直接使用 ref 时, 它会直接返回 ref, 但是 template 中这个 ref 是在 v -for 中动态生成时, 它返回的是一个数组, 必须通过 this.$refs[refName].files[0] 才可以获取到对应的元素。所以上面的方法在加一个判断即可实现。
正文完
发表至: javascript
2019-07-01