Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >修复此react内存泄漏

修复此react内存泄漏
EN

Stack Overflow用户
提问于 2020-12-02 21:25:54
回答 1查看 201关注 0票数 0

我需要修复我的应用程序中的内存泄漏,但我不确定如何做。我有一个使用模式的组件,当我添加一个项目时,我得到了错误。这个模式是可重用的,我也在其他组件中使用它。这是主要组件:

代码语言:javascript
运行
AI代码解释
复制
import React, { useState, useEffect } from 'react';
import PropTypes from 'prop-types';
import { Card, Select, Form, Button } from 'antd';
import Table from 'components/Table';
import Modal from '../Modal';

import styles from '../index.module.scss';

const { Item } = Form;
const { Option } = Select;

const PersonForm = ({ details, form }) => {
  const [modalVisible, setModalVisible] = useState(false);

  const [name, setName] = useState(
    details?.name ? [...details?.name] : []
  );

  useEffect(() => {
    form.setFieldsValue({
 
      name: name || [],
    });
  }, [form, details, name]);

  const addName = values => {
    setName([...name, values]);
    setModalVisible(false);
  };

  const removeName = obj => {
    setName([...name.filter(i => i !== obj)]);
  };

  const cancelModal = () => {
    setModalVisible(false);
  };

  return (
    <div>

      <Card
        title="Names
        extra={
          <Button type="solid" onClick={() => setModalVisible(true)}>
            Add Name
          </Button>
        }
      >
        <Table
          tableData={name}
          dataIndex="name"
          removeName={removeName}
        />
      </Card>

      <Item name="name">
        <Modal
          title="Add Name"
          fieldName="name"
          onSubmit={addName}
          visible={modalVisible}
          closeModal={cancelModal}
        />
      </Item>
    </div>
  );
};

PersonForm.propTypes = {
  details: PropTypes.instanceOf(Object),
  form: PropTypes.instanceOf(Object),
};

PersonForm.defaultProps = {
  form: null,
  details: {},
};

export default PersonForm;

这是模态组件:

代码语言:javascript
运行
AI代码解释
复制
import React from 'react';
import PropTypes from 'prop-types';
import { Input, Form } from 'antd';
import Modal from 'components/Modal';
import LocaleItem from 'components/LocaleItem';

const { Item } = Form;

const FormModal = ({ visible, closeModal, onSubmit, fieldName, title }) => {
  const [form] = Form.useForm();

  const layout = {
    labelCol: { span: 8 },
    wrapperCol: { span: 15 },
  };

  const addItem = () => {
    form
      .validateFields()
      .then(values => {
        onSubmit(values, fieldName);
        form.resetFields();
        closeModal(fieldName);
      })
      .catch(() => {});
  };

  const canceledModal = () => {
    form.resetFields();
    closeModal(fieldName);
  };

  return (
    <Modal
      onSuccess={addItem}
      onCancel={canceledModal}
      visible={visible}
      title={title}
      content={
        <Form {...layout} form={form}>
          <Item
            name="dupleName"
            label="Name:"
            rules={[
              {
                required: true,
                message: 'Name field cannot be empty',
              },
            ]}
          >
            <Input placeholder="Enter a name" />
          </Item>
        </Form>
      }
    />
  );
};

FormModal.propTypes = {
  visible: PropTypes.bool.isRequired,
  closeModal: PropTypes.func.isRequired,
  onSubmit: PropTypes.func.isRequired,
  fieldName: PropTypes.string.isRequired,
  title: PropTypes.string.isRequired,
};

FormModal.defaultProps = {};

export default FormModal;

在模式中添加项目时,我在测试文件中遇到内存泄漏。谁能指出为什么会发生这种情况,以及如何解决这个问题?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-03 08:15:14

addItem函数中删除closeModalform.resetFields

代码语言:javascript
运行
AI代码解释
复制
const addItem = () => {
    form
      .validateFields()
      .then(values => {
        onSubmit(values, fieldName); // when this onSubmit resolves it closes the modal, therefor these two lines below will be executed when component is unmounted, causing the memory leak warning
        form.resetFields();
        closeModal(fieldName);
      })
      .catch(() => {});
  };

// instead maybe just:

const [form] = Form.useForm();

<Modal onOk={form.submit}>
  <Form form={form}>
    <Form.Item name="foo" rules={[{ required: true }]}>
      <Input />
    </Form.Item>
  </Form>
</Modal>

而且,据我所知,你不需要调用form.validateFields,因为如果在Form.Item中设置了rules,Ant Design的表单就会自动调用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65116372

