Sobes.tech
Middle

Σύνθετα συστατικά + React Context → μετάδοση του formEntity μέσω του παρόχου στο Form και κατανάλωση στο FormItem. Το Form περικλείει τα παιδιά του σε FormContext.Provider, και το FormItem χρησιμοποιεί cloneElement για να εισάγει την τιμή και το onChange στο Input. Παγίδα: βεβαιωθείτε ότι το FormItem μεταβιβάζει το όνομα στον χειριστή ενημέρωσης. ```javascript const Form = ({ children, formEntity }) => ( <FormContext.Provider value={formEntity}>{children}</FormContext.Provider> ); const FormItem = ({ name, children }) => { const { state, handlers } = useContext(FormContext); return React.cloneElement(children, { value: state[name], onChange: (e) => handlers.updateValues({ name, value: e.target.value }), }); }; ```

sobes.tech AI

Απάντηση από AI

В данном примере используется паттерн Compound Components с React Context для управления состоянием формы.

  • Компонент Form создаёт контекст FormContext и передаёт в него объект formEntity, содержащий состояние формы и методы обновления.
  • FormItem получает из контекста состояние и обработчики, затем с помощью React.cloneElement инъецирует в дочерний элемент (например, <input>) пропсы value и onChange.

Ключевой момент — передача name в обработчик onChange, чтобы обновлять именно нужное поле формы:

onChange: (e) => handlers.updateValues({ name, value: e.target.value })

Без передачи name обновление состояния формы будет некорректным, так как не будет понятно, какое поле изменилось.

Такой подход позволяет централизованно управлять состоянием формы и упрощает работу с вложенными компонентами формы.