当 React 已经渲染时无法刷新更新

2023-12-19

我试图在 API 返回错误时显示警报。对于警报窗口,我使用 sweetalert2。在我的渲染方法中,我正在检查错误消息是否包含内容。如果它包含错误消息,我想向用户显示警报。

当我提交表单时,我会进行 API 调用。如果返回错误,reducer 会更改存储(状态)并再次呈现页面。

由于我添加了下面的行,我不断收到错误:

{saveLabelFetchError && this.toggleAlertFailure(saveLabelFetchError)}

error:

index.js:1375 警告:unstable_flushDiscreteUpdates:无法刷新更新 当 React 已经渲染时。

我的组件:

import React, { Component } from "react";
import PropTypes from "prop-types";
import { connect } from "react-redux";
import { bindActionCreators } from "redux";

import { saveLabelValueRequest } from "../../actions/labels";

import Swal from "sweetalert2";
import "./styles.css";
import Button from "@kof/button";

export class NewLabels extends Component {
  state = {
    labelInput: ""
  };

  inputChangedhandler = e => {
    this.setState({ labelInput: e.target.value });
  };

  toggleAlertFailure = message => {
    Swal.fire({
      type: "error",
      title: "Oops...",
      text: message
    });
  };

  saveLabel = event => {
    event.persist();
    event.preventDefault();
    Swal.fire({
      title: "Are you sure?",
      text: "You won't be able to revert this!",
      type: "warning",
      showCancelButton: true,
      confirmButtonColor: "#3085d6",
      cancelButtonColor: "#d33",
      confirmButtonText: "Yes, save it."
    }).then(result => {
      if (result.value) {
        const labelKeyUuid = this.props.labelKey.uuid;
        const labels = event.target.elements.labels.value;
        this.props.saveLabelValue(labelKeyUuid, labels);
      }
    });
  };

  render() {
    const { load, saveLabelFetchError } = this.props;
    return (
      <div>
        <form onSubmit={this.saveLabel}>
          <textarea onChange={this.inputChangedhandler}></textarea>
          <textarea></textarea>
          <Button onClick={() => load(this.state.labelInput)}>Preview</Button>
          <Button type="submit">Save</Button>
        </form>
        {saveLabelFetchError && this.toggleAlertFailure(saveLabelFetchError)}
      </div>
    );
  }
}

NewLabels.propTypes = {
  saveLabelFetchError: PropTypes.string,
  isFetching: PropTypes.bool,
  labelKey: PropTypes.object,
  saveLabelValue: PropTypes.func
};

NewLabels.defaultProps = {
  saveLabelFetchError: "",
  labelKey: {},
  isFetching: false,
  saveLabelValue: () => {}
};

export default connect(
  state => ({
    saveLabelFetchError: state.labelsStore.saveLabelError,
    isFetching: state.labelsStore.isFetching,
    labelKey: state.labelsStore.labelKey
  }),
  dispatch =>
    bindActionCreators(
      {
        saveLabelValue: saveLabelValueRequest
      },
      dispatch
    )
)(NewLabels);

我想知道为什么我的控制台中不断收到此错误消息。


{saveLabelFetchError && this.toggleAlertFailure(saveLabelFetchError)}

您正在尝试在渲染周期之前(即在组件安装之前)更新 dom。因此,您会收到错误。

理想情况下,您应该避免使用任何直接改变 dom 的库(而不是通过reactAPI)与反应库。您可以阅读更多内容here https://reactjs.org/docs/integrating-with-other-libraries.html

解决方案是检查 props 值是否有变化,如果有则显示错误弹出窗口。并且还要确保我们不会在 React 的渲染周期中改变 dom。


import React, { Component } from "react";
import PropTypes from "prop-types";
import { connect } from "react-redux";
import { bindActionCreators } from "redux";

import { saveLabelValueRequest } from "../../actions/labels";

import Swal from "sweetalert2";
import "./styles.css";
import Button from "@kof/button";

export class NewLabels extends Component {
  state = {
    labelInput: "",
    prevSaveLabelFetchError: ""
  };

  static getDerivedStateFromProps(props, state) {
    if (props.saveLabelFetchError !== state.prevSaveLabelFetchError) {
      this.toggleAlertFailure(props.saveLabelFetchError);
      return {
        prevSaveLabelFetchError: props.saveLabelFetchError
      };
    }
    return null;
  }

