我正在使用ReactJS + Redux,以及Express和Webpack。有一个内置的API,我希望能够从客户端进行REST调用-
GET,POST,PUT,DELETE。
使用Redux架构的方式和正确方法是什么?就简化程序,动作创建者,存储和反应路线而言,任何有关流程的良好示例都将非常有帮助。
先感谢您!
最简单的方法是使用redux-thunk
package进行操作。这个软件包是一个redux中间件,因此,首先,您应该将其连接到redux:
import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import rootReducer from './reducers/index';
const store = createStore(
rootReducer,
applyMiddleware(thunk)
);
这使您可以将async
动作与常规sync
动作一起分派。让我们创建其中之一:
// actions.js
export function fetchTodos() {
// Instead of plain objects, we are returning function.
return function(dispatch) {
// Dispatching REQUEST action, which tells our app, that we are started requesting todos.
dispatch({
type: 'FETCH_TODOS_REQUEST'
});
return fetch('/api/todos')
// Here, we are getting json body(in our case it will contain `todos` or `error` prop, depending on request was failed or not) from server response
// And providing `response` and `body` variables to the next chain.
.then(response => response.json().then(body => ({ response, body })))
.then(({ response, body }) => {
if (!response.ok) {
// If request was failed, dispatching FAILURE action.
dispatch({
type: 'FETCH_TODOS_FAILURE',
error: body.error
});
} else {
// When everything is ok, dispatching SUCCESS action.
dispatch({
type: 'FETCH_TODOS_SUCCESS',
todos: body.todos
});
}
});
}
}
我更喜欢在呈现和容器组件上分离React组件。本文完美地描述了这种方法。
接下来,我们应该创建TodosContainer
组件,该组件将为演示Todos
组件提供数据。在这里,我们正在使用react-redux
库:
// TodosContainer.js
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { fetchTodos } from '../actions';
class TodosContainer extends Component {
componentDidMount() {
// When container was mounted, we need to start fetching todos.
this.props.fetchTodos();
}
render() {
// In some simple cases, it is not necessary to create separate `Todos` component. You can put todos markup directly here.
return <Todos items={this.props.todos} />
}
}
// This function is used to convert redux global state to desired props.
function mapStateToProps(state) {
// `state` variable contains whole redux state.
return {
// I assume, you have `todos` state variable.
// Todos will be available in container component as `this.props.todos`
todos: state.todos
};
}
// This function is used to provide callbacks to container component.
function mapDispatchToProps(dispatch) {
return {
// This function will be available in component as `this.props.fetchTodos`
fetchTodos: function() {
dispatch(fetchTodos());
}
};
}
// We are using `connect` function to wrap our component with special component, which will provide to container all needed data.
export default connect(mapStateToProps, mapDispatchToProps)(TodosContainer);
另外,如果要显示加载程序/错误消息,则应创建todosReducer
,将处理FETCH_TODOS_SUCCESS
操作以及其他2个操作。
// reducers.js
import { combineReducers } from 'redux';
const INITIAL_STATE = {
items: [],
isFetching: false,
error: undefined
};
function todosReducer(state = INITIAL_STATE, action) {
switch (action.type) {
case 'FETCH_TODOS_REQUEST':
// This time, you may want to display loader in the UI.
return Object.assign({}, state, {
isFetching: true
});
case 'FETCH_TODOS_SUCCESS':
// Adding derived todos to state
return Object.assign({}, state, {
isFetching: false,
todos: action.todos
});
case 'FETCH_TODOS_FAILURE':
// Providing error message to state, to be able display it in UI.
return Object.assign({}, state, {
isFetching: false,
error: action.error
});
default:
return state;
}
}
export default combineReducers({
todos: todosReducer
});
对于其它操作喜欢CREATE
,UPDATE
,DELETE
没有什么特别的,他们正在实施方式相同。
问题内容: 我在Android应用中使用Twitter的Fabric SDK 。我需要获取Twitter用户的推文和状态消息。我还没有找到任何示例,有关此文档的说明也不太清楚,所以我提出了一个新问题。有人可以提供如何使用该类的示例吗? 问题答案: Twitter Kit可以进行API调用。官方文档在这里:https : //dev.twitter.com/twitter- kit/android/
我是电影人的新手,如果这个问题看起来很傻,请原谅我。 我已经创建了一个Movelet,我正在使用Eclipse和Movilizer插件进行开发。在这个Movelet中,我想使用现有的REST Web服务。上述网络服务目前正被基于网络的应用程序所使用,我们正在Movilizer中开发移动应用程序。 有人可以指向过程/代码片段以使用来自 Movilizer 的 REST 服务吗?请注意,我需要 MEL
问题内容: 我有一个Java应用程序,当我使用它时,它会正确关闭,Java应用程序会在关闭之前保存所有数据。现在,我尝试使用来从C#控制台应用程序中关闭该Java应用程序,但是当我使用它时应用程序不保存任何数据,我也尝试过使用但什么也没有发生,并且使用了该过程只是在没有任何挽救的情况下将其杀死了。 。 我如何从C#控制台应用程序引发Java应用程序的关机钩子? 问题答案: 关闭钩子不能由另一个应用
我使用最新版本的java Spring放心。我尝试用post方法和json body(contentType是应用程序/json)模拟调用进行身份验证,但是当我的请求被我的java Spring应用程序拦截时,主体是空的...但空的身体不是。 我可以通过ngrep和一些函数看到所有请求都正确完成。 当我从js客户端使用curl、postman或ajax时,我没有这个问题 以下是来自peek()函数
问题内容: 我正在建立一个用于学习/实验和小型项目目的的小型MVC框架。由于完整的MVC框架和ORM对于仅几个数据库调用来说就算过头了,因此我需要了解模型内部的基础知识。 使用空类,在哪里我必须调用对象才能进行数据库调用? 在模型内部调用查询会是什么样子? 另外,在哪里可以找到MVC的初学者Web /书籍资源(包含许多示例代码)?我听说过很多术语,例如业务逻辑和数据库逻辑。我记得在某处读过,您应该
一般来说,我对微服务和api网关的概念相当陌生。我试图理解api网关在使用许多微服务的现代web应用程序中所起的作用。我一直在阅读express gateway的文档和教程,但对于web应用程序如何使用像express gateway这样设置的api网关执行身份验证,我有点困惑。 我的网络应用程序将有多个微服务可以与之对话。我认为,在我所有的微服务前面放置一个API网关可以使每个微服务不必担心用户