javascript – 为什么在类构造函数中使用setState方法时React会抛出错误?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 为什么在类构造函数中使用setState方法时React会抛出错误?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2150字,纯文字阅读大概需要4分钟。
内容图文
我知道为尚未挂载的组件设置状态时会引发错误.这解释了我从使用setState函数得到的错误,而不是明确地直接设置状态.
import React, {Component} from 'react';
class SearchBar extends Component {
constructor(props) {
super(props);
this.state = {term: ''}; // -> seems to be the agreed means to set initial state
// this.setState({term: ''}); // -> generates an error
}
render() {
return (
<div>
<input onChange={event => this.setState({term: event.target.value})}/>
Value of the input: {this.state.term}
</div>
);
}
}
The error I get when I uncomment the second line this.setState({term: ”}) is:
警告:setState(…):只能更新已安装或安装的组件.这通常意味着您在已卸载的组件上调用了setState().这是一个无操作.请检查该组件的代码.
我知道如何防止错误,只需明确设置状态而不告诉React有关它的任何内容,我已经看到了github问题,谈论了这个bug:Github Issue #3878我想知道的是为什么不能反应出来呢?如果从构造函数中调用setState,它知道这是第一次使用它吗?我可能太简单了,但如果有人有一个很好的技术答案,为什么不呢?
解决方法:
React类总是使用一个名为state的属性初始化,设置为值为null,如source code所示.如您所知,React提供了一个setState方法来操作此属性.根据docs:
setState() does not immediately mutate this.state but creates a pending state transition. Accessing this.state after calling this method can potentially return the existing value.
There is no guarantee of synchronous operation of calls to setState and calls may be batched for performance gains.
setState() will always trigger a re-render unless conditional rendering logic is implemented in shouldComponentUpdate().
简而言之,setState()是一个异步的,多步骤,不可预测的操作,它将导致组件重新出现.要调用这样的函数,需要一个对象已经完全初始化,因此在类仍在挂载时不会发生.在完全初始化之前,它已经尝试在类上执行生命周期操作.
当然,如果您希望组件以非空状态开始并且不希望立即导致多个渲染和操作发生,则会出现问题.这就是为什么React提供了一种初始化组件状态而不依赖于setState的方法.在ES5中,这是在一个名为getInitialState的属性中设置初始状态.但是,当使用特殊的constructor方法初始化类时,ES6引入了用于设置属性的本机语法(因此React不再需要自己的自定义版本).这就是为什么,如果要在安装时使用状态初始化React组件,则必须将其声明为this.state = {},而不是使用setState().
内容总结
以上是互联网集市为您收集整理的javascript – 为什么在类构造函数中使用setState方法时React会抛出错误?全部内容,希望文章能够帮你解决javascript – 为什么在类构造函数中使用setState方法时React会抛出错误?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。