  inputChangedhandler = e => {
    this.setState({ labelInput: e.target.value });
  };

  toggleAlertFailure = message => {
    Swal.fire({
      type: "error",
      title: "Oops...",
      text: message
    });
  };

  saveLabel = event => {
    event.persist();
    event.preventDefault();
    Swal.fire({
      title: "Are you sure?",
      text: "You won't be able to revert this!",
      type: "warning",
      showCancelButton: true,
      confirmButtonColor: "#3085d6",
      cancelButtonColor: "#d33",
      confirmButtonText: "Yes, save it."
    }).then(result => {
      if (result.value) {
        const labelKeyUuid = this.props.labelKey.uuid;
        const labels = event.target.elements.labels.value;
        this.props.saveLabelValue(labelKeyUuid, labels);
      }
    });
  };

  render() {
    const { load } = this.props;
    return (
      <div>
        <form onSubmit={this.saveLabel}>
          <textarea onChange={this.inputChangedhandler}></textarea>
          <textarea></textarea>
          <Button onClick={() => load(this.state.labelInput)}>Preview</Button>
          <Button type="submit">Save</Button>
        </form>
      </div>
    );
  }
}

NewLabels.propTypes = {
  saveLabelFetchError: PropTypes.string,
  isFetching: PropTypes.bool,
  labelKey: PropTypes.object,
  saveLabelValue: PropTypes.func
};

NewLabels.defaultProps = {
  saveLabelFetchError: "",
  labelKey: {},
  isFetching: false,
  saveLabelValue: () => {}
};

export default connect(
  state => ({
    saveLabelFetchError: state.labelsStore.saveLabelError,
    isFetching: state.labelsStore.isFetching,
    labelKey: state.labelsStore.labelKey
  }),
  dispatch =>
    bindActionCreators(
      {
        saveLabelValue: saveLabelValueRequest
      },
      dispatch
    )
)(NewLabels);


