1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/ericfang-easy-mobile

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Методы работы

Метод request является обёрткой над axios и добавляет перехват запросов и ответов.

Расположение файла: src/utils/request.util.js

  • Перехват запросов

    • Добавление задержки обратной связи для отладки проблем с мгновенным возвратом mockjs;
    • Добавление распознавания сериализации: при добавлении serialize : true в заголовках автоматически выполняется операция urlEncode для параметра data, по умолчанию используется формат json для отправки post-запросов.
  • Перехват ответов

    • Добавляется стандартный формат разбора:
        resp = {
            "code": 200,    // 状态码 100:обычная ошибка с сообщением;200:нормально;
            "message": "",  // текстовая информация
            "data": null    // содержимое, может быть любого формата
        }   

    Перехватчик автоматически распознаёт код состояния. Если код равен 200, то возвращается data. Поэтому при использовании функции request в then-блоке обратного вызова параметром будет data, а не весь контент обратной связи. Если код не равен 200, будет выполнена функция code[code] из src/utils/response.error.util.js. Если такой функции нет, она игнорируется. Можно определить различные функции code в этом файле. Можно настроить дополнительные параметры в соответствии с требованиями.

  • Использование метода request

    • Метод 1: прямой ввод параметров axios для возврата Promise-объекта.

        import {request} from "@/utils/request.util";
      
        request({
            url : 'api/address',
            method: 'get',
            params: {
                id: 1
            }   
        }).then( resp => {
            // здесь resp возвращает обработанное содержимое data
            console.log( resp );
        })
    
    * **Метод 2**: цепочка вызовов функции request.
    
     ```javascript
     import {request} from "@/utils/request.util";
     
     // В настоящее время предоставляются только методы get и post, другие должны быть добавлены самостоятельно.
     request("api/address").get({id : 1}).then( resp => {
           console.log( resp );
     })

Бесконечная прокрутка

  • Базовый компонент — better-scroll. На этот компонент наложен слой бизнес-логики, чтобы упростить разработку.
  • Компонент бесконечной прокрутки должен использоваться вместе с Paginate. Реализация Paginate проста, можно посмотреть исходный код.
  • Стиль выпадающего списка и стиля вытягивания вверх можно изменить, отредактировав компонент ezm-scroll-box.
  • Пример полного случая выпадающей загрузки и вытягивающей вверх загрузки:
<template>
    <div class="">
        <ezm-layout>
            <van-nav-bar
                slot="nav"
                title="Выпадающая загрузка с вытягиванием вверх"
                left-arrow
                @click-left="g_navigate.back()"
            ></van-nav-bar>
            <!-- Компонент бесконечной прокрутки -->
            <!-- Для использования выпадающей или вытягивающей вверх функций необходимо передать объект разбивки на страницы -->
            <ezm-scroll-box
                :pull-down="true"
                :pull-up="true"
                :paginate="paginate"
            >
                <van-cell
                    v-for="item in list" :key="item.id"
                    :title="item.title"
                    :label="item.label"
                    :value="item.id"
                ></van-cell>
            </ezm-scroll-box>
        </ezm-layout>
    </div>
</template>

<script>
import EzmLayout from "@/components/layout/ezm-layout";
import EzmScrollBox from "@/components/scroll/ezm-scroll-box";
import Paginate from "@/utils/paginate.util";
import {mockUtil} from "@/utils/common.util";
import {request} from "@/utils/request.util";
import {PageMixin} from "@/mixin/navigate.mixin";

export default {
    name: 'BetterScrollAll',
    mixins: [PageMixin],
    components: {EzmScrollBox, EzmLayout},
    data() {
        return {
            // Создание объекта разбивки на страницы
            // Объект разбивки на страницы принимает два параметра Function: обратный вызов выпадающей или вытягивающей вверх функции (необязательно) Integer: количество элементов на странице
            paginate: new Paginate(this.getList),
            list: [],
        }
    },
    methods: {
        /**
         * При входе на страницу эта функция будет автоматически запущена
         * Возврат на эту страницу не вызовет выполнения
         */
        init() {
            // Автоматически запускает операцию выпадающей загрузки
            this.paginate.autoPullDown();
        },
        /**
        * Функция, которая будет вызываться при выпадающей и вытягивающей вверх обратных вызовах
        * paginate автоматически передаст параметр refresh при вызове этой функции
        * Выпадающая загрузка передаст true, вытягивающая вверх загрузка передаст false
        * @param refresh Является ли это выпадающей загрузкой
        */
        getList(refresh = false) {
            // Предварительно использовать mockjs для имитации данных, если есть реальный интерфейс, не нужно имитировать
            this.mockData();
``` **Запрос интерфейса BetterScrollAll и передача параметров разбивки на страницы**

// Запрос интерфейса BetterScrollAll и передача параметров разбивки на страницы
request('BetterScrollAll')
    .get(this.paginate.getRequestParams())
    .then(resp => {
        // Добавление данных в список или его расширение
        this.list = refresh ? resp.records : this.list.concat(resp.records);
        // Завершение загрузки данных
        // Не забудьте передать resp, paginate будет использовать результат resp для определения наличия следующей страницы
        // Отображение различного содержимого внизу, например «больше нет» и т. д.;
        this.paginate.finishLoading(resp);
    })
    // Если запрос не удался, необходимо вызвать завершение загрузки данных
    // Нет необходимости передавать параметры, просто завершите анимацию загрузки
    .catch(_ => this.paginate.finishLoading());
},
/**
 * Имитация 2 страниц полных данных,
 * Третья страница содержит 5 записей
 */
mockData() {
    mockUtil.mock(/BetterScrollAll/i, 'get', {
        code: 200,
        message: '',
        data: {
            current: this.paginate.toPage,
            size: this.paginate.size,
            [`records|${this.paginate.toPage > 2 ? 5 : this.paginate.size}`]: [{
                'id|+1': (this.paginate.toPage - 1) * this.paginate.size + 1,
                'title': '@cname',
                'label': '@name',
            }],
        }
    });
};

Очередь задач

  • Все знают, что у одностраничных приложений есть некоторые проблемы, такие как открытие диалогового окна, а затем нажатие кнопки «Назад» в браузере, диалоговое окно не исчезает. Поэтому при открытии диалогового окна можно добавить функцию закрытия диалогового окна в очередь задач, и при закрытии диалогового окна ранее добавленная функция задачи удаляется из очереди задач.

  • Функции в очереди задач будут выполняться перед уходом со страницы. Если вы принудительно нажмёте кнопку «Назад» браузера, все функции в очереди задач будут выполнены сразу. Например, если вы вызываете метод навигации для перехода вперёд или назад, функции в очереди будут выполняться последовательно (в обратном порядке).

  • Подробные примеры можно найти в демоверсии. Здесь представлен пример настройки Dialog.config для vant.

let confirm = (content, title = "确认信息", type = 'warning') => {
    let dialog = Dialog.confirm({
        title: title,
        message: content,
    });
    let task = Events.addWaitTask(() => Dialog.close());
    return dialog.then(() => {
        Events.removeWaitTask(task);
        return Promise.resolve();
    }).catch(() => {
        Events.removeWaitTask(task);
        return Promise.reject();
    })
}
  • Объект Events содержит обратные вызовы и очередь задач. Здесь перечислены только часто используемые методы, связанные с задачами.
Метод Функция Параметр Возврат Примечание
addWaitTask Добавить задачу Function: задача WaitForTask: задача
removeWaitTask Удалить задачу WaitForTask: задача, | String: идентификатор задачи Очистить все задачи, если оставить пустым
  • Структура задачи WaitForTask. Когда используется Events.addWaitTask, id автоматически генерируется как uuid, нет необходимости генерировать его вручную.
export class WaitForTask {
    constructor(id, task) {
        this.id = id;
        this.task = task;
    }

    id = '';
    task = null;

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Быстрое создание мобильных одностраничных (SPA) приложений, решение проблем с утомительными анимациями переходов, бесконечной прокруткой, запросами операций и общим макетом, а также помощь разработчикам в быстрой реализации основных функций. Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/ericfang-easy-mobile.git
git@api.gitlife.ru:oschina-mirror/ericfang-easy-mobile.git
oschina-mirror
ericfang-easy-mobile
ericfang-easy-mobile
master