复制
相关文章
怎样修复 Web 程序中的内存泄漏
从服务器端渲染的网站切换到客户端渲染的 SPA 时,我们突然不得不更加注意用户设备上的资源,必须做很多工作:不要阻塞 UI 线程,不要使笔记本电脑的风扇疯狂旋转,不要耗尽手机的电池等。我们将交互性和“类应用程序”行为转换成了更好的新型问题,这些问题实际上并不存在在服务端渲染的世界中。
疯狂的技术宅
2020/02/28
3.4K0
怎样修复 Web 程序中的内存泄漏
修复miniblink一处内存泄漏的bug
最后的结论很简单,是我绑定v8 function的时候没释放。但查找问题的过程比较艰难,因为
龙泉寺扫地僧
2019/02/20
1.1K0
内存泄漏
这个笔记是记录一下,关于内存泄漏的知识,之前我们就知道了,如果要用堆必须要释放堆的内存,如果不释放会产生很多的内存垃圾和碎片,影响系统运行效率,甚至出错。
用户7272142
2023/10/11
3860
内存泄漏
Nginx内存内容泄漏-问题复现与修复方案解析
最近HackerOne公布了Nginx内存内容泄漏的问题,如果说内存内容泄漏的问题是个Bug的话,那这个Bug是个比较典型的程序没有对输入异常数据做适当的过滤处理而形成的。
糖果
2020/03/25
6650
修复miniblink 文件编码检测和退出内存泄漏的bug
文本检测的bug原因是我把icu整个都端了,自然icu里检测编码的好用接口也废弃了。不过我扣了一部分出来,用于检测UTF8和GBK编码。剩下的编码,经海绵宝宝
龙泉寺扫地僧
2019/02/20
1.2K0
Nginx内存内容泄漏:问题复现与修复方案解析
最近HackerOne公布了Nginx内存内容泄漏的问题,如果说内存内容泄漏的问题是个Bug的话,那这个Bug是个比较典型的程序没有对输入异常数据做适当的过滤处理而形成的。
FB客服
2020/03/25
1.3K0
leakCanary 内存泄漏
当jvm进行垃圾回收时,无论内存是否充足,如果该对象只有弱引用存在,那么该对象会被垃圾回收器回收,同时该引用会被加入到关联的ReferenceQueue。因此程序通过判断引用队列中是否已经包含指定的引用,来了解被引用的对象是否被GC回收(引用队列存在指定的弱引用,说明对象被回收)
花落花相惜
2021/12/15
1.6K0
java内存泄漏
一般来说,内存泄漏有两种情况,一种情况如在C/C++语言中的,在堆中分配的内存在没有将其释放掉的时候,就将其所有能访问这块内存的方式都删除掉(如,指针重新赋值)。这种情况就像,占着地儿,别人还没办法引用,又没释放空间,内存泄漏。
MickyInvQ
2020/09/27
1.6K0
JavaScript内存泄漏
内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
张炳
2019/08/02
1.4K0
JavaScript内存泄漏
NSURLSession内存泄漏
检查代码是否有leak的时候,发现NSURLSession存在leak,最后发现必须session请求完成后,立即释放,代码如下: - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{ [session finishTasksAndInvalidate]; }
czjwarrior
2018/05/28
2.2K0
内存泄漏漫谈
对于C/C++来说,内存泄漏问题一直是个很让人头痛的问题,因为对于没有GC的语言,内存泄漏的概率要比有GC的语言大得多,同时,一旦发生问题,也严重的多,而且,内存泄漏的排查往往十分困难。对于内存泄漏,维基百科的定义是:在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。内存泄漏的原因通常情况下只能由程序源代码分析出来。如果一个程序存在内存泄
腾讯移动品质中心TMQ
2018/02/06
2.6K0
内存泄漏漫谈
Android 内存泄漏
内存泄漏(Memory Leak):是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
Yif
2019/12/26
2K0
jvm内存泄漏
Runtime.getRuntime().freeMemory()表示当前还有多少空闲内存
全栈程序员站长
2022/08/23
1.6K0
jvm内存泄漏
内存泄漏分析
在内存映像文件导出中详细的介绍了当应用程序出现内存泄露的时候自动导出内存映像文件。在实际的生产环境中主要是使用jamp通过命令行的模式来导出内存镜像文件,下面详细的阐述下这个过程。
无涯WuYa
2022/12/03
2K0
内存泄漏分析
golang 内存分析/内存泄漏
进入交互式模式之后,比较常用的有 top、list、traces、web 等命令。
ppxai
2020/09/23
9.3K0
python 内存泄漏
程序运行时都需要在内存中申请资源用于存放变量,python 在处理内存中的变量时会调用垃圾回收机制,会留心那些永远不会被引用的变量并及时回收变量,删除并释放相关资源。
为为为什么
2022/08/09
2.8K0
python 内存泄漏
内存溢出和内存泄漏
内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。 内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费
在水一方
2022/06/14
3.1K0
内存泄漏和内存溢出
b)创建匿名内部类的静态对象 c)未关闭资源 d)长时间存在的集合容器中创建生命周期短的对象
名字是乱打的
2022/05/13
3.4K0
内存溢出和内存泄漏
通俗的讲就是设备内存不够了。就好比我们的手机,运行内存是4G的,当我们运行了太多的程序时,在运行其他的软件时就会很卡或者提示xx运行停止。
兔云小新LM
2019/07/22
3.2K0
内存泄漏定位
编写java程序最为方便的地方就是我们不需要管理内存的分配和释放,一切由jvm来进行处理,当java对象不再被应用时,等到堆内存不够用时,jvm会进行垃圾回收,清除这些对象占用的堆内存空间,如果对象一直被应用,jvm无法对其进行回收,创建新的对象时,无法从Heap中获取足够的内存分配给对象,这时候就会导致内存溢出。
muntainyang
2020/09/28
1.8K0
内存泄漏定位

相似问题

不了解如何修复此内存泄漏

20

如何在绘制UIImage时修复此内存泄漏?

12

修复内存泄漏

50

修复内存泄漏

26

如何使用React本机ScreenStackFragment修复内存泄漏

113
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档