反应从阵列中删除元素

如何解决反应从阵列中删除元素

希望您一切都好。我环顾了一段时间,一直无法找到解决这个问题的方法。我遇到的问题是我无法从显示的数组中删除一项。之所以无法删除它,是因为一旦该元素显示在子组件中,然后又带回到父组件中,它的 shape 就不再具有与之相同的形状进入子组件。它以数组的形式进入子组件,并以其他形式从对象中作为对象出来。有人可以帮助我理解为什么该对象(凝视)正在改变其形状,以及如何将其形状保存为数组,然后从中删除元素吗?

当数组返回到父组件时,我无法将其保留为数组。

我查看了很多资源,无法弄清楚。我正在尝试从数组中删除一个对象,以便将其从实时反应中删除。问题是,当prevState.mapped(object)从呈现单个卡的组件块返回时,该prevState.mapped(object)未被识别为数组,该单个卡呈现了数组中的每个对象。我相信这与Formik有关。我尝试了以下方法:

  • 我试图用'prevState.etc'作为一个数组设置一个单独的变量,然后将其从数组中删除,然后放入状态。
  • 我已尝试处理组件中正在呈现的数组,,但这也不起作用。我这样做的目的是,一旦它返回到父组件,也许会帮助我使用它,因为它将具有适当的形状。

我四处张望,但我一定不要问正确的问题,因为我无法得到为什么我正在使用的prevState对象一旦返回就不是数组的答案到父组件。我毫不怀疑,解决问题的方法很简单。我已经粘贴了以下相关代码:它按照运行的顺序粘贴:

1。)代码的这一部分进行AXIOS调用,并在成功进行调用后,将数据过滤到卡组件中。

class Organizations extends Component {
  constructor(props) {
    super(props);
    this.state = { organizations: [],mappedOrgs: [] };
  }

  //ORG LOAD
  componentDidMount() {
    paginatedList(0,8).then(this.onOrgSuccess);
  }

  //ORG CALL SUCCESS

  onOrgSuccess = (config) => {
    let organizations = config.item.pagedItems;
    this.setState((prevState) => {
      return {
        ...prevState,mappedOrgs: organizations.map(this.mapOrg),};
    },this.stateChanged);
  };

  mapOrg = (Organization) => (
    _logger(Organization,"ORGANIZATION,ORGANIZATION"),(
      <OrgCard
        Organization={Organization}
        key={Organization.id}
        editOrganization={this.editOrganization}
        deleteFunction={this.deleteFunction}
      />
    )
  );

2。)以下是卡组件中的功能。 “删除句柄”功能也确实遍历了该组件,因此,我也对它进行了描述。显然,它是整体呈现的组件的一部分。

const OrgCard = ({ Organization,editOrganization,deleteFunction }) => {
  //OPERATIONAL FUNCTIONS
  _logger(Organization);

  //DELETE
  const OrgDelete = () => {
    deleteOrg(Organization.id).then(deleteSuccess).catch(deleteToastFail);
  };

  //SUCCESS FUNCTIONS

  const deleteSuccess = () => {
    deleteFunction(Organization);
  };

    <Button
      onClick={OrgDelete}
      className="btn-danger btn-lg center"
      align="center"
    >
      Delete
    </Button>

下面是应该从数组中删除的函数。这是您在上面看到的父级组件,并且与编号为“ 1”的代码主体位于同一代码主体内。令人反感的代码周围有两颗星,实际代码中显然没有两颗星。

  deleteFunction = (deletedOrg) => {
    this.setState((prevState) => {
      const indexOfOrg = **prevState.mappedOrgs**.findIndex(
        (Org) => Org.id === deletedOrg.id
      );
      let updatedOrgs = [...prevState.mappedOrgs];
      if (indexOfOrg >= 0) {
        updatedOrgs.slice(indexOfOrg,1);
      }
      _logger(updatedOrgs);

      return { mappedOrgs: updatedOrgs };
    },this.stateChanged);
  };

我对Formik并不了解,并且对道具的验证也不是很了解,所以我也将其张贴在下面,以防万一。

这是在代码主体中编号为“ 1”的道具验证

Organizations.propTypes = {
  history: PropTypes.shape({
    push: PropTypes.func,}),findIndex: PropTypes.func,deleteFunction: PropTypes.checkPropTypes({
    deletedOrg: PropTypes.number,mappedOrgs: PropTypes.array,updatedOrgs: PropTypes.array,splice: PropTypes.func,indexOfOrg: PropTypes.number,};

我已经尝试了很多事情,甚至在卡片渲染中也进行了道具验证。在这种情况下,它在'2'中。

OrgCard.propTypes = {
  Organization: PropTypes.shape({
    id: PropTypes.number,OrganizationTypeId: PropTypes.number,name: PropTypes.string,description: PropTypes.string,logo: PropTypes.string,locationId: PropTypes.number,phone: PropTypes.string,siteUrl: PropTypes.string,}).isRequired,deleteOrg: PropTypes.func,deleteFunction: PropTypes.func,editOrganization: PropTypes.func,};

这是第一段代码。

class Organizations extends Component {
  constructor(props) {
    super(props);
    this.state = { organizations: [],(
      <OrgCard
        Organization={Organization}
        key={Organization.id}
        editOrganization={this.editOrganization}
        deleteFunction={this.deleteFunction}
      />
    )
  );

  //DELETE

  deleteFunction = (deletedOrg) => {
    this.setState((prevState) => {
      const indexOfOrg = prevState.mappedOrgs.findIndex(
        (Org) => Org.id === deletedOrg.id
      );
      let updatedOrgs = [...prevState.mappedOrgs];
      if (indexOfOrg >= 0) {
        updatedOrgs.slice(indexOfOrg,this.stateChanged);
  };

  //MAP ORG


  editOrganization = (Organization) => {
    this.props.history.push(
      `/organization/${Organization.id}/edit`,Organization
    );
  };
  //RENDER
  render() {
    return (
      <div className="col-12">
        <div className="row">{this.state.mappedOrgs}</div>
      </div>
    );
  }
}

Organizations.propTypes = {
  history: PropTypes.shape({
    push: PropTypes.func,};

export default Organizations;

这是第二段代码。

const OrgCard = ({ Organization,deleteFunction }) => {
  //OPERATIONAL FUNCTIONS
  _logger(Organization);

  //DELETE
  const OrgDelete = () => {
    deleteOrg(Organization.id).then(deleteSuccess).catch(deleteToastFail);
  };

  //SUCCESS FUNCTIONS

  const deleteSuccess = () => {
    deleteFunction(Organization);
  };

  //FAIL FUNCTION

  const deleteToastFail = () => {
    toast.error("Delete Error",{
      closeOnClick: true,position: "top-center",});
  };

  //EDIT

  const handleEdit = () => {
    editOrganization(Organization);
  };

  return (
    <Card className="col-lg-6 col-md-6 col-sm-6">
      {" "}
      <CardHeader style={{ fontWeight: "bold" }} className="text-center">
        {Organization.name}
      </CardHeader>
      <CardBody>
        <CardImg src={Organization.logo} />
        {/* <CardText>
          <span>{Organization.description.slice(0,120)}</span>
        </CardText> */}
        <CardText>
          <span>{Organization.id}</span>
        </CardText>
        <Button
          onClick={handleEdit}
          className="btn-sucess btn-lg center"
          align="center"
        >
          Edit
        </Button>
        <Button
          onClick={OrgDelete}
          className="btn-danger btn-lg center"
          align="center"
        >
          Delete
        </Button>
      </CardBody>
    </Card>
  );
};

OrgCard.propTypes = {
  Organization: PropTypes.shape({
    id: PropTypes.number,};

export default OrgCard;

enter image description here

解决方法

您能否阐明为什么将数组从子级传递回父级?

我相信正确的结构是父级以其状态存储数组。然后可以将数组传递给子级。它还应该将delete函数传递给子级(此函数应将索引作为参数)。此功能在父级中定义。父级通过传递函数名称将函数传递给子级。子级如果要从数组中删除某项,则将调用该函数并将其要删除的项的索引传递给该函数。然后,该函数(位于父对象中)将从其数组(存储在该父对象的状态)中删除该项目。这也将自动导致在子级中显示的数组也进行更新。

这个想法是,数组只能从父级传递到子级。父级应该处理所有数组操作。子级只应通过调用带有相关参数(例如索引)的函数(从父级传递给该函数),将有关数组的信息传递给父级。

,

以下是我最终为这个问题提出的解决方案。希望对其他人有帮助。

  removeFromArray = (deletedCompany) => {
this.setState((prevState) => {
  const indexOfCompany = prevState.Companies.findIndex(
    (removeCompany) => removeCompany.id === deletedCompany.id
  );
  if (indexOfCompany === -1) {
    this.toastErrorDelete();
    return;
  } else {
    const updatedCompanies = [...prevState.Companies];
    updatedCompanies.splice(indexOfCompany,1);
    return { Companies: updatedCompanies };
  }
},this.clearForm());

};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-