在 componentWillReceiveProps 中调度时无限循环
infinite loop when dispatching in componentWillReceiveProps
我有一个由 react-router (path="profile/:username") 加载的配置文件组件,组件本身如下所示:
...
import { fetchUser } from '../actions/user';
class Profile extends Component {
constructor(props) {
super(props);
}
componentDidMount() {
const { username } = this.props;
this.fetchUser(username);
}
componentWillReceiveProps(nextProps) {
const { username } = nextProps.params;
this.fetchUser(username);
}
fetchUser(username) {
const { dispatch } = this.props;
dispatch(fetchUser(username));
}
render() {...}
}
export default connect((state, ownProps) => {
return {
username: ownProps.params.username,
isAuthenticated: state.auth.isAuthenticated
};
})(Profile);
fetchUser 操作如下所示(redux-api-中间件):
function fetchUser(id) {
let token = localStorage.getItem('jwt');
return {
[CALL_API]: {
endpoint: `http://localhost:3000/api/users/${id}`,
method: 'GET',
headers: { 'x-access-token': token },
types: [FETCH_USER_REQUEST, FETCH_USER_SUCCESS, FETCH_USER_FAILURE]
}
}
}
我添加 componentWillReceiveProps 函数的原因是当 URL 更改为另一个 :username 时做出反应并加载该用户的个人资料信息。乍一看似乎一切正常,但后来我在调试时注意到 componentWillReceiveProps 函数在无限循环中被调用,我不知道为什么。如果我删除 componentWillReceiveProps,那么配置文件不会使用新用户名更新,但我没有循环问题。有什么想法吗?
您的 componentWillReceiveProps
处于无限循环中,因为调用 fetchUser
将调度更新 Props 的操作。
添加比较以检查特定道具在调度操作之前是否发生变化。
编辑:
在 React 16.3+ componentWillReceiveProps
中会慢慢 deprecated.
It is recommended to use componentDidUpdate
in place of componentWillReceiveProps
componentDidUpdate(prevProps) {
if (this.props.params.username !== prevProps.params.username) {
dispatch(fetchUser(username));
}
}
尝试添加一个条件来比较道具。如果您的组件需要它。
componentWillRecieveProps(nextProps){
if(nextProps.value !== this.props.value)
dispatch(action()) //do dispatch here
}
如果你的 React 路由带有一些路径参数,比如 profile/:username,
您可以简单地比较 props.location.pathname
componentWillReceiveProps(nextProps){
if(nextProps.location.pathname !== this.props.location.pathname){
dispatch()
}
}
我有一个由 react-router (path="profile/:username") 加载的配置文件组件,组件本身如下所示:
...
import { fetchUser } from '../actions/user';
class Profile extends Component {
constructor(props) {
super(props);
}
componentDidMount() {
const { username } = this.props;
this.fetchUser(username);
}
componentWillReceiveProps(nextProps) {
const { username } = nextProps.params;
this.fetchUser(username);
}
fetchUser(username) {
const { dispatch } = this.props;
dispatch(fetchUser(username));
}
render() {...}
}
export default connect((state, ownProps) => {
return {
username: ownProps.params.username,
isAuthenticated: state.auth.isAuthenticated
};
})(Profile);
fetchUser 操作如下所示(redux-api-中间件):
function fetchUser(id) {
let token = localStorage.getItem('jwt');
return {
[CALL_API]: {
endpoint: `http://localhost:3000/api/users/${id}`,
method: 'GET',
headers: { 'x-access-token': token },
types: [FETCH_USER_REQUEST, FETCH_USER_SUCCESS, FETCH_USER_FAILURE]
}
}
}
我添加 componentWillReceiveProps 函数的原因是当 URL 更改为另一个 :username 时做出反应并加载该用户的个人资料信息。乍一看似乎一切正常,但后来我在调试时注意到 componentWillReceiveProps 函数在无限循环中被调用,我不知道为什么。如果我删除 componentWillReceiveProps,那么配置文件不会使用新用户名更新,但我没有循环问题。有什么想法吗?
您的 componentWillReceiveProps
处于无限循环中,因为调用 fetchUser
将调度更新 Props 的操作。
添加比较以检查特定道具在调度操作之前是否发生变化。 编辑:
在 React 16.3+ componentWillReceiveProps
中会慢慢 deprecated.
It is recommended to use
componentDidUpdate
in place ofcomponentWillReceiveProps
componentDidUpdate(prevProps) {
if (this.props.params.username !== prevProps.params.username) {
dispatch(fetchUser(username));
}
}
尝试添加一个条件来比较道具。如果您的组件需要它。
componentWillRecieveProps(nextProps){
if(nextProps.value !== this.props.value)
dispatch(action()) //do dispatch here
}
如果你的 React 路由带有一些路径参数,比如 profile/:username, 您可以简单地比较 props.location.pathname
componentWillReceiveProps(nextProps){
if(nextProps.location.pathname !== this.props.location.pathname){
dispatch()
}
}