【发布时间】:2017-03-08 07:17:05
【问题描述】:
我使用 componentWillMount 方法调用 action creator, 然后它被调用了两次。看看下面的结果截图。
这是我的行动创作者:
export function fetchAdmin(){
return (dispatch)=>{
axios.get(`${Config.API_URL}/admin`,{
headers: { authorization: localStorage.getItem('token')}
})
.then(response => {
return dispatch({
type: FETCH_DATA,
payload: response.data
});
}
)
.catch(response => {
console.log(response);
});
}
}
这是我的reducer:
import { FETCH_DATA } from '../actions/types';
export function admin(state= {}, action){
switch(action.type){
case FETCH_DATA:
return {...state, lists: action.payload };
default:
return { state, lists: 'YEY!'}
}
}
这是我的容器,也是我使用 componentWillMount 调用动作创建者的方式。
import React, { Component } from 'react';
import { Link } from 'react-router';
import { connect } from 'react-redux';
import * as actions from 'actions/admin_action';
class Admin extends Component{
componentWillMount(){
this.props.fetchAdmin()
}
renderData(){
var lists = this.props.lists;
console.log(lists);
}
render(){
return(
<div>
{this.renderData()}
</div>
)
}
const mapStateToProps = (state) => {
return { lists: state.admin.lists };
}
export default connect(mapStateToProps, actions)(Admin);
从截图中我假设 render() 被调用了两次。第一个调用转到默认操作创建者,因此结果是“是!”第二个是有效的。
有人可以向我解释为什么 componentWillMount 会这样执行,实际上在第一次渲染中我只想让我的数组不是“YEY!”如何解决这个问题呢?谢谢。
【问题讨论】:
-
不建议在
componentWillMount触发数据加载。你应该在componentDidMount -
真的吗?为什么? @just-boris
-
这个 Twitter 线程包含一些解释 twitter.com/dan_abramov/status/790581793397305345
-
另外官方文档:facebook.github.io/react/docs/…
componentWillMount:避免在此方法中引入任何副作用或订阅。componentDidMount:如果需要从远程端点加载数据,这里是实例化网络请求的好地方。
标签: javascript reactjs redux react-redux