初始数据加载ReactJS
Initial data loading ReactJS
我想执行一些初始数据加载时,我的第一个路由呈现(例如,我想加载新闻文章列表)
我制作了一个名为News.js的组件来呈现文章。我在FLUX模型中遇到的问题是在哪里加载这些初始数据。
我为加载数据所做的服务如下:从'superagent'导入请求;
class NewsService {
fetchArticles(callback) {
request
.get('http://localhost/articles')
.accept('json')
.end(function(err, res){
console.log(err);
var result = JSON.parse(res.text);
callback(result);
})
}
}
export default new NewsService ();
必须在某处调用此服务。根据ReactJS文档,我将像这样执行此操作:
export default class News extends React.Component {
constructor() {
super();
this.state = {
_articles: []
}
}
componentDidMount() {
NewsService.fetchProjects(function(articles){
// load articles in the state
this.setState({_articles: _articles})
});
}
render() {
return (
<section>
<h1>Articles</h1>
<ul>
{this.state.articles.map((article) => {
<li>{article.title}</li>
})}
</ul>
</section>
)
}
}
现在我的问题是,这不是违背通量原理吗?数据不应该作为Action调用,然后将数据存储在诸如NewsStore之类的存储中吗?
一个动作应该像下面这样吗?
var NewsActions = {
load: function() {
NewsService.fetchProjects(function(articles){
// store the articles in the NewsStore and dispatch afterwards
});
},
create: function(project) {
AppDispatcher.dispatch({
actionType: NewsConstants.ARTICLE_CREATE,
project: project
});
},
update: function(id, project) {
AppDispatcher.dispatch({
actionType: NewsConstants.ARTICLE_UPDATE,
id: id,
project: project
})
},
destroy: function() {
AppDispatcher.dispatch({
actionType: NewsConstants.ARTICLE_DESTROY,
id: id
})
}
};
export default NewsActions;
在reactjs的Chat-app示例中,他们提供了一个API调用示例。然而,这个API调用是在应用程序启动时调用的(在app.js中),这在我的场景中不适用,因为我想使用路由。那么我会在路由器中加载数据吗?(我使用react-router)
欢迎任何关于此问题的反馈或对本代码的改进
EDIT
这不是违反通量原理吗?
也许,也许不是。看起来Flux很灵活。从我的理解来看,它更像是一个原则框架,而不是一个严格的"协议"。很难说,但看起来你给出的两个例子都行得通。就像你说的,根据文档,他们建议在componentDidMount
:
componentDidMount: function() {
$.get(this.props.source, function(result) {
// ...
然而,在您的示例中,您只是将该API调用移动到一个服务中,然后该服务可以与存储/调度程序等进行交互,以便在整个应用程序中使用。 因此,您所做的是将应用程序逻辑的一个很好的块移动到它自己的模块中(好吧,一个模块是您的调度程序的一部分)。它似乎可以满足你的需求:它可以在你的应用程序中使用,并且可以在你认为合适的情况下拔出或插入。我看不出有什么不妥。它会违背Flux的某些原理吗?也许是,也许不是。但我怀疑这有什么关系。
function getTodoState() {
return {
allTodos: TodoStore.getAll(),
areAllComplete: TodoStore.areAllComplete()
};
}
他们的例子并没有显示TodoStore
是如何与服务器交互的,但是看起来它们的初始状态,它们只是简单地查询存储中的todo,然后对于更改,它们侦听并发出事件。
因此,就获取初始状态而言,看起来他们的示例显示了直接查询存储。显然,从他们做那个例子到现在,可能已经发生了变化,但可能值得研究一下Flux仓库中的一些例子,以了解它是如何设计的。
- 如何在ReactJs中渲染子组件时重新加载子组件的数据
- 在reactjs组件中预加载数据
- ReactJS-在加载时渲染顶级组件
- 如何在reactjs中动态加载组件
- 外部js文件中的Reactjs组件有时不会加载
- 使用ReactJS动态加载组件
- 当我在 reactjs 中单击按钮时如何加载函数
- 使用 reactjs 加载 JSON
- ReactJS 在服务器响应加载之前将 props 发送到子级错误
- Reactjs:基于响应加载视图
- 如何使用ReactJS实现延迟加载功能(append child不适用于React)
- 使用react路由器浏览两次加载ReactJS
- webpack reactjs应用程序加载失败:Uncaught ReferenceError:未定义snapapp
- 在ReactJS中传递道具,它们不会加载,同时接收到目标容器错误
- 动态加载