-
Notifications
You must be signed in to change notification settings - Fork 3
Model
Структура данных модели имеет следующий формат:
{
__waiting: {}, // тут хранятся ключи асинхронных действий состояния ожидания
__failed: {} // тут хранятся ключи асинхронных действий для состояния ошибок
}
__waiting
и __failed
предназначены для хранения состояний
асинхронных действий. Асинхронные действия могут быть в трех состояниях: waiting
, failed
и формально - success
. При переходе в каждое из состояний нужно переключить остальные, для этого есть специальные методы.
Пример модели с использованием асинхронных действий
//model.js
import {Model as BasicModel} from 'react-redux-mvc';
export default class UserModel extends BasicModel {
static shape = {
userData: {
name: {
first: '',
last: ''
},
age: null,
department: '',
email: '',
phone: ''
},
errorMsg: null
};
constructor(state){
super(state);
}
onLoadWaiting () {
return this
.setWaiting('loadUserData')
.resetFailed('loadUserData')
.getState();
}
onLoadFailed (errorMsg) {
return this
.setWaiting('loadUserData')
.resetFailed('loadUserData')
.updateState({errorMsg})
.getState();
}
onLoadComplete (result) {
return this
.resetWaiting('loadUserData')
.updateState({userData: result})
.getState();
}
}
//actions.js
import {createAction} from 'easy-redux';
import UserModel from './model';
const loadUserData = createAction('loadUserData', {
async: true,
storeKey: 'user',
initialState: Object.assign({}, UserModel.shape),
action: userId => ({userId}),
handlers: {
onWait: state => new UserModel(state).onLoadWaiting(),
onFail: (state, {error}) => new UserModel(state).onLoadError(error),
onSuccess: (state, {result}) => new UserModel(state).onLoadComplete(result)
}
});
Детально о них будет ниже
static shape:Object - описание типов данных модели
import {Model} from 'react-redux-mvc';
import {PropTypes} from 'react';
class MyModel extends Model {
static shape = {
name: PropTypes.string.isRequired,
age: PropsTypes.number
};
}
static defaults:Object - значения по умолчанию
import {Model} from 'react-redux-mvc';
class MyModel extends Model {
static defaults = {
name: '',
age: 0
};
}
getState (prop:String) - Возвращает полное состояние модели, или только отдельное его свойство - prop
import UserModel from './model';
const {getState as reduxGetState} = store;
const user = new UserModel(reduxGetState()['user']);
const userName = user.getState('name');
const userState = user.getState();
Также можно получить вложенное свойство
const user = new UserModel(getState());
const userName = user.getState('name.first');
update (updates:Object) - Обновляет состояний модели, путем сливания (merge)
с объектом updates
const userData = {
name: {
first: 'John',
last: 'Doe'
},
Age: 23,
};
const user = new UserModel(userData);
let lastName = user.getState('name.last');
console.log(lastName); // Doe
lastName = user.update({name:{last: 'Brown'}}).getState('name.last');
console.log(lastName); // Brown
Возвращает контекст this
set(prop:String || Object, value: Any) - Устанавливает значение состояния модели. У этого метода две реализации:
- Устанавливает свойство
prop
вvalue
const user = new UserModel(getState());
user.set('department', 'IT');
- Устанавливает целый объект свойств
const user = new UserModel(getState());
user.set({
'email': 'john_doe@email.com',
'phone': '+7-916-666-66-66'
'department', 'IT',
});
Все состояния хранятся в объекте парами. Например:
//ожидающие
waiting: {
loadData: true,
login: false,
update: false,
}
//с ошибкой
waiting: {
loadData: false,
login: false,
update: false,
}
Соответственно все операции осуществляются в рамках этих объектов
setWaiting(actionName:String) - Устанавливает состояние actionName
как ожидающее (true
)
resetWaiting(actionName:String) - Сбрасывает состояние actionName
как ожидающее (false
)
setFailed(actionName:String) - Устанавливает состояние actionName
как с ошибкой (true
)
resetFailed(actionName:String) - Устанавливает состояние actionName
как с ошибкой (false
)
isWaiting(actionName:String) - Проверяет находится ли действие actionName
в статусе ожидания
isFailed(actionName:String) - Проверяет находится ли действие actionName
в статусе ошибки
getWaiting() - Возвращает весь объект с состояниями ожидания
getFailed() - Возвращает весь объект с состояниями ошибки