предисловие
Использовано за последний месяцdvaРефакторинг существующих проектов компании, меньше времени на написание статей. С началом сентябрьского школьного сезона несколько используемых проектов с открытым исходным кодом недавно получили серьезные обновления. ПервыйumiНаконец-то вышла версия 2.0, конкретное введение можно посмотретьВыпущен umi 2.0, подключаемый фреймворк приложений для реагирования корпоративного уровня.. Вслед за версией ant design pro 2.0, созданной с помощью umi@2, вы можете ознакомиться с конкретным введениемКрасивый и мощный Ant Design Pro 2.0 официально выпущен. Сегодня у меня наконец-то появилось время познакомиться с umi@2, я вспоминаю первую часть своего пути по изучению двойки.запись об обученииОн был собран с помощью umi@1.X и может быть пересобран с помощью umi 2.0. Эта статья является автором два@sorryccизumi-dva-user-dashboardРеализация версии umi@2:"umi+dva, приложение CURD для управления пользователями"Переписано из версии статьи для umi@2. Репозиторий кода:umi2-dva-user-dashboard. Демонстрационный адрес:demo.
Шаг 1. Используйте скаффолд create-umi для инициализации проекта
смотрите подробностиофициальный сайт umi #Создайте проект с помощью строительных лесов
использоватьyarn create
Заказ:
$ mkdir umi2-dva-user-dashboard && cd umi2-dva-user-dashboard
$ yarn create umi
Увидев, что небольшой партнер в сообществе спросил, как использовать npm для создания проекта umi, сначала используйте npm для установки create-umi:
$ cnpm install -g create-umi
После установки войдите в проект и выполнитеcreate-umi
$ cd umi2-dva-user-dashboard
$ create-umi
Обратите внимание на официальную рекомендацию
yarn create
Команда, потому что она гарантирует, что каждый раз используется последний скаффолд. Если вы похожи на меня, у компании есть только частный сервер npm в среде разработки интрасети, вы можете попробовать использовать команду npm.
После выполнения вышеописанных операций входим в интерактивную командную строку create-umi, выбираем функцию, здесь выбираем antd, dva и hard source
После подтверждения каталог и файл будут автоматически созданы в соответствии с вашим выбором:
Затем вручную установите зависимости:
$ yarn
или
$ cnpm install
После установки зависимостей запустите проект:
$ yarn start
или
$ npm start
Если все в порядке, откройте его в браузере.http://localhost:8000Вы можете увидеть следующий интерфейс:
Шаг 2. Настройте прокси, к которому можно получить доступ через RESTFulhttp://localhost:8000/api/users
Исправлять.umirc.js
, плюс конфигурация «прокси»:
proxy: {
"/api": {
"target": "http://jsonplaceholder.typicode.com/",
"changeOrigin": true,
"pathRewrite": { "^/api" : "" }
}
},
Обратите внимание, что конфигурация прокси такая же, как у umi@1.
доступhttp://localhost:8000/api/users, вы можете получить доступjsonplaceholder.typicode.com/usersДанные.
Шаг 3. Создайте маршрут пользователя
Файл в umi это маршрут, поэтому нам нужно добавить новый маршрут, просто создайте новый файл, здесь мы используем обычный маршрут. смотрите подробностиваши фанаты accept.org/this/expensive/ro….
новыйsrc/pages/users.js
, содержание следующее:
export default () => {
return (
<div>
Users Page
</div>
)
}
затем посетитеhttp://localhost:8000/users,ты увидишьUsers Page
Выход:
Здесь мы видим, что на странице есть лишний заголовок, получается, что проект, сгенерированный скаффолдингом create-umi, будетГенерируется по умолчаниюфайл глобального макетаsrc/layouts/index.js
, версия umi@1.X имеет эту функцию, подробности см. в официальной документацииглобальный макет
Шаг 4. Построение модели пользователей и сервиса
Обратите внимание на только что созданныйsrc/pages/users.js
Это простая ситуация со страницей. В настоящее время ее необходимо организовать с моделью и сервисом. Новоеsrc/pages/users/index.js
файл, будетsrc/pages/users.js
содержимое скопировано вsrc/pages/users/index.js
файл, затем удалитеsrc/pages/users.js
документ.
Скаффолдинг create-umi не сгенерировал request.js, создайте новыйsrc/utils/request.js
:
import fetch from 'dva/fetch';
function checkStatus(response) {
if (response.status >= 200 && response.status < 300) {
return response;
}
const error = new Error(response.statusText);
error.response = response;
throw error;
}
/**
* Requests a URL, returning a promise.
*
* @param {string} url The URL we want to request
* @param {object} [options] The options we want to pass to "fetch"
* @return {object} An object containing either "data" or "err"
*/
export default async function request(url, options) {
const response = await fetch(url, options);
checkStatus(response);
const data = await response.json();
const ret = {
data,
headers: {},
};
if (response.headers.get('x-total-count')) {
ret.headers['x-total-count'] = response.headers.get('x-total-count');
}
return ret;
}
Добавить услугу:src/pages/users/services/users.js
, обратите внимание, что umi@2 добавляет псевдоним веб-пакета @, указывающий на каталог src:
import request from '@/utils/request';
export function fetch({ page = 1 }) {
return request(`/api/users?_page=${page}&_limit=5`);
}
Обратите внимание здесь
page
Параметр по умолчанию равен1
,limit
параметр установлен на5
Добавить модель:src/pages/users/models/users.js
, содержание следующее:
import * as usersService from '../services/users';
export default {
namespace: 'users',
state: {
list: [],
total: null,
},
reducers: {
save(state, { payload: { data: list, total } }) {
return { ...state, list, total };
},
},
effects: {
*fetch({ payload: { page } }, { call, put }) {
const { data, headers } = yield call(usersService.fetch, { page });
yield put({ type: 'save', payload: { data, total: headers['x-total-count'] } });
},
},
subscriptions: {
setup({ dispatch, history }) {
return history.listen(({ pathname, query }) => {
if (pathname === '/users') {
dispatch({ type: 'fetch', payload: query });
}
});
},
},
};
Переключитесь на браузер (который обновляется автоматически), и ничего не должно измениться, потому что данные в порядке, но с ними не связано представление. Но откройте инструменты разработчика Redux, и вы должны увидетьusers/fetch
а такжеusers/save
действие и связанное с ним состояние.
Шаг 5. Добавьте интерфейс для отображения списка пользователей (аналогично umi@1)
мы помещаем компонент в существованиеsrc/pages/users/components
, поэтому создайте новый здесьUsers.js
а такжеUsers.css
. Пожалуйста, обратитесь к этомуCommit.
Две вещи, которые следует отметить:
- Тонкая настройка модели, добавление страницы для указания текущей страницы
- Поскольку pageSize используется как в компонентах, так и в службах, он извлекается в
src/constants.js
После внесения изменений переключитесь в браузер, и вы сможете увидеть список пользователей с разбивкой на страницы.
Несколько замечаний:
- В Users.js модель и компоненты связаны, обратите внимание на
const { list, total, page } = state.users;
внутриusers
дляmodel
внутриnamespace
имя.- Мы не регистрировали модель вручную, с этим нам помог umi, подробнее см.
src/pages/.umi/DvaContainer.js
файл, который автоматически обновляется. Связанные правила см.официальный сайт umi #регистрация моделиодин период.- Вы можете использовать модуль css напрямую
Шаг 6. Добавить меню заголовка
Добавление компонента меню заголовка позволяет нам переключаться между домашней страницей и страницей со списком пользователей.
обратитесь к этомуCommit.
Шаг 7. Обработка состояния загрузки (аналогично umi@1)
dva имеет хук, который управляет выполнением эффектов, и на его основе оборачивает подключаемый модуль dva-loading. С этим плагином нам не нужно снова и снова писать showLoading и hideLoading, когда будет сделан запрос, плагин автоматически установит состояние загрузки данных в true или false. Потом привязываем при рендеринге компоненты и рендерим на основе этих данных.
umi-plugin-dva по умолчанию имеет встроенный плагин для загрузки dva.
затем вsrc/components/Users/Users.js
Привязать загрузку данных в:
+ loading: state.loading.models.users,
Обратите внимание здесьusers
дляmodel
изnamespace
, поэтому состояние загрузки dva-loading для модели в целом.
Пожалуйста, обратитесь к этомуCommit.
Обновите браузер, ваш список пользователей загружен?
Шаг 8. Обработка пейджинга (аналогично umi@1)
изменить только один файлsrc/pages/users/components/Users.js
Просто хорошо.
Есть две идеи для обработки пагинации:
- Отправьте действие, запросите новые данные пейджинга, сохраните их в модели и автоматически обновите страницу.
- Переключить маршрутизацию (поскольку изменения маршрутизации отслеживались ранее, последующие действия будут обрабатываться автоматически)
Мы используем способ мышления 2, преимущество в том, что пользователи могут напрямую обращаться к странице 2 или другим страницам.
quan относятся к этомуCommit.
Шаг 9. Процесс удаления пользователя (аналогично umi@1)
После предыдущих 8 шагов общий контекст приложения стал ясен, и я считаю, что у каждого есть определенное понимание общего процесса.
Следующая функциональная настройка может быть выполнена в основном в соответствии со следующими тремя шагами:
-
service
-
model
-
компонент Сейчас мы начинаем добавлять функцию удаления пользователей.
-
обслуживать, модифицировать
src/pages/users/services/users.js
:
export function remove(id) {
return request(`/api/users/${id}`, {
method: 'DELETE',
});
}
- модель, модифицировать
src/pages/users/model.js
:
*remove({ payload: id }, { call, put, select }) {
yield call(usersService.remove, id);
const page = yield select(state => state.users.page);
yield put({ type: 'fetch', payload: { page } });
},
- компонент, изменить
src/pages/users/components/Users.js
,заменятьdeleteHandler
содержание:
dispatch({
type: 'users/remove',
payload: id,
});
Обратите внимание, что из-за использования стороннего веб-сайта API данные на самом деле не будут удалены, но удаление API возвращает успех, и данные извлекаются после выбора удаления, а исходные данные остаются прежними.
Шаг 10. Обработка пользовательских правок (аналогично umi@1)
Обработка пользовательских правок такая же, как и раньше, в три шага:
- service
- model
- компонент
Первое обслуживание, модификация
src/pages/users/services/users.js
:
export function patch(id, values) {
return request(`/api/users/${id}`, {
method: 'PATCH',
body: JSON.stringify(values),
});
}
Затем моделировать, модифицироватьsrc/pages/users/model.js
:
*patch({ payload: { id, values } }, { call, put, select }) {
yield call(usersService.patch, id, values);
const page = yield select(state => state.users.page);
yield put({ type: 'fetch', payload: { page } });
},
Последний компонент, см. подробностиCommit.
Следует отметить, как мы обрабатываем видимое состояние модального окна здесь, есть несколько вариантов:
- Сохраните его в состоянии модели dva
- Хранить в состоянии компонента
К тому же как сохранить тоже проблема, можно:
- Виден только один, а затем заполните разные данные формы в соответствии с пользователем, на который нажал пользователь.
- несколько пользователей несколько видимых
Для этого руководства выбрано решение 2-2, то есть состояние компонента сохраняется, а видимость сохраняется пользователем. Кроме того, для удобства использования пакет
UserModal
с компонент.
После этого переключитесь в браузер, и вы сможете редактировать пользователя.
Шаг 11. Обработайте создание пользователя (аналогично umi@1)
Создание пользователя проще, чем редактирование пользователя, потому что им можно поделиться.UserModal
компоненты. Он аналогичен шагу 10, поэтому повторяться не будет.Commit.
На данный момент мы завершили полное приложение CURD. Если вам интересно, вы можете дополнительно посмотреть информацию о два и уми:
(над)
Суммировать
В этой статье в основном используется umi@2 для завершенияumi-dva-user-dashboardпроект. Видно, что бизнес-код в основном такой же, как у umi@1, а стоимость миграции относительно низкая. В настоящее время проект находится на рефакторинге с использованием dva, и пока нет планов использовать umi@2, но мы продолжим уделять внимание развитию umi.