предисловие
Не знаю, когда у меня появилась идея вести блог, но мой запас знаний еще очень слаб, и я не могу его долго писать. Это мой первый блог, в котором я буду записывать некоторые знания, полученные с тех пор, как я изучил внешний интерфейс. Если есть какие-либо ошибки или упущения, пожалуйста, укажите, что ваша критика и исправления являются для меня отличной мотивацией двигаться вперед!
В обычном процессе разработки нам нужно асинхронно ждать данных и часто использовать график загрузки, чтобы улучшить взаимодействие с пользователем и сообщить пользователю, что мы загружаемся, так как же более изящно использовать загрузку в процессе разработки? При разработке небольших программ нам нужно только одно предложение wx.showLoading() для выполнения задачи, и в веб-разработке есть соответствующие фреймворки пользовательского интерфейса, которые помогут нам в этом. Давайте посмотрим, как это достигается.
Сначала реализуйте простую загрузку
код показывает, как показано ниже
<div class="container">
<div class="loading"></div>
</div>
.container {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.loading {
width: 100px;
height: 100px;
border-radius: 100%;
border: 5px #ffffff solid;
border-right-color: #87CEEB;
animation: loading 1s linear infinite;
}
@keyframes loading {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
Таким образом, мы реализовали относительно простую диаграмму загрузки цикла.Ниже я опишу, как изящно использовать эту загрузку в vue и react соответственно.
Vue часть
Во-первых, используйте веб-пакет vue init для создания каркаса vue, каталог плагина показан на рисунке ниже.
Простой код загрузки, который мы реализовали выше, написан на loading.vue, плюс немного логики
<script>
export default {
name: "loading",
data() {
return {
show: false
}
}
}
</script>
index.js
//先引入loading组件
import LoadingComponent from './loading'
const Loading = {}
Loading.install = function (Vue) {
// 生成一个Vue的子类 同时这个子类也就是组件
const LoadingConstructor = Vue.extend(LoadingComponent)
// 生成一个该子类的实例
const instance = new LoadingConstructor()
// 将这个实例挂载在我创建的div上
// 并将此div加入全局挂载点内部
instance.$mount(document.createElement('div'))
document.body.appendChild(instance.$el)
//注入vue的原型链
Vue.prototype.$loading = {
show() {
instance.show = true
},
close(){
instance.show = false
}
}
}
export default Loading
Здесь мы создаем подкласс Vue и монтируем его экземпляр глобально. Добавьте несколько методов в цепочку прототипов Vue, чтобы вы могли контролировать отображение и скрытие графика загрузки в любом компоненте с помощью методов, подобных this.$loading.show(). Наконец, мы экспортируем объект Loading. Затем добавьте плагин Loading в main.js и вызовите метод Vue.use() для регистрации плагина.
Наконец, давайте проверим это. Тестовый код выглядит следующим образом, используя setTimeout для имитации асинхронных запросов.
<script>
export default {
name: 'HelloWorld',
data() {
return {
msg: ''
}
},
mounted() {
this.$loading.show()
setTimeout(()=>{
this.$loading.close()
this.msg = '加载完辽!'
},3000)
}
}
</script>
Молочное мышление! тест прошел успешно!
Реагировать раздел
Перед этим позвольте мне представить компоненты высшего порядка (HOC) в реакции.
компоненты более высокого порядка
В React, если одну и ту же функцию необходимо использовать в нескольких разных компонентах, это решение обычно включает Mixin и компоненты более высокого порядка. Однако из-за того, что слишком много примесей усложняют поддержку компонентов, они больше не поддерживаются в React ES6. Компоненты более высокого порядка — отличный способ заменить примеси для реализации общей функциональности абстрактных компонентов. Компонент более высокого порядка на самом деле является функцией, которая получает компонент в качестве параметра и возвращает компонент-оболочку в качестве возвращаемого значения, подобно функции более высокого порядка.
Реализация
Сначала используйте приложение create-react-app для создания тестового каркаса, каталог компонентов высокого уровня показан на следующем рисунке.
index.css — это в основном стиль загрузки, а код index.js выглядит следующим образом.
import React from 'react';
import './index.css'
function hoc(ComponentClass) {
return class HOC extends ComponentClass {
render() {
if (!this.state.loading) {
console.log(this.state.loading)
return super.render()
}
else {
return (<div>
<div className="container">
<div className="loading"></div>
</div>
</div>)
}
}
}
}
export default hoc
Мы определяем функцию hoc, которая принимает компонент в качестве параметра. Свойство состояния компонента управляется с помощью this.state, а компонент визуализируется с помощью super.render(). Наконец, экспортируйте функцию hoc. Затем импортируйте его в компонент следующим образом
import hoc from '../hoc/loading/index'
class Home extends Component {
constructor(props) {
super(props)
this.state = {
msg: '还没加载好',
loading: true
}
}
render() {
return (
<div>
{this.state.msg}
</div>
);
}
componentDidMount() {
let loading = this.state.loading
setTimeout(() => {
this.setState({
loading: !loading,
msg: '加载完辽!'
})
}, 3000)
}
}
export default hoc(Home)
setTimeout также используется для имитации асинхронных запросов, и результаты теста также успешны. Реагирующая часть не использует декораторы для использования компонентов более высокого порядка, что недостаточно элегантно. . . (Я попробовал все методы онлайн-обработки в приложении create-реагировать, но все равно сообщил об ошибке..)
наконец
На этом мы закончили с тем, как изящно использовать загрузку во Vue и React. Это очень простая версия демо, но я все же надеюсь поделиться ею с вами. Только после того, как я закончил писать, я действительно понял эту старую поговорку, я чувствовал себя поверхностным на бумаге, и я знал, что должен это сделать.