vivek singh
vivek singh

Reputation: 457

On cancel click not able to set previous data in my react app

I have created dynamic fields from JSON data, and I am successfully rendering on UI

Issue

When I click on cancel I am setting the initial data aging but it is not taking, I am using react-form-hook for form validation, there we have reset() function but that too is not working.

What I am doing is

Getting data from main component and setting it to some state variable like below

    useEffect(() => {
    if (li) {
      setdisplayData(li);
      setCancelData(li);
    }
  }, [li]);

and on click of cancel I am doing below

const cancel = () => {
    setdisabled(true); //disbaled true
    console.log(cancelData);
    setdisplayData(cancelData); setting my main data back to previous one
    reset(); // tried this reset of react hook form but it did not work
  };

I am using defaultValue so that when I click on Edit the field should allow me to edit.

Here is my full working code

Upvotes: 1

Views: 1795

Answers (1)

sudo97
sudo97

Reputation: 914

To fix this issue I changed up your code to use value instead of defaultValue. Additionally added an onChange event handler which updates the displayData state whenever <input> changes value. Moreover, you do not need the cancelData state at all since the li prop has the original values.

Now when the onClick for the cancel button is fired, it resets the value of displayData state to whatever li originally was. Here is the modified code:

import React, { useState, useEffect } from "react";
import { useForm } from "react-hook-form";

function component({ li, index }) {
  const [disabled, setdisabled] = useState(true);
  const [displayData, setdisplayData] = useState(null);
  const { register, reset, errors, handleSubmit, getValues } = useForm();

  useEffect(() => {
    if (li) {
      setdisplayData(li);
    }
  }, [li]);

  const Edit = () => {
    setdisabled(false);
  };

  const cancel = () => {
    setdisabled(true);
    console.log(li);
    // Reset displayData value to li
    setdisplayData(li);
    reset();
  };
  return (
    <div>
      <div>
        {disabled ? (
          <button className="btn btn-primary" onClick={Edit}>
            Edit
          </button>
        ) : (
          <button className="btn btn-warning" onClick={cancel}>
            Cancel
          </button>
        )}
      </div>
      <br></br>

      {displayData !== null && (
        <>
          <div className="form-group">
            <label htmlFor="fname">first name</label>
            <input
              type="text"
              name="fname"
              disabled={disabled}
              value={displayData.name}
              // Update displayData.name everytime value changes
              onChange={({ target: { value } }) =>
                setdisplayData((prev) => ({ ...prev, name: value }))
              }
            />
          </div>
          <div className="form-group">
            <label htmlFor="lname">last name</label>
            <input
              type="text"
              name="lname"
              disabled={disabled}
              value={displayData.lname}
              // Update displayData.lname everytime value changes
              onChange={({ target: { value } }) =>
                setdisplayData((prev) => ({ ...prev, lname: value }))
              }
            />
          </div>
        </>
      )}

      <hr></hr>
    </div>
  );
}

export default component;

Hope this helps. Drop a comment if it's still not clear :)

Upvotes: 1

Related Questions