当前位置: 首页 > 面试题库 >

React-未安装组件上的setState()

向子安
2023-03-14
问题内容

在我的react组件中,我试图在ajax请求进行时实现一个简单的微调器-我使用状态来存储加载状态。

由于某种原因,我的React组件下面的这段代码抛出此错误

只能更新已安装或正在安装的组件。这通常意味着您在未安装的组件上调用了setState()。这是无人值守。请检查未定义组件的代码。

如果我摆脱了第一个setState调用,错误就会消失。

constructor(props) {

  super(props);

  this.loadSearches = this.loadSearches.bind(this);



  this.state = {

    loading: false

  }

}



loadSearches() {



  this.setState({

    loading: true,

    searches: []

  });



  console.log('Loading Searches..');



  $.ajax({

    url: this.props.source + '?projectId=' + this.props.projectId,

    dataType: 'json',

    crossDomain: true,

    success: function(data) {

      this.setState({

        loading: false

      });

    }.bind(this),

    error: function(xhr, status, err) {

      console.error(this.props.url, status, err.toString());

      this.setState({

        loading: false

      });

    }.bind(this)

  });

}



componentDidMount() {

  setInterval(this.loadSearches, this.props.pollInterval);

}



render() {



    let searches = this.state.searches || [];





    return (<div>

          <Table striped bordered condensed hover>

          <thead>

            <tr>

              <th>Name</th>

              <th>Submit Date</th>

              <th>Dataset &amp; Datatype</th>

              <th>Results</th>

              <th>Last Downloaded</th>

            </tr>

          </thead>

          {

          searches.map(function(search) {



                let createdDate = moment(search.createdDate, 'X').format("YYYY-MM-DD");

                let downloadedDate = moment(search.downloadedDate, 'X').format("YYYY-MM-DD");

                let records = 0;

                let status = search.status ? search.status.toLowerCase() : ''



                return (

                <tbody key={search.id}>

                  <tr>

                    <td>{search.name}</td>

                    <td>{createdDate}</td>

                    <td>{search.dataset}</td>

                    <td>{records}</td>

                    <td>{downloadedDate}</td>

                  </tr>

                </tbody>

              );

          }

          </Table >

          </div>

      );

  }

问题是,当应该已经安装了组件时(为什么从componentDidMount调用了它),为什么我会收到此错误?我认为一旦安装了组件,就可以安全地设置状态了?


问题答案:

没有看到渲染功能有点困难。尽管已经可以发现应该执行的操作,但是每次使用间隔时,都必须在卸载时清除它。所以:

componentDidMount() {
    this.loadInterval = setInterval(this.loadSearches, this.props.pollInterval);
}

componentWillUnmount () {
    this.loadInterval && clearInterval(this.loadInterval);
    this.loadInterval = false;
}

由于卸载后仍可能会调用这些成功和错误回调,因此可以使用interval变量检查其是否已安装。

this.loadInterval && this.setState({
    loading: false
});

希望这会有所帮助,如果这样做不起作用,请提供渲染功能。

干杯



 类似资料:
  • 问题内容: 我是使用React的新手,所以这可能真的很容易实现,但是即使我做了一些研究,也无法自己解决。如果这太蠢了,请原谅我。 语境 我正在将Inertia.js与Laravel(后端)和React(前端)适配器一起使用。如果您不知道惯性,则基本上是: Inertia.js使您可以使用经典的服务器端路由和控制器快速构建现代的单页React,Vue和Svelte应用程序。 问题 我正在做一个简单的

  • 问题内容: 可以说我有一个具有条件渲染的视图组件: MyInput看起来像这样: 可以说是真的。每当我将其切换为false并渲染另一个视图时,都只会重新初始化。还会从中预填充值(如果条件更改之前已给出值)。 如果我将第二个渲染例程中的标记更改为如下所示: 似乎一切正常。看起来React只是无法区分’职位-头衔’和’失业原因’。 请告诉我我做错了什么… 问题答案: 可能发生的事情是React认为在渲

  • 我在React中编写一个应用程序,无法避免一个超级常见的陷阱,这是调用后。 我非常仔细地查看了我的代码,并试图将一些保护条款放在适当的位置,但问题仍然存在,我仍在遵守警告。 因此,我有两个问题: 如何从堆栈跟踪中找出哪一个特定组件和事件处理程序或生命周期挂钩导致了规则冲突? 好吧,如何解决问题本身,因为我的代码是在考虑这个陷阱的情况下编写的,并且已经在尝试防止它,但是一些底层组件仍然在生成警告 B

  • 在我的React17.0.1 SPA翻译应用程序中,我有一个包含两个部分的页面。顶部用于输入,底部用于该输入的翻译。我在为该页面使用单个上下文/状态时遇到过问题,因为翻译是由远程API执行的,当它返回时,如果不更新输入部分并将其重置为调用翻译API时所保持的值,我就无法更新UI。 因此,我将页面分成两个上下文,一个用于输入,一个用于翻译。到目前为止还好。翻译的渲染是我第一次做的。但是,尽管翻译上下

  • 总是获取此错误。 更多细节请查看截图

  • 我在用Ubuntu 14.04版在我的系统上安装Android Studio时得到了这个错误。 这个错误发生在我第一次启动Android studio时,它开始下载开发Android应用程序所需的sdk和所有必要的包,然后我得到以下内容 未安装以下SDK组件:Source-25。忽略未知包筛选器“源-25”警告:包筛选器删除了所有包。没有什么要安装的。请考虑尝试在没有包筛选器的情况下再次更新。 我