您还可以看看sweetalert2 的反应包装 https://github.com/sweetalert2/sweetalert2-react-content

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 React 已经渲染时无法刷新更新 的相关文章

  • 如果列表中的某个字符位于该字符之前,请选择该字符

    我有这个正则表达式 a z s gmi 该正则表达式选择 从我的文字中 sme a eliezovce 2015 Spolo ne pre Eur pu Osl vili aj 940 但我只想选择 没有 如果列表中的某些字符 a z 之前
  • JavaScript 原型继承和 html canvas

    我是一名 Ruby 开发人员 最终决定认真学习 JavaScript 所以我买了一些书 开始深入研究 但当我试图理解原型继承时 我很快就陷入了困境 这本书的例子之一如下 给定一个 Shape 其原型有一个绘制方法 以及两个子形状 一个 Tr
  • firebase.storage() 不是玩笑测试用例中的函数

    我正在使用 Jest 来测试我的 firebase 功能 这一切都在浏览器中进行 因此我与服务器端的 firebase 没有任何冲突 当我使用firebase auth or firebase database 一切正常 当我尝试使用时fi
  • AngularJS 和 Apiary.IO - 无法读取任何响应标头?

    我使用 Apiary io 模拟我的 API 但不知怎的 我无法使用 angularJS 从响应对象中读取任何标头 我确信我至少通过检查 firebug 正确设置了 Content Type application json Angular
  • 动态添加jinja模板

    我有一个 jinja 模板 它是一组 div 标签内的唯一内容 div include temppage html div 当我按下按钮时 我想用其他内容替换标签之间的所有内容 我希望用另一个 jinja 模板 include realpa
  • Google javascript 登录 api:无法离线访问

    我正在尝试为服务器端应用程序实现 Google 登录 如 Google 文档中所示 服务器端应用程序的 Google 登录 https developers google com identity sign in web server si
  • 传单圆圈绘制/编辑问题

    我第一次制作传单 并面临绘制圆圈和编辑 更改圆圈位置 的问题 我面临的问题是 编辑 移动 圆从一个位置到另一位置会改变其半径 Note 请尝试在给定的小提琴中在地图顶部创建圆圈 然后通过单击编辑按钮将其移动到底部 如果我在地图的顶部创建圆圈
  • 确定用户是否在shadow dom之外单击

    我正在尝试实现一个下拉菜单 您可以单击外部将其关闭 下拉列表是自定义日期输入的一部分 并且封装在输入的影子 DOM 内 我想写一些类似的东西 window addEventListener mousedown function evt if
  • Bootstrap shown.bs.tab 事件不起作用

    我正在使用灵活的模板 http the8guild com themes html flexy v1 7 stylesPage html 使用引导程序 并且我无法让选项卡上的 shown bs tab 事件正常工作 我已经成功让它发挥作用J
  • 递归链接 Promise

    我正在开发一个简单的 Windows 8 应用程序 我需要在其中从网站获取一组数据 我正在使用 WinJS xhr 来检索此数据 它返回一个 Promise 然后 我将回调传递到此 Promise 的 then 方法中 该方法为我的回调提供
  • 如何在正则表达式中区分数字和ip地址?

    例如 如果我们查看 5 56 和 183 55 0 144 基本上 当你做这样的事情时 d d 它匹配 5 56 189 55 和 0 144 有没有办法通过正则表达式仅匹配数字而不匹配 ip 地址的部分 我尝试使用前瞻 但我不知道它应该是
  • 如何使用 Eclipse 作为 Javascript IDE?

    我从官方下载页面下载了 eclipse Javascript IDE 但是 当我启动应用程序时 它显示 必须提供 Java 运行时环境或 Java 开发工具包才能运行 eclipse 我已经有一个运行良好的 eclipse 的 java I
  • Java:从 ScriptEngine javascript 返回一个对象

    我正在尝试使用 Java 来评估 javascript脚本引擎 https docs oracle com javase 7 docs api javax script ScriptEngine html班级 这是我正在尝试做的事情的一个简
  • 如何使用 ui-router 中的 ui-sref 将参数传递给控制器

    我需要传递和接收两个参数到我想要转换到的状态ui srefui router 的 例如使用下面的链接将状态转换为home with foo and bar参数 a Go to home state with foo and bar para
  • 有效地获取下拉列表中的选定选项(XHTML Select 元素)

    背景 使用 XHTML Select 元素的下拉列表中有大量选项 数十个 我需要使用 JavaScript 检索所选选项 Problem 目前我正在使用 jQuery selectedCSS 选择器并且它按预期工作 但这种方法效率不高 因为
  • JavaScript - 类根据条件扩展

    事情是这样的 我有一个名为 A 的主课 我希望这个班级能够扩展 B 级 class A extends B 但事实上 我希望 B 类在特定条件下扩展 C D 或 E class B extends B1 or class B extends
  • JQuery 验证不起作用

    我有一种表单 其中一个输入类型的值为 名字 但这可以在 onfocus 函数上更改我想验证此输入字段 如果它为空白或 名字 我有两个 jQuery 文件jquery 1 4 2 min js jquery validate pack js
  • 当 mp4 是唯一来源时,自定义 HTML5 视频控件不起作用

    问题 我只有一个视频源 mp4 因为我正在尝试向 tumblr 视频添加自定义控件 如果只有mp4作为源video duration返回为NaN 作为使用 3 个源 mp4 webm ogg 时的测试 它可以工作 所以video durat
  • 具有值的 TextInput 不会更改值

    在我的react native应用程序中 我有一个API 我从中检索数据 并且我在输入值中设置数据 用户应该能够编辑这些输入并更新 但是当我尝试输入输入时它不会输入任何内容并且值保持原样 这是 TextInput 代码
  • d3.js 更新视觉效果

    我有一个与 d3 js 放在一起的树形图 我通过 getJSON 填充数据 效果很好 但是 我在 setInterval 方法中具有此功能 并且它似乎并没有刷新自身 var treemap d3 layout treemap padding

随机推荐

  • IScheduler.Schedule 与 IScheduler.ScheduleAsync?

    IScheduler 接口提供 public static IDisposable Schedule this IScheduler scheduler Action action and public static IDisposable
  • 将 args、kwargs 传递给 run_in_executor

    我正在尝试将参数传递给run in executor像这样 loop run in executor None update contacts data email email access token g tokens access to
  • 如何在 Vue 3 组合 api 中创建 axios 插件

    我正在使用 Vue 3 组合 api 和 typescript 我想制作 Axios 插件在我的项目中使用 这是我的代码 插件 axios js import axios from axios const axiosInstance axi
  • 请详细说明在这种情况下使用“WITH”而不是“TRY CATCH”

    为了处理与 SQLite3 的连接 我研究了WITH关键字并发现它是一个替代品try except finally 据说在文件处理的情况下 WITH 会自动处理关闭文件 我认为与中所述的连接类似泽特代码教程 http zetcode com
  • iOS:如何在调试时观察 NSManagedObject 属性

    正如标题所说 我想调试一些 Core Data 的 bug 而不是使用NSLog在代码中的任何地方 是否可以在 XCode 4 的监视窗口中监视实体的属性 就像 NET的Entity Framework 4 0中的 快速监视 工具一样 任何
  • 为什么简单地使用 State monad 会导致堆栈溢出?

    我正在研究 State monad 我不知道是什么导致了这段简单代码中的堆栈溢出 import Control Monad State Lazy tick State Int Int tick do n lt get put n 1 ret
  • Google iOS 设备策略与使用 Google SSO 的 iOS 应用程序配合不佳

    我们构建了一个使用 Google 登录的 React Native 应用程序 我们用react native google signin并发布 ios 和 android 应用程序 在 Android 应用程序中登录 100 有效 它也适用
  • 在 JavaScript 中创建 DIV 图像 (GIF/PNG)

    我想知道是否有一个 JavaScript 库可以让我从 DIV 的内容生成图像 基本上 这是某些服务器端打印代码所必需的 它需要从浏览器打印背景 我最终想做的是将 DIV 内容编码为 PNG 格式 并通过打印操作发布编码数据 如果这可能的话
  • 如何调用从 C++ 导入的包中定义的 julia 方法?

    我需要一个 C 库来计算复杂参数的多伽玛函数 经过一番谷歌搜索后我发现了这一点 https scicomp stackexchange com questions 23194 i am searching for c code of the
  • 如何更改 PrimeFaces 中面板网格的列宽

    我正在使用 Java EE 和 PrimeFaces 如何更改 PrimeFaces 中面板网格的列宽 有例子吗 您可以使用columnClasses 限定panelGrid 内的列 以下代码设置不同的宽度并将单元格内容与顶部对齐
  • 使用jquery自动完成标签时的utf-8问题

    嘿伙计们 最近我使用jquery自动完成标签 http devthought com projects jquery textboxlist http devthought com projects jquery textboxlist 一
  • 检查字符串中的(仅整个)单词

    Checkio 上的培训 该任务称为流行词 任务是从给定字符串的 字符串 列表中搜索单词 例如 textt When I was One I had just begun When I was Two I was nearly new ww
  • 如何摆脱 PHP 注意:第 123 行 X 中的未定义索引:HTTPS

    我刚刚发现我有数千个此类错误 来自两个相同的文件 我通过使用删除了很多错误isset 但我不知道如何消除最后两个错误 也许你们可以帮助我 PHP Notice Undefined index HTTPS on xxx xxx xxx php
  • 如何验证脚本中的视频文件?

    我有一个包含大量视频文件的服务器 恢复后 我注意到几个文件的校验和发生了变化 由于我没有所有文件的校验和 因此我想编写一个脚本来验证文件完整性 对于档案来说很简单 tar t unzip t rar t等 或图像 convert image
  • 如何从 MSBuild 指定规则集

    升级到 VS 2010 MSBUILD p RunCodeAnalysis true 后无法按预期工作 msbuild solution sln p RunCodeAnalysis true 为了获得更快的构建 我们删除了 DEBUG 构建
  • 对 API 进行速率限制 (spring MVC)

    我正在寻找最有效的方法来实现 或使用已经设置的 速率限制器 以保护我所有的其余 api url 我正在寻找的保护是 每用户每秒调用限制器 我上网查了一下 结果是使用 Redis 或 Guava RateLimiter 说实话我没用过Redi
  • 请解释一下Android中的Context类

    我是安卓新手 有人可以向我解释一下 Context 类 对象的概念吗 这是什么 它将用来做什么 为什么是 Context 类 你见过吗安卓开发者指南 http developer android com reference android
  • 多个点能否组成一个圆? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我有例如20个点 我如何检查这些
  • 通过代码在换行单元格中插入换行符

    Is it possible to insert line break in a wrapped cell through VBA code similar to doing Alt Enter when entering data man
  • 当 React 已经渲染时无法刷新更新

    我试图在 API 返回错误时显示警报 对于警报窗口 我使用 sweetalert2 在我的渲染方法中 我正在检查错误消息是否包含内容 如果它包含错误消息 我想向用户显示警报 当我提交表单时 我会进行 API 调用 如果返回错误 reduce