如何在 React FLUX 中创建 API 调用?
How to create API calls in React FLUX?
我是新手。我正在努力解决这个问题 10 个小时。我创建了一个示例待办事项应用程序。最初我想从服务器加载一些数据。但我不知道如何获取这些数据。当我点击按钮时,我能够获取数据。请有人帮我解决这个问题。因为我一直在努力完成这个。
我的示例代码,
App.js
var React = require('react');
import * as TodoActions from "./js/Actions";
import TodoStore from "./js/stores/EventLists";
export class EventListing extends React.Component {
constructor() {
super();
this.getTodos = this.getTodos.bind(this);
this.state = {
todos: TodoStore.getAll(),
};
}
componentWillMount() {
TodoStore.on("change", this.getTodos);
}
componentWillUnmount() {
TodoStore.removeListener("change", this.getTodos);
}
getTodos() {
this.setState({
todos: TodoStore.getAll(),
});
}
reloadTodos() {
TodoActions.reloadTodos();
}
render() {
var List = this.state.todos.map(function(el, i){
return <li key={i}>
<div>{el.STA_NAME}</div>
</li>;
});
return (
<div className="listing">
<button onClick={this.reloadTodos.bind(this)}>Reload!</button>
<ul>
{List}
</ul>
</div>
);
}
}
var Events = React.createClass({
render:function(){
return (<div>
<EventListing />
</div>);
}
});
module.exports = Events;
Store.js
import EventEmitter from 'events';
import dispatcher from "../dispatcher"
class EventLists extends EventEmitter {
constructor(){
super();
this.todos = [{}];
}
createTodo(text) {
const id = Date.now();
this.todos.push({
id,
text,
complete: false,
});
this.emit("change");
}
getAll() {
return this.todos;
}
handleActions(action) {
switch(action.type) {
case "CREATE_TODO": {
this.createTodo(action.text);
break;
}
case "RECEIVE_TODOS": {
this.todos = action.todos;
this.emit("change");
break;
}
}
}
};
const eventLists = new EventLists;
dispatcher.register(eventLists.handleActions.bind(eventLists));
export default eventLists;
Action.js
import dispatcher from "./dispatcher";
export function createTodo(text) {
dispatcher.dispatch({
type: "CREATE_TODO",
text,
});
}
export function deleteTodo(id) {
dispatcher.dispatch({
type: "DELETE_TODO",
id,
});
}
export function reloadTodos() {
var loadData;
$.ajax({
url:url,
type:'GET',
contentType: 'application/json; charset=UTF-8',
dataType:'json',
success:function(data) {
loadData = data;
}.bind(this)
});
dispatcher.dispatch({type: "FETCH_TODOS"});
setTimeout(() => {
console.log(loadData);
dispatcher.dispatch({type: "RECEIVE_TODOS", todos: loadData});
}, 1000);
}
Dispatcher.js
import { Dispatcher } from "flux";
export default new Dispatcher;
我试过您的代码,您唯一需要更改的是 Action.js。
由于 ajax 调用,您必须等到响应恢复并在使用事件 FETCH_TODOS
进行半开调用和使用事件 RECEIVE_TODOS
成功调用之前使用调度程序。
等待 ajax 响应超时是个坏主意。
export function reloadTodos() {
dispatcher.dispatch({type: "FETCH_TODOS"});
var loadData;
$.ajax({
url:url,
type:'GET',
contentType: 'application/json; charset=UTF-8',
dataType:'json',
success:function(data) {
loadData = data;
dispatcher.dispatch({type: "RECEIVE_TODOS", todos: loadData});
}
});
}
已编辑
好了,我又明白了一点
请将此方法添加到Action.js
export function loadData() {
dispatcher.dispatch({ type: "FETCH_TODOS" });
$.ajax({
url: "https://jsonplaceholder.typicode.com/todos/",
type: 'GET',
contentType: 'application/json; charset=UTF-8',
dataType: 'json',
success: function(response) {
dispatcher.dispatch({ type: "RECEIVE_TODOS", todos: response });
}
});
}
并在您的 app.js 构造方法上调用它,这样您就可以在一开始就初始化数据
export class EventListing extends React.Component {
constructor() {
super();
this.getTodos = this.getTodos.bind(this);
this.state = {
todos: TodoStore.getAll(),
};
TodoActions.loadData();
}
请注意,由于通量,您将在 RECEIVE_TODOS
处理时正确获取数据
如果您想在初始加载时加载数据,您应该添加一个调用 reloadTodos 操作的 componentDidMount。
componentDidMount() {
TodoActions.reloadTodos();
}
确保在 DidMount 而不是 WillMount 中调用此副作用,以便新的商店状态将正确触发重新呈现以显示您的数据(它应该是非常即时的)
最后,正如@pachon_1992 所说,您不应该使用超时来等待您的 ajax 响应,而应该在成功时发送
我是新手。我正在努力解决这个问题 10 个小时。我创建了一个示例待办事项应用程序。最初我想从服务器加载一些数据。但我不知道如何获取这些数据。当我点击按钮时,我能够获取数据。请有人帮我解决这个问题。因为我一直在努力完成这个。
我的示例代码,
App.js
var React = require('react');
import * as TodoActions from "./js/Actions";
import TodoStore from "./js/stores/EventLists";
export class EventListing extends React.Component {
constructor() {
super();
this.getTodos = this.getTodos.bind(this);
this.state = {
todos: TodoStore.getAll(),
};
}
componentWillMount() {
TodoStore.on("change", this.getTodos);
}
componentWillUnmount() {
TodoStore.removeListener("change", this.getTodos);
}
getTodos() {
this.setState({
todos: TodoStore.getAll(),
});
}
reloadTodos() {
TodoActions.reloadTodos();
}
render() {
var List = this.state.todos.map(function(el, i){
return <li key={i}>
<div>{el.STA_NAME}</div>
</li>;
});
return (
<div className="listing">
<button onClick={this.reloadTodos.bind(this)}>Reload!</button>
<ul>
{List}
</ul>
</div>
);
}
}
var Events = React.createClass({
render:function(){
return (<div>
<EventListing />
</div>);
}
});
module.exports = Events;
Store.js
import EventEmitter from 'events';
import dispatcher from "../dispatcher"
class EventLists extends EventEmitter {
constructor(){
super();
this.todos = [{}];
}
createTodo(text) {
const id = Date.now();
this.todos.push({
id,
text,
complete: false,
});
this.emit("change");
}
getAll() {
return this.todos;
}
handleActions(action) {
switch(action.type) {
case "CREATE_TODO": {
this.createTodo(action.text);
break;
}
case "RECEIVE_TODOS": {
this.todos = action.todos;
this.emit("change");
break;
}
}
}
};
const eventLists = new EventLists;
dispatcher.register(eventLists.handleActions.bind(eventLists));
export default eventLists;
Action.js
import dispatcher from "./dispatcher";
export function createTodo(text) {
dispatcher.dispatch({
type: "CREATE_TODO",
text,
});
}
export function deleteTodo(id) {
dispatcher.dispatch({
type: "DELETE_TODO",
id,
});
}
export function reloadTodos() {
var loadData;
$.ajax({
url:url,
type:'GET',
contentType: 'application/json; charset=UTF-8',
dataType:'json',
success:function(data) {
loadData = data;
}.bind(this)
});
dispatcher.dispatch({type: "FETCH_TODOS"});
setTimeout(() => {
console.log(loadData);
dispatcher.dispatch({type: "RECEIVE_TODOS", todos: loadData});
}, 1000);
}
Dispatcher.js
import { Dispatcher } from "flux";
export default new Dispatcher;
我试过您的代码,您唯一需要更改的是 Action.js。
由于 ajax 调用,您必须等到响应恢复并在使用事件 FETCH_TODOS
进行半开调用和使用事件 RECEIVE_TODOS
成功调用之前使用调度程序。
等待 ajax 响应超时是个坏主意。
export function reloadTodos() {
dispatcher.dispatch({type: "FETCH_TODOS"});
var loadData;
$.ajax({
url:url,
type:'GET',
contentType: 'application/json; charset=UTF-8',
dataType:'json',
success:function(data) {
loadData = data;
dispatcher.dispatch({type: "RECEIVE_TODOS", todos: loadData});
}
});
}
已编辑
好了,我又明白了一点
请将此方法添加到Action.js
export function loadData() {
dispatcher.dispatch({ type: "FETCH_TODOS" });
$.ajax({
url: "https://jsonplaceholder.typicode.com/todos/",
type: 'GET',
contentType: 'application/json; charset=UTF-8',
dataType: 'json',
success: function(response) {
dispatcher.dispatch({ type: "RECEIVE_TODOS", todos: response });
}
});
}
并在您的 app.js 构造方法上调用它,这样您就可以在一开始就初始化数据
export class EventListing extends React.Component {
constructor() {
super();
this.getTodos = this.getTodos.bind(this);
this.state = {
todos: TodoStore.getAll(),
};
TodoActions.loadData();
}
请注意,由于通量,您将在 RECEIVE_TODOS
处理时正确获取数据
如果您想在初始加载时加载数据,您应该添加一个调用 reloadTodos 操作的 componentDidMount。
componentDidMount() {
TodoActions.reloadTodos();
}
确保在 DidMount 而不是 WillMount 中调用此副作用,以便新的商店状态将正确触发重新呈现以显示您的数据(它应该是非常即时的)
最后,正如@pachon_1992 所说,您不应该使用超时来等待您的 ajax 响应,而应该在成功时发送