Giter Club home page Giter Club logo

Comments (5)

erashu212 avatar erashu212 commented on June 21, 2024 2

You can also try this way

import * as React from "react";
import { useForm } from "react-hook-form";
import Headers from "./Header";
import "./styles.css";

let renderCount = 0;

export default function App() {
  const { register, handleSubmit, setValue, watch } = useForm({
    defaultValues: {
      firstName: "",
      lastName: "",
      checkbox: [],
      radio: "",
      message: "",
    },
  });

  const checkboxValue = watch("checkbox", [])

  const handleCheckboxChange = React.useCallback((e) => {
    const { checked, value } = e.target;
    const newValue = checked ? [...checkboxValue, value] : checkboxValue.filter((v) => v !== value) 
    setValue("checkbox", newValue);
  }, [setValue, checkboxValue]);

  const onSubmit = (data) => console.log(data);

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <Headers renderCount={renderCount} />
      <input
        {...register("checkbox")}
        type="checkbox"
        value="A"
        onChange={handleCheckboxChange}
      />
      <input
        {...register("checkbox")}
        type="checkbox"
        value="B"
        onChange={handleCheckboxChange}
      />
      <input
        {...register("checkbox")}
        type="checkbox"
        value="C"
        onChange={handleCheckboxChange}
      />

      <div style={{ border: "1px solid red", padding: 12 }}>
        <h2>THIS IS A MODAL</h2>
        <p>Duplicated checkboxes with the same values!</p>
        <input
          {...register("checkbox")}
          type="checkbox"
          value="A"
          onChange={handleCheckboxChange}
        />
        <input
          {...register("checkbox")}
          type="checkbox"
          value="B"
          onChange={handleCheckboxChange}
        />
        <input
          {...register("checkbox")}
          type="checkbox"
          value="C"
          onChange={handleCheckboxChange}
        />
      </div>
      <input type="submit" />
    </form>
  );
}

from react-hook-form.

bluebill1049 avatar bluebill1049 commented on June 21, 2024 1

honestly not sure if we support your usage with multiple checkbox groups in different components.

from react-hook-form.

damian-balas avatar damian-balas commented on June 21, 2024 1

@bluebill1049 Oh.. that's bad. I need to have 2 forms that are in sync. Is there a correct way to handle it using RHF?

Thanks for your fast feedback.
Really appreciate it :)

from react-hook-form.

erashu212 avatar erashu212 commented on June 21, 2024 1

@damian-balas Do you mean if you update any value from form1 automatically those values should be appeared in modal form2?
If that is the case.

import { useEffect } from 'react';
import { useForm } from 'react-hook-form';

const useFormSync = (forms) => {
  useEffect(() => {
    const syncForms = (updatedForm, updatedValues) => {
      forms.forEach((form) => {
        if (form !== updatedForm) {
          Object.keys(updatedValues).forEach((name) => {
            form.setValue(name, updatedValues[name]);
          });
        }
      });
    };

    const unsubscribe = forms.map((form) =>
      form.watch((values) => syncForms(form, values))
    );

    return () => {
      unsubscribe.forEach((unsub) => unsub());
    };
  }, [forms]);
};

// Usage
function YourComponent() {
  const form1 = useForm();
  const form2 = useForm();

  useFormSync([form1, form2]);

  return (
    <>
      {/* Form 1 */}
      <form>
        <input name="field1" ref={form1.register} />
        <input name="field2" ref={form1.register} />
      </form>

      {/* Form 2 */}
      <form>
        <input name="field1" ref={form2.register} />
        <input name="field2" ref={form2.register} />
      </form>
    </>
  );
}

export default YourComponent;

from react-hook-form.

damian-balas avatar damian-balas commented on June 21, 2024

@erashu212 Thanks for your feedback!
I'll try it out soon and come back with some info :)

from react-hook-form.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.