Deleting items from an array React (infinite re-render loop error)

jbuddy_13

In a small React app, I'm trying to add delete functionality via a button for a list. Presently, I'm attempting this through the deleteItem function, which makes use of array.splice prototype method.

However, I'm encountering the error, Too many re-renders. React limits the number of renders to prevent an infinite loop.. What is the cause of this error? Shouldn't this function only be invoked once, when the button is clicked?

And how can I resolve this error?

import "./styles.css";
import React, { useState, Fragment } from "react";

export default function App() {
  const [items, setItems] = useState(["first item"]);
  const [newItem, setNewItem] = useState("");

  const handleSubmit = (event) => {
    event.preventDefault();
    setItems([newItem, ...items]);
  };

  const handleChange = (event) => {
    setNewItem(event.target.value);
  };

  const deleteItem = (i) => {
    setItems(items.splice(i,1))
  }

  return (
    <div>
      <form>
        <input type="text" value={newItem} onChange={handleChange} />
        <input type="button" value="submit" onClick={handleSubmit} />
      </form>
      <ul>
        {items.map((i) => {
          return (
          <Fragment>
            <li>{i}</li>
              <button
                onClick= {() => deleteItem(i)}> // Amr recommendation
                delete 
              </button>
          </Fragment>
          );
        })}
      </ul>
    </div>
  );
}

Edit: I've taken user, Amr's, recommendation and added a anonymous arrow function to the button. However, a new issue has arisen. I can delete any item up until there exists only one item in the array. The final item cannot be deleted. Why is this?

Amr

you are passing function reference on the onClick handler, change it to an arrow function that triggers the delete method onClick= {()=>deleteItem(i)}>

second thing is that you should add keys to your the parent component when you Map over components to prevent unnecessary behavior.

and the last thing is that in your delete method, you are using Array.prototype.splice(), which returns the item that will be removed, from the items, your requested/ required behavior can be achieved through the Array.prototype.filter() method

  const deleteItem = (i) => {
    setItems(items.filter((item) => item !== i));
  };

This is the final result, it should work fine.

import React, { useState, Fragment } from "react";

export default function App() {
  const [items, setItems] = useState(["first item"]);
  const [newItem, setNewItem] = useState("");

  const handleSubmit = (event) => {
    event.preventDefault();
    setItems([...items, newItem]);
  };

  const handleChange = (event) => {
    setNewItem(event.target.value);
  };

  const deleteItem = (i) => {
    setItems(items.filter((item) => item !== i));
  };
  console.log(items);
  return (
    <div>
      <form>
        <input type="text" value={newItem} onChange={handleChange} />
        <input type="button" value="submit" onClick={handleSubmit} />
      </form>
      <ul>
        {items.map((i, idx) => {
          return (
            <div key={idx}>
              <li>{i}</li>
              <button onClick={() => deleteItem(i)}>delete</button>
            </div>
          );
        })}
      </ul>
    </div>
  );
}

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

React Typescript Infinite loop with render from function

React Infinite scroll, how to not re-render previous items

React infinite render loop

How to avoid re-render infinite loop from event listener (React)

React form validation hook causes infinite re-render loop

Why do I not get into a React infinite re-render loop?

Deleting items from javascript array results in error

useState Array. ERROR Error: Too many re-renders. React limits the number of renders to prevent an infinite loop

React loop data from array in render

React - For Loop conditional render - not working and infinite trigger

React Hooks infinite loop with Array

Render items from 2D Array in React Native JSX

React render from a loop

How can I re-render a view after deleting an object from an array, in Svelte?

Error: Too many re-renders. React limits the number of renders to prevent an infinite loop React Native

react usestate Error: Too many re-renders. React limits the number of renders to prevent an infinite loop

React giving me Error: Too many re-renders. React limits the number of renders to prevent an infinite loop

React : Error: Too many re-renders. React limits the number of renders to prevent an infinite loop

received this error "Error: Too many re-renders. React limits the number of renders to prevent an infinite loop."

Why is useFetcher causing an re-render infinite loop?

Vue.js infinite loop on component re-render

Cause of infinite re-render loop in a class component?

Custom Provider with React Router causes infinite render loop in React 18

Uncaught Error: Too many re-renders. React limits the number of renders to prevent an infinite loop - ProtectedRoutes Component

Error: "Too many re-renders. React limits the number of renders to prevent an infinite loop"

Too many re-renders. React limits the number of renders to prevent an infinite loop. Next js error

"Error: Too many re-renders. React limits the number of renders to prevent an infinite loop."

error too many re-renders. react limits the number of renders to prevent an infinite loop

useState and if statement causing Error: Too many re-renders. React limits the number of renders to prevent an infinite loop