如何正确清除文件类型的输入值?在 BaseFileUpload 组件上,我添加了 v-model="photo" 但在控制台中出现错误"InvalidStateError: Failed to set the 'value' property on 'HTMLInputElement': This input element accepts a filename, which may only be programmatically set to the empty string."
BaseFileUpload.vue
<template>
<div class="form-group">
<label v-if="label">{{ label }}</label>
<input
type="file"
class="form-control-file"
ref="fileupload"
:value="value"
@change="onChange($event.target.files)"
/>
</div>
</template>
<script>
export default {
name: 'BaseFileUpload',
props: {
label: {
type: String,
required: false,
default: '',
},
value: {
type: File
},
},
methods: {
onChange(files) {
this.$emit('change', files[0]);
},
},
};
</script>
表单.vue
<BaseFileUpload v-model="photo" @change="onChangeFileUpload($event)" />
<button @click="clear()">clear</button>
data() {
return {
photo: null,
};
},
methods: {
clear() {
this.photo = null;
}
}
给定的错误
实际上包含答案。
如果我们不能以编程方式设置 的
input type="file"值value,那么v-model您提供的实现指令不合适,因为v-model我们知道,该指令根据以下原则工作:对于我们的例子,这意味着随着
valuey的任何变化<input>,将触发一个执行上述逻辑的处理程序,即 分配一个新值。这是它Vue抛出无法分配新值的错误的地方,因为这种类型的输入字段 -type="file"如上所述,不能以编程方式将其更改为空字符串以外的值。互联网上有很多关于这个的讨论。我会给你一个选项作为解决你的问题的例子。注释被插入到代码中,我认为代码不会引起问题。
原理如下:我们remove
v-model,清除我们使用的输入字段,我们将处理输入文件的逻辑连接$refs到方法中。onChangeFileUpload