react 常见报错

1. 未加关键字 key

Warning: Each child in a list should have a unique "key" prop.

  • Check the render method of 'Body'.Table 组件没有加 rowKey 导致的。
 record.id}>
// ...
  • Check the render method of 'Cell'.,一般是循环的时候没有加 key 或者 key 不存在导致的, key 要加在最外层。
      return (
        
    {items.map((item: any) => (
  • {item.name || ''}
  • ))}
);

2. 在组件销毁后 setState

Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function.

  • react 在切换路由时报以上错误,实际的原因是因为在组件挂载(mounted)之后进行了异步操作,比如 ajax 请求或者设置了定时器等,而你在callback中进行了setState操作。当你切换路由时,组件已经被卸载(unmounted)了,此时异步操作中callback还在执行,因此setState没有得到值。不能在组件销毁后设置state,防止出现内存泄漏的情况。

(1)在卸载的时候对所有的操作进行清除(例如:abort你的ajax请求或者清除定时器)

componentDidMount = () => {
    //1.ajax请求
    $.ajax('你的请求',{})
        .then(res => {
            this.setState({
                aa:true
            })
        })
        .catch(err => {})
    //2.定时器
    timer = setTimeout(() => {
        //dosomething
    },1000)
}
componentWillUnMount = () => {
    //1.ajax请求
    $.ajax.abort()
    //2.定时器
    clearTimeout(timer)
}

(2)设置一个flag,当unmount的时候重置这个flag

componentDidMount = () => {
    this._isMounted = true;
    $.ajax('你的请求',{})
        .then(res => {
            if(this._isMounted){
                this.setState({
                    aa:true
                })
            }
        })
        .catch(err => {})
}
componentWillUnMount = () => {
    this._isMounted = false;
}

// hooks
function Example(props) {
    const [loading, setLoading] = useState(true);
 
    useEffect(() => {
        let mounted = true;
        fetchAPI.then(() => {
            if (mounted) {
                setLoading(false);
            }
        })
 
        return function cleanup() {
            mounted = false;
        }
    }, [])
 
    return 
...
}

(3)最简单的方式(万金油)

componentDidMount = () => {
    $.ajax('你的请求',{})
    .then(res => {
        this.setState({
            data: datas,
        });
    })
    .catch(error => {
 
     });
}
componentWillUnmount = () => {
    this.setState = (state,callback)=>{
      return;
    };
}

参考

你可能感兴趣的:(react 常见报错)