我想说的是,在 Redux 世界的这一点上,还不清楚什么是最佳实践以及什么是反模式。这是一个非常无主见的工具。虽然这对于多元化的生态系统蓬勃发展来说是件好事,但对于那些想办法在不陷入陷阱或过多样板文件的情况下组织应用程序的人们来说,这确实带来了挑战。据我所知,您的方法似乎与 Redux 指南中的建议大致一致。对我来说看起来很有趣的一件事是,这似乎CHUCK_SUCCESS
应该是SAVE_JOKE
不必要的。
我个人觉得让动作创建者派发更多动作相当尴尬,因此我制定了react-redux-controller背后的方法。它是全新的,所以它肯定不是“最佳实践”,但我会把它扔在那里,以防你或其他人想尝试一下。在该工作流程中,您将拥有一个类似于以下内容的控制器方法:
// actions/index.js
export const CHUCK_REQUEST = 'CHUCK_REQUEST';
export const CHUCK_SUCCESS = 'CHUCK_SUCCESS';
export const CHUCK_FAILURE = 'CHUCK_FAILURE';
export const chuckRequest = () => { type: CHUCK_REQUEST };
export const chuckSuccess = (joke) => { type: CHUCK_SUCCESS, joke };
export const chuckFailure = (err) => { type: CHUCK_FAILURE, err };
// controllers/index.js
import fetch from 'isomorphic-fetch'; // or whatever
import * as actions from '../actions';
const controllerGenerators = {
// ... other controller methods
*fetchAndSaveJoke() {
const { dispatch } = yield getProps;
// Trigger a reducer to set a loading state in your store, which the UI can key off of
dispatch(actions.chuckRequest());
try {
const response = yield fetch('jokes/random');
dispatch(actions.chuckSuccess(response.response.value.joke));
} catch(err) {
dispatch(actions.chuckFailure(err));
}
},
};