Chadric Gotis
Chadric Gotis

Reputation: 137

useEffect infinite loops when added a Dependency

I've been doing a MERN stack edit page and unfortunately I run into infinite loop when I am including "fields" into my useEffect dependency and works perfectly fine when I removed it, but

React Hook useEffect has a missing dependency: 'fields'. Either include it or remove the dependency array.

shows when I remove it.

Heres my code:

 const EditFields = () => {
  const menu = useSelector((state) => state.menu.menu);
  const loading = useSelector((state) => state.loading.isLoading);
  const [fields, setFields] = useState({
    name: "",
    description: "",
    price: "",
 });

  useEffect(() => {
    if (menu) {
      setFields({
        ...fields,
        name: menu.name,
        description: menu.description,
        price: menu.price,
        dishImage: menu.dishImage,
        imgData: menu.dishImage,
      });
    }
  }, [menu,fields]);

  return (
    <>
      {!loading ? (
        <div className="add-menu">
          <p className="head">Add Menu</p>
          <form>
            <div className="add-fields">
              
              <div className="group-field">
                <label>*Menu Name</label>
                <input
                  type="text"
                  className="fileBtn"
                  placeholder="Menu Name"
                  value={fields.name}
                  onChange={(e) =>
                    setFields({ ...fields, name: e.target.value })
                  }
                  required
                />
              </div>
              <div className="group-field">
                <label>*Price</label>
                <input
                  type="number"
                  placeholder="Price"
                  value={fields.price}
                  onChange={(e) =>
                    setFields({ ...fields, price: e.target.value })
                  }
                  required
                />
              </div>
              <div className="group-field">
                <label>*Description</label>
                <textarea
                  cols="30"
                  rows="10"
                  placeholder="Menu Description"
                  value={fields.description}
                  onChange={(e) =>
                    setFields({ ...fields, description: e.target.value })
                  }
                  required
                ></textarea>
                <input type="submit" value="submit" />
              </div>
            </div>
          </form>
        </div>
      ) : (
        <h1>Loading...</h1>
      )}
    </>

Upvotes: 0

Views: 65

Answers (1)

Nikita Madeev
Nikita Madeev

Reputation: 4380

In your case useEffect call every time when fields changed, but inside useEffect you change fields, therefore we get an endless loop. You can pass the function to setState the first argument of which will be the current state value.

useEffect(() => {
    if (menu) {
        setFields(prevFields => ({
            ...prevFields,
            name: menu.name,
            description: menu.description,
            price: menu.price,
            dishImage: menu.dishImage,
            imgData: menu.dishImage,
        }));
    }
}, [menu]);

Upvotes: 2

Related Questions