Theow Meng Ang
Theow Meng Ang

Reputation: 75

Why are there too many re-render in my program

I am new to react. This errors occurs. Am I using too many useState()? I have been looking at the problems many times, I don't know what happen

The Error Message

-Uncaught Error: Too many re-renders. React limits the number of renders to prevent an 
 infinite loop.
 The above error occurred in the <App> component:
  at App (http://localhost:3000/static/js/bundle.js:261:82)
Consider adding an error boundary to your tree to customize error handling behavior.
Visit https://reactjs.org/link/error-boundaries to learn more about error boundaries.

My AddMember Component.AddMember.js.Am I using too many useState here

import React, { useState } from "react";
import "../src/css/AddMember.css";
const AddMember = (props) => {
  const [nameofmovie, setnameofmovie] = useState("");
  const [moviepic, setmoviepic] = useState("");
  const [leadActor, setleadActor] = useState("");
  const [rating, setRating] = useState("");
  
  function onChangeName(event) {
     setnameofmovie(event.target.value);
  }

  function onChangeImage(event) {
    setmoviepic(event.target.value);
  }

  function onChangeActor(event) {
    setleadActor(event.target.value.split(","));
  }

  function onChangeRating(event) {
    setRating(event.target.value);
  }
  const transferValue = (event) => {
    event.preventDefault();
    const val = {
      name: nameofmovie,
      "picture of image": moviepic,
      "lead actor": leadActor,
      rating: rating,
    };
    props.onSubmitHandler(val);
    clearState();
  };

  const clearState = () => {
    setnameofmovie("");
    setmoviepic("");
    setleadActor("");
    setRating("");
  };
  return (
    <div>
      <div id="topFormLayerOne">
        <form>
          <div id="secondFormLayerTwo">
            <label id="labelTwo">Please key in the Id</label>
            <input
              id="inputThree"
              type="text"
              maxLength="10"
              placeholder="Please key in the Id"
            ></input>
            <label id="labelFour">Movie Names</label>
            <input
              onChange={onChangeName}
              id="inputFour"
              type="text"
              maxLength="100"
              placeholder="Movies Names"
              name="moviesName"
            ></input>
            <label id="labelFive">Picture of Movies</label>
            <input
              onChange={onChangeImage}
              id="inputFive"
              type="file"
              maxLength="100"
              placeholder="Name of Images"
              name="imageName"
            ></input>
            <label id="labelSix">Lead Actor Names</label>
            <input
              onChange={onChangeActor}
              id="inputSix"
              type="text"
              maxLength="500"
              placeholder="Name of Actor"
              name="actorName"
            ></input>
            <label id="labelSeven">Rating</label>
            <input
              onChange={onChangeRating}
              id="inputSeven"
              type="text"
              maxLength="10"
              placeholder="Rating"
              name="movieRating"
            ></input>
            <button onClick={transferValue} id="submitButton">
              Submit
            </button>
            <button id="removeButton">Remove Movie</button>
          </div>
        </form>
      </div>
      
    </div>
  );
};

export default AddMember;

My Member Component.Member.js

import React from "react";

function Members({data}) {
  
  const tableRows = (data) => (data.map((info) => {  
    return(
      <tr key={info.id}>
        <td>{info.id}</td>
        <td>{info.name}</td>
        <td><img src={info["picture of image"]} alt=""></img><
        <td>
          {info["lead actor"]}
        </td>
        <td>{info.rating}</td>
      </tr>
    )
  }))

  return (
    <div>
      <table className="table table-stripped">
        <thead>
          <tr>
            <th>Id</th>
            <th>Name</th>
            <th>Image</th>
            <th>Actors</th>
            <th>Rating</th>
          </tr>
        </thead>
        <tbody>{tableRows}</tbody>
      </table></div>
  );
}

export default Members;

My App Component.My App.js

import dataMovielist from '../src/data/data.json';
import Members from './Members';
import AddMember from './AddMember';
import {useState} from 'react';

function App() {
  
  const [datalist, setdatalist] = useState(dataMovielist);

  const onSubmitHandler = ((newHobbies)=>{
    setdatalist((oldHobbies)=>[newHobbies,...oldHobbies])
  })  

  return (
    
    <div className="App">
       <AddMember onSubmitHandler = {onSubmitHandler()} />
       <Members data={datalist} />   
    </div>
  );
}

export default App;

I don't know what happen. Can you help me solve it

Upvotes: 0

Views: 69

Answers (1)

Neil Girardi
Neil Girardi

Reputation: 4923

I think it's this line: <AddMember onSubmitHandler = {onSubmitHandler()} /> You probably meant to write <AddMember onSubmitHandler={onSubmitHandler} /> The parentheses are causing the function to be invoked immediately as opposed to onSubmit. This is likely triggering a chain reaction.

Also, you want to change this line: <tbody>{tableRows}</tbody> to <tbody>{tableRows(data)}</tbody> to avoid "Functions are not valid a React child" error.

Upvotes: 1

Related Questions