1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| import React from "react";
export class Form extends React.Component { state = { formData: {}, };
submit = (cb) => { cb && cb({ ...this.state.formData }); };
reset = () => { const { formData } = this.state; Object.keys(formData).forEach((key) => { formData[key] = ""; }); this.setState({ formData }); };
setValue = (name, value) => { const { formData } = this.state; formData[name] = value; this.setState({ formData }); };
render() { const { children } = this.props; const { formData } = this.state; const renderChildren = [];
React.Children.forEach(children, (child) => { if (child.type.displayName === "FormItem") { const { name } = child.props; renderChildren.push( React.cloneElement( child, { key: name, value: formData[name] || "", handleChange: this.setValue, }, child.props.children ) ); } });
return renderChildren; } }
export class FormItem extends React.Component { static displayName = "FormItem";
onChange = (value) => { const { name, handleChange } = this.props; handleChange && handleChange(name, value); };
render() { const { label, value, children } = this.props; return ( <div> <span>{label}</span> {React.isValidElement(children) && children.type.displayName === "FormItem-Input" ? React.cloneElement(children, { onChange: this.onChange, value }) : null} </div> ); } }
export class Input extends React.Component { static displayName = "FormItem-Input"; render() { const { value, onChange } = this.props; return ( <input value={value} onChange={(e) => { onChange && onChange(e.target.value); }} /> ); } }
|