在 React Redux 应用程序中,我在哪里从服务器获取初始数据?
Where do I fetch initial data from server in a React Redux app?
我已经开始学习 React / Redux 并且偶然发现了一些可能是非常基本的问题。以下是我的应用程序的片段,为简单起见删除了一些代码。
我的状态由一组默认为空的网站描述。每当用户分页到不同的页面时,稍后的 reducer 将有 LOAD_SITES
操作来加载一组不同的站点,但现在它什么都不做。 React 首先呈现 PublishedSitesPage
,然后呈现 PublishedSitesBox
,然后循环数据并呈现各个站点。
我想要做的是让它用默认的空数组渲染所有内容,同时启动一个 "load sites from server" 承诺,一旦它解决,就调度 LOAD_SITES
操作。拨打此电话的最佳方式是什么?我在考虑 PublishedSitesBox
或者 componentDidMount
的构造函数。但不确定这是否可行——我担心的是我将以这种方式创建一个无限循环,以不断重新渲染。我想我可以通过在 "haveRequestedInitialData" 的行中设置一些其他状态参数来以某种方式防止这种无限循环。我的另一个想法是在完成 ReactDOM.render()
之后立即做出这个承诺。最好和最干净的方法是什么?
export default function sites(state = [], action) {
switch (action.type) {
default:
return state;
}
}
...
const publishedSitesPageReducer = combineReducers({
sites
});
ReactDOM.render(
<Provider store={createStore(publishedSitesPageReducer)}>
<PublishedSitesPage />
</Provider>,
this.$view.find('.js-published-sites-result-target')[0]
);
...
export default function PublishedSitesPage() {
return (
<PublishedSitesBox/>
);
}
...
function mapStateToProps(state) {
return { sites: state.sites };
}
const PublishedSitesBox = connect(mapStateToProps)(({sites}) => {
// render sites
});
这里有一个关于如何操作的清晰示例:Facebook Tutorial
至于无限循环,一旦你的数组不再为空,清除间隔。
这应该可以防止循环。
此数据加载逻辑根本没有理由触及您的 React 组件。您在这里想要的是承诺 return 向您的 reducer 发送一个操作,它对 store 进行适当的更改,然后导致 React 组件根据需要重新渲染。
(在调用 ReactDOM.render 之前或之后启动异步调用并不重要;无论哪种方式,promise 都会起作用)
像这样:
var store = createStore(publishedSitesPageReducer);
someAsyncCall().then(function(response) {
store.dispatch(someActionCreator(response));
});
ReactDOM.render(
<Provider store={store}>
<PublishedSitesPage />
</Provider>,
this.$view.find('.js-published-sites-result-target')[0]
);
您的 React 组件是您商店的消费者,但没有规定它们必须是您商店的唯一消费者。
我已经开始学习 React / Redux 并且偶然发现了一些可能是非常基本的问题。以下是我的应用程序的片段,为简单起见删除了一些代码。
我的状态由一组默认为空的网站描述。每当用户分页到不同的页面时,稍后的 reducer 将有 LOAD_SITES
操作来加载一组不同的站点,但现在它什么都不做。 React 首先呈现 PublishedSitesPage
,然后呈现 PublishedSitesBox
,然后循环数据并呈现各个站点。
我想要做的是让它用默认的空数组渲染所有内容,同时启动一个 "load sites from server" 承诺,一旦它解决,就调度 LOAD_SITES
操作。拨打此电话的最佳方式是什么?我在考虑 PublishedSitesBox
或者 componentDidMount
的构造函数。但不确定这是否可行——我担心的是我将以这种方式创建一个无限循环,以不断重新渲染。我想我可以通过在 "haveRequestedInitialData" 的行中设置一些其他状态参数来以某种方式防止这种无限循环。我的另一个想法是在完成 ReactDOM.render()
之后立即做出这个承诺。最好和最干净的方法是什么?
export default function sites(state = [], action) {
switch (action.type) {
default:
return state;
}
}
...
const publishedSitesPageReducer = combineReducers({
sites
});
ReactDOM.render(
<Provider store={createStore(publishedSitesPageReducer)}>
<PublishedSitesPage />
</Provider>,
this.$view.find('.js-published-sites-result-target')[0]
);
...
export default function PublishedSitesPage() {
return (
<PublishedSitesBox/>
);
}
...
function mapStateToProps(state) {
return { sites: state.sites };
}
const PublishedSitesBox = connect(mapStateToProps)(({sites}) => {
// render sites
});
这里有一个关于如何操作的清晰示例:Facebook Tutorial
至于无限循环,一旦你的数组不再为空,清除间隔。 这应该可以防止循环。
此数据加载逻辑根本没有理由触及您的 React 组件。您在这里想要的是承诺 return 向您的 reducer 发送一个操作,它对 store 进行适当的更改,然后导致 React 组件根据需要重新渲染。
(在调用 ReactDOM.render 之前或之后启动异步调用并不重要;无论哪种方式,promise 都会起作用)
像这样:
var store = createStore(publishedSitesPageReducer);
someAsyncCall().then(function(response) {
store.dispatch(someActionCreator(response));
});
ReactDOM.render(
<Provider store={store}>
<PublishedSitesPage />
</Provider>,
this.$view.find('.js-published-sites-result-target')[0]
);
您的 React 组件是您商店的消费者,但没有规定它们必须是您商店的唯一消费者。