×超过最大更新深度

时间:2019-04-09 08:06:30

标签: reactjs

  

已超过最大更新深度。当一个组件发生这种情况   重复调用componentWillUpdate内的setState或   componentDidUpdate。 React将嵌套更新的数量限制为   防止无限循环。

这是bossinfo.js

import React from 'react';
import { NavBar, InputItem, TextareaItem, Button } from 'antd-mobile';
import {connect} from 'react-redux';
import {Redirect} from 'react-router-dom';
import AvatarSelector from '../../component/avatar-selector/avatar-selector';
import {updata} from '../../redux/user.redux';


@connect(
    state=>state.user,
    {updata}
)
class BossInfo extends React.Component{
    constructor(props){
        super(props)
        this.state={
            title:'',
            company:'',
            money:'',
            desc:'',
        }
    }
    onChange(key,v){
        this.setState({
            [key]:v
        })
    }
    render(){
        return (
            <div>
                {this.props.redirectTo?<Redirect to={this.props.redirectTo}></Redirect>:null}
                <NavBar mode="dark">Boss完善信息页面</NavBar>
                <AvatarSelector selectAvatar={(imagename)=>{
                    this.setState({
                        avatar:imagename
                    })
                }}></AvatarSelector>
                <InputItem onChange={(v)=>{this.onChange('title',v)}}>
                    招聘职位
                </InputItem>
                <InputItem onChange={(v)=>{this.onChange('company',v)}}>
                    公司名称
                </InputItem>
                <InputItem onChange={(v)=>{this.onChange('money',v)}}>
                    职位薪资
                </InputItem>
                <TextareaItem
                 title='职位要求'
                 rows={3}
                 autoHeight
                 onChange={(v)=>{this.onChange('desc',v)}}
                >
                </TextareaItem>
                <Button onClick={()=>this.props.updata(this.state)} type='primary'>保存</Button>
            </div>
        )
    }
}

export default BossInfo;

这是user.redux.js

import axios from "axios";
import { getRedirectPath } from '../util' ;

const AUTH_SUCCESS  = 'AUTH_SUCCESS';
const ERROR_MSG  = 'ERROR_MSG';
const LOAD_DATA  = 'LOAD_DATA';

const initStatus={
    redirectTo:'',
    msg:'',
    user:'',
    type:'',
}
//reducer
export function user(state=initStatus,action){
    switch(action.type){
        case AUTH_SUCCESS:
            return {...state,msg:'',redirectTo:getRedirectPath(action.data),...action.data}
        case LOAD_DATA:
            return {...state,...action.data}
        case ERROR_MSG:
            return {...state,isAuth:false,msg:action.msg}
        default:
            return state;
    }
}

//action
function authSuccess(data){
    return { type:AUTH_SUCCESS, data:data }
}
function errorMsg(msg){
    return { type:ERROR_MSG, msg:msg }
}
export function register({user,pwd,repeatpwd,type}){
    if(!user || !pwd){
        return errorMsg('用户名密码必须输入!')
    }
    if(pwd!=repeatpwd){
        return errorMsg('两次密码输入不一致!')
    }
    //redux-thunk支持返回函数的写法(这边是异步)
    return dispatch =>{
        axios.post('/user/register',{user,pwd,type}).then(res=>{
            if(res.status==200&&res.data.code==0){
                dispatch(authSuccess({user,pwd,type,_id:res.data.data._id}))
            }else{
                dispatch(errorMsg(res.data.msg))
            }
        })
    }
}

export function login({user,pwd}){
    if(!user || !pwd){
        return errorMsg('用户名和密码不能为空!')
    }
    return dispatch =>{
        axios.post('/user/login',{user,pwd}).then(res=>{
            if(res.status==200 && res.data.code==0){
                dispatch(authSuccess(res.data.data))
            }else{
                dispatch(errorMsg(res.data.msg))
            }
        })
    }
}

export function loadData(userinfo){
    return {type:LOAD_DATA,data:userinfo}
}

export function updata(data){
    return dispatch=>{
        axios.post('/user/updata',data)
            .then(res=>{
                if(res.status==200 && res.data.code==0){
                    dispatch(authSuccess(res.data.data))
                }else{
                    dispatch(errorMsg(res.data.msg))
                }
            })
    }
}

您为什么继续报告此问题?指示的方向有误吗?寻求帮助

1 个答案:

答案 0 :(得分:0)

在每个渲染器上执行onChange函数,将函数更改为箭头函数,如

    onChange=(key,v)=>{
     v.stopPropagation();
        this.setState({
            [key]:v
      })
}