В Redux, как лучше всего отправить данные на сервер?
Я хочу опубликовать данные на сервере.. мои действия таковы:
export function addNewTodo(text) {
return {
type: 'ADD_NEW_TODO',
payload: addNewTodoApi(text)
};
}
let addNewTodoApi = function(text) {
return new Promise(function(resolve, reject) {
//implement fake method for get data from server
setTimeout(function () {
resolve({
text: text,
done: ??,
assignTo: ??,
Project: ??,
Category: ??,
id: ??
});
}, 10);
});
};
У меня есть три пути. Первый способ - импорт хранилища и вызов метода getState в моем действии, а второй - диспетчеризация в редукторе, а последний - передача всех данных в моем действии в качестве аргумента. Который правильный? Я прочитал этот вопрос, и я беспокоюсь об антипаттернах.
2 ответа
Вы должны рассмотреть возможность использования import { connect } from 'react-redux'
и используя containers
,
Вы входите в свой магазин по функции mapStateToProps
Вы отправляете все свои данные для вашего действия из контейнера.
Подпись для него
const mapStateToProps = (state, ownProps) => {}
Там вы получите state
какая часть может быть передана вашему действию.
Действие выполнить публикацию в вашем API, используя ajax с данными, которые вы передали из штата.
В вашем действии вы могли бы рассмотреть возможность использования isomorphic-fetch
,
Быстрый пример:
import 'isomorphic-fetch'
const postData = ()=> ({
type: types.POST_YOURACTION,
payload: new Promise((resolve, reject) => {
fetch(api.postData(), {method: 'POST', }).then(response => {
resolve(response.json())
})
})
})
В случае, если вам нужен прямой доступ к магазину, вы можете использовать .getState()
прямой доступ к состоянию можно считать антишаблоном, но это действительно зависит от вашей архитектуры. Я бы посоветовал посмотреть на mapStateToProps
,
Пример того, как получить доступ к вашему магазину.
import store from 'app/store'
store.getState().yourReducer.data
Я всегда пользуюсь третьим способом, передаю данные в действие. Данные могут быть данными в store.getState() или из params или что угодно, что вам нужно для получения данных с сервера.