Home > front end >  How can I reduce duplication in react while using useState?
How can I reduce duplication in react while using useState?

Time:08-24

I am using useState in react native. I created a state called lstandtime and lacttime.

I also created functions called onSubmitfunc and LsonChangefunc and LaconChangefunc.

We need 3 components called MainCons, so we made 3 components. But it could be three or more.

As you can see, the format of each component, state, and function are all similar, but three are needed, so a number is attached to the end of the variable.

I want to reduce duplicate code, but how do I do it?

this is my code

function Component() {
  const [lstandtime1, setLstandtime1] = useState("");
  const [lacttime1, setLacttime1] = useState("");

  const [lstandtime2, setLstandtime2] = useState("");
  const [lacttime2, setLacttime2] = useState("");

  const [lstandtime3, setLstandtime3] = useState("");
  const [lacttime3, setLacttime3] = useState("");

  const onSubmitfunc1 = useCallback(
    (e) => {
      e.preventDefault();
    },
    [lstandtime1, lacttime1],
  );

  const LsonChangefunc1 = useCallback((e) => {
    e.preventDefault();
    setLstandtime1(e.target.value);
  }, []);

  const LaconChangefunc1 = useCallback((e) => {
    e.preventDefault();
    setLacttime1(e.target.value);
  }, []);

  const onSubmitfunc2 = useCallback(
    (e) => {
      e.preventDefault();
    },
    [lstandtime2, lacttime2],
  );

  const LsonChangefunc2 = useCallback((e) => {
    e.preventDefault();
    setLstandtime2(e.target.value);
  }, []);

  const LaconChangefunc2 = useCallback((e) => {
    e.preventDefault();
    setLacttime2(e.target.value);
  }, []);

  const onSubmitfunc3 = useCallback(
    (e) => {
      e.preventDefault();
    },
    [lstandtime3, lacttime3],
  );

  const LsonChangefunc3 = useCallback((e) => {
    e.preventDefault();
    setLstandtime3(e.target.value);
  }, []);

  const LaconChangefunc3 = useCallback((e) => {
    e.preventDefault();
    setLacttime3(e.target.value);
  }, []);

  return (
    <>
      <MainCons onClick={onSubmitfunc1}>
        <input value={lstandtime1} onChange={LsonChangefunc1} />

        <input value={lacttime1} onChange={LaconChangefunc1} />
      </MainCons>

      <MainCons onClick={onSubmitfunc2}>
        <input value={lstandtime2} onChange={LsonChangefunc2} />

        <input value={lacttime2} onChange={LaconChangefunc2} />
      </MainCons>

      <MainCons onClick={onSubmitfunc3}>
        <input value={lstandtime3} onChange={LsonChangefunc3} />

        <input value={lacttime3} onChange={LaconChangefunc3} />
      </MainCons>
    </>
  );
}

CodePudding user response:

Maybe declare an object with all these properties and then use them as parameters at your update functions.

See my example code below. This is just a snippet to give you the idea.

const [options, setOptions] = useState({ lstandtime1: '', lacttime1: '', lstandtime2: '', lacttime2: '', lstandtime3: '', lacttime3: '' })


const changeFunction = useCallback((e, property) => {
      e.preventDefault();
      setOptions({...options, [property]: e.target.value})
    }, []);
    
          <input
      value={options.lacttime1}
      onChange={e => changeFunction(e, 'lacttime1')}
      />

If you need more than these and you want to go further, you could create a loop

let obj = {}
for (let i = 1; i < 10; i  ) {
  obj['lstandtime'   i] = '';
  obj['lacttime'   i] = '';
}

and then parametrize your MainCons component with these values using Object.entries

Edit Cannot test my code but I thought about AKX's comment and i wrote this solution. It's cleaner and I hope it helps you

function Component() {
  const size = 5;
  const [lstandtime, setLstandtime] = useState([...new Array(size).fill('')])
  const [lacttime, setLacttime] = useState([...new Array(size).fill('')])

  const onSubmitfunction = useCallback(deps => e => {
      e.preventDefault();
    },
     deps,
  );

  const LsonChangefunction = useCallback(index => e => {
    e.preventDefault();
    setLstandtime([...lstandtime, [index]: e.target.value]);
  }, []);

  const LaconChangefunction = useCallback(index => e => {
    e.preventDefault();
    setLacttime([...lacttime, [index]: e.target.value]);
  }, []);

  return (
    <>
    ({lstandtime.map((val, index) => {
        return (
          <MainCons onClick={e => onSubmitfunction([lstandtime[index], lacttime[index]])}>
            <input value={lstandtime[index]} onChange={LsonChangefunction(index)} />

            <input value={lacttime[index]} onChange={LaconChangefunction(index)} />
          </MainCons>
        )
    })
    })
    </>
  );
}

CodePudding user response:

const SupComponet = () => {
    const [lstandtime1, setLstandtime1] = useState('');
    const [lacttime1, setLacttime1] = useState('');
    const onSubmitfunc1 = useCallback((e) => {
      e.preventDefault();


    }, [lstandtime1, lacttime1]);


    const LsonChangefunc1 = useCallback((e) => {
      e.preventDefault();
      setLstandtime1(e.target.value)
    }, []);


    const LaconChangefunc1 = useCallback((e) => {
      e.preventDefault();
      setLacttime1(e.target.value)
    }, []);
    return <MainCons onClick={onSubmitfunc1}>
      <input
      value={lstandtime1}
      onChange={LsonChangefunc1}
      />

      <input
      value={lacttime1}
      onChange={LaconChangefunc1}
      />
    </MainCons>
}

const MainComponent = () => {
    return <>{new Array(3).fill(0).map((_) => <SupComponent />)}</>
}

CodePudding user response:

If you have multiple states of the same kind you could use an array as mentioned by @AKX in the comments:

function Component() {
  const [mainCons, setMainCons] = useState(new Array(3).fill({
    lstandtime: "", 
    lacttime: "",
  }));

  const onSubmitfunc = useCallback((idx) => (e) => {
      e.preventDefault();
    },
    [mainCons],
  );

  const LsonChangefunc = useCallback((idx) => (e) => {
    e.preventDefault();
    setMainCon((current) => ([
      ...current.slice(0, idx),
      {
        ...current[idx],
        lstandtime: e.target.value,
      }
      ...current.slice(idx 1),
    ]));
  }, []);

  const LaconChangefunc = useCallback((idx) => (e) => {
    e.preventDefault();
    setMainCon((current) => ([
      ...current.slice(0, idx),
      {
        ...current[idx],
        lacttime: e.target.value,
      }
      ...current.slice(idx 1),
    ]));
  }, []);

  return (
    <>
      {mainCons.map((mainCon, idx) => (
        <MainCons onClick={onSubmitfunc(idx)}>
          <input value={mainCon[idx].lstandtime} onChange={LsonChangefunc(idx)} />
          <input value={mainCon[idx].lacttime1} onChange={LaconChangefunc(idx)} />
        </MainCons>
      )}
    </>
  );
}
  • Related