Провайдер данных во Vue.js
Перевод статьи Data Provider component in Vue.js
Использование фреймворков / библиотек на основе компонентного подхода, таких как Vue.js, не означает, что все компоненты должны основываться на отображении и отрисовке UI.
Одним из моих самых любимых способов продвинутого повторного использования компонентов в больших приложениях - это использование композиции компонентов.
В слотах с ограниченной областью видимости (scoped slots), в статье «Использование слотов с ограниченной областью видимости во Vue.js», мы узнали о том, как можно инкапсулировать логику в компоненте и передавать ее в slots через props. Это позволяет нам создавать UI и поведение нового компонента, комбинируя все в одном месте .
Сегодня я собираюсь вам показать пример компонента провайдера данных.
Провайдер данных - это компонент без рендеринга (renderless component), то есть ему ничего не нужно отображать.
Основой для создания renderless component является создание scoped slots из функции render и передачей ему props:
render() {
return this.$scopedSlots.default({
loading: !this.loaded,
data: this.data
})
}Из-за несогласованности в scoped slots (было исправлено в версии 2.6), вы можете сделать так, чтобы это работало везде (в версиях до 2.6):
render() {
const slot = this.$scopedSlots.default({
loading: !this.loaded,
data: this.data
})
return Array.isArray(slot) ? slot[0] : slot
}Для создания компонента провайдера данных необходимо выполнить ajax/fetch запрос при создании компонента (created), а затем передать эти данные в scoped slot.
Окончательная версия DataProvider.js выглядит следующим образом:
import axios from 'axios'
export default {
props: ["url"],
data: () => ({
data: null,
loaded: false
}),
created() {
axios.get(this.url).then(({ data }) => {
this.data = data
this.loaded = true
})
},
render() {
const slot = this.$scopedSlots.default({
loading: !this.loaded,
data: this.data
})
return Array.isArray(slot) ? slot[0] : slot
}
}Обратите внимание на то, что файл имеет расширение .js. Так как он содержит в себе только часть script компонента, мы можем не создавать файл с расширением .vue
Компонент «Провайдер данных» также содержит в себе состояние loading (загрузки данных), поэтому мы можем использовать это состояние для отображения UI (к примеру: спинер загрузки данных) в зависимости от состояния загрузки данных. Пример:
<template>
<DataProvider url="https://jsonplaceholder.typicode.com/users">
<div v-slot="{ data, loading }">
<div v-if="loading">Loading...</div>
<div v-else>
<h2>Result: {{ data.length }} users</h2>
<p v-for="user in data" :key="user.id">{{ user.name }}</p>
</div>
</div>
</DataProvider>
</template>Вот и все!
Если вы хотите посмотреть на пример работы этого компонента, то перейдите в CodeSandbox!
Послесловие
Подписывайся на нас в социальных сетях:
Vue.js
Nuxt.js
Наши друзья uWebDesign: