【发布时间】:2018-04-27 05:17:09
【问题描述】:
我正在努力学习 React-Redux。我正在制作一个简单的应用程序,它从Teleport API 获取数据并根据用户的输入显示列表。
我的问题是,即使在容器组件中调度了动作,状态也没有改变,结果也没有显示出来。
这是两次 dispatch action 后的控制台截图。
我认为正确存储数据存在问题。如果您能帮助我,我将不胜感激。
这是我的代码。
/container/search.js
class Search extends Component{
constructor(props){
super(props);
this.state = {
city : ""
}
this.handleSubmit = this.handleSubmit.bind(this);
this.handleChange = this.handleChange.bind(this);
}
handleChange(event) {
console.log(event.target.value)
this.setState({
city: event.target.value
});
}
handleSubmit(event){
event.preventDefault();
console.log(this.state.city)
this.props.addData(this.state.city);
this.setState({
city: ""
});
}
render(){
return(
<div>
<form onSubmit={this.handleSubmit}>
<input type="text"
placeholder="add city name"
onChange={this.handleChange}
value={this.state.city} />
<button>Submit</button>
</form>
</div>
)
}
}
function mapDispatchToProps(dispatch) {
return bindActionCreators({ addData }, dispatch);
}
export default connect(null, mapDispatchToProps)(Search);
/actions/index.js
import axios from 'axios';
const ROOT_URL = "https://api.teleport.org/api/cities/?search";
const ADD_DATA = 'ADD_DATA';
export function addData(city){
const url = `${ROOT_URL}=${city}`;
const request = axios.get(url);
return {
type: ADD_DATA,
payload: request
};
}
/reducers/reducer_data.js
import { ADD_DATA } from "../actions/index";
export default function( state=[], action) {
switch(action.type) {
case ADD_DATA:
return [action.payload.data, ...state];
}
return state;
}
/reducers/index.js
import { ADD_DATA } from "../actions/index";
export default function( state=[], action) {
switch(action.type) {
case ADD_DATA:
return [action.payload.data, ...state];
}
return state;
}
//编辑 // index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { createStore, applyMiddleware } from 'redux';
import promiseMiddleware from 'redux-promise';
import logger from 'redux-logger'
import reducers from './reducers';
import Search from './containers/search';
const createStoreWithMiddleware = applyMiddleware(promiseMiddleware, logger)(createStore);
ReactDOM.render(
<Provider store={createStoreWithMiddleware(reducers)}>
<Search />
</Provider>
, document.querySelector('.container'));
【问题讨论】:
-
axios.get(url)是异步的。发送之前不需要等待吗? -
我使用
redux-promise进行异步请求。我会更新我的代码。 -
你可能需要使用一些像 redux-thunk 这样的中间件来在 redux 逻辑中加入 axios/fetches,请阅读:stackoverflow.com/questions/34570758/…
标签: javascript reactjs redux react-redux