Vue و فایل ورودی – پاک کردن فایل یا انتخاب همان فایل
آیا تا به حال برای شما پیش آمده است که یک کامپوننت انتخابگر فایل داشته باشید، مدل فایل را پاک کنید اما نتوانید دوباره همان فایل را انتخاب کنید؟
کدپن: https://codepen.io/schirrel/pen/YzRGrvq
خوب توضیح دادن آن کمی سخت و کنجکاو است.
اول از همه به TL/DR:
باید از Vue’s استفاده کنید $refs و ورودی را null قرار دهید.
حالا اگر میخواهید دلیل آن را بفهمید، اجازه دهید از چند چیز مهم عبور کنیم:
اول: Vue با v-model و ورودی فایل کار نمی کند، حتی در مورد آن در مخزن رسمی Vue: Discussion بحث می کند.
حالا بیایید بفهمیم چرا کار نمی کند، دو چیز اصلی:
- ورودی با
type="file"فقط محرک هاchangeرویداد، در حالی که v-model گوش می دهدinputرویداد. - مدل V نیاز به تنظیم دارد
valueویژگی html، ff شما همیشه سعی می کنید انجام دهید:value="myFileModel"این خطا نشان داده خواهد شد: > خطا در nextTick: “InvalidStateError: تنظیم ویژگی “value” در “HTMLInputElement” ناموفق بود: این عنصر ورودی یک نام فایل را می پذیرد که ممکن است فقط به صورت برنامه نویسی روی رشته خالی تنظیم شود.
بنابراین با این یک سوال پیش می آید: چگونه یک فایل را پاک کنیم، و مهمتر از همه، چگونه امکان انتخاب مجدد وجود دارد؟
بیایید یک مورد استفاده ساده را رنگ کنیم: شما بسته بندی فایل خود را دارید که از یک ورودی فایل استفاده می کند (بدیهی است) اما فایل را در data. مثال:
<template>
<label for="inputFile">
Click here to select you file
<input type="file" name="inputFile" id="inputFile" @change="selectFile" />
</label>
<span v-if="file">
File Selected {{ file.name }}
<button @click="clearFile">remove</button>
</span>
</template>
<script>
export default {
data() {
return {
file: null
};
},
methods: {
selectFile(event) {
this.file = event.target.files[0];
},
clearFile() {
this.file = null;
}
}
};
</script>
حتی اگر clearFile در حال تنظیم است file به عنوان null، هنگام انتخاب مجدد فایل، @change دوباره فعال نمی شود. به همین دلیل است که ارزش html همچنان، the است file پشتیبانی از داده ها بر آن تأثیر نمی گذارد. به مثال کدپن نگاهی بیندازید.
زمانی که ما آن را دیدیم :value با فایل ها کار نکنید، راه مناسب برای انجام این کار دسترسی به HTML است <input type="file" /> و این مقدار را به صورت برنامه ای تنظیم مجدد کنید.
با افزودن الف ref="fileInput" به <input> و داخل clearFile روش اضافه کردن:
this.$refs.fileInput.value = null
حالا کار میکند:

راه حل نهایی کدپن: https://codepen.io/schirrel/pen/XWyjeOw
توجه: این رفتار رایج در فریمورک ها است.



