Я работаю над проектом, который ожидает много мест, где я должен реализовать компонент загрузки файла с разными стилями.Я хочу создать настраиваемый компонент, дизайн которого я могу легко изменить, а также я не хочу повторяться и хочу извлечь всю общую логику в одном месте.
На данный момент у меня есть vue.jsверсия 2.2.2 и фреймворк bulma css.У меня есть базовая реализация этого компонента с одним доступным дизайном.Он поддерживает несколько состояний, представляющих текущий статус загрузки:
- компонент ожидает ввода
- загрузка начата
- загрузка завершена успешно
- загрузкане удалось
Также этот компонент отвечает за процесс загрузки.
В этом мой компонент имеет много обязанностей: 1. Он знает, как обращаться со статусами:
<p v-if="isWaiting">
...
</p>
<div v-if="isLoading" class="is-loading">
<p class="title">{{currentPercent}} %</p>
</div>
...
data() { return {
currentStatus = Statuses.waiting
}}
computed: {
isWaiting() {
return this.currentStatus === Statuses.waiting;
},
...
}
знает, как загрузить данные и подсчитать текущий процент уже переданных данных:
selectedFileChanged: async function(event) {
if (event.target.files.length === 0) return;
this.currentStatus = Statuses.uploading;
this.selectedFile = event.target.files[0];
const formData = new FormData();
formData.append("file", this.selectedFile);
try {
const result = (await axios.post("some url", formData, {
onUploadProgress: progress => {
const loaded = progress.loaded;
const total = progress.total;
this.currentPercent = Math.floor((loaded * 100) / total);
}
})).data;
this.currentStatus = Statuses.uploaded;
this.$emit("fileUploaded", {
file: this.selectedFile,
payload: result
});
} catch (exception) {
this.currentStatus = Statuses.error;
}
}
у него есть только один стиль, который я могу использовать
полный код вы можете найти здесь: https://codesandbox.io/s/vue-template-gz2gk
Поэтому мой вопрос: как создать этот компонент, чтобы иметьвозможность легко изменить свой стиль и как справляться со статусами загрузки?
Мне кажется, что: 1. компонент не должен знать, что такое axios и как загружать данные;2. компонент должен отвечать только за текущий статус и как его отображать
Я могу представить новый сервис загрузки, который будет знать, как загружать данные и добавлять новый реквизит (текущий статус) для файла загрузкикомпонент и изменить его из родительского компонента.Но в этом случае я напишу один и тот же код для всех экземпляров компонента.
Кто-нибудь знает лучшие практики создания такого настраиваемого компонента?
ОБНОВЛЕНИЕ 1 Я пытался реализовать эту функцию, используя слоты, и в итоге получил: https://codesandbox.io/s/vue-template-pi7e9
Компонент все еще знает, как загрузить данные, но теперь я могу изменить стиль загрузки компонента.Итак, новый вопрос: как работать со слотами и не передавать много переменных, и как бороться с загрузкой.Я не хочу, чтобы мой компонент знал, как загрузить данные: (