--- title: ControlledInput tags: components,state,effect,intermediate --- Renders an `` element with internal state, that uses a callback function to pass its value to the parent component. - Use object destructuring to set defaults for certain attributes of the `` element. - Use the `React.setState()` hook to create the `value` state variable and give it a value of equal to the `defaultValue` prop. - Use the `React.useEffect()` hook with a second parameter set to the `value` state variable to call the `callback` function every time `value` is updated. - Render an `` element with the appropriate attributes and use the the `onChange` event to upda the `value` state variable. ```jsx function ControlledInput({ callback, type = 'text', disabled = false, readOnly = false, defaultValue, placeholder = '' }) { const [value, setValue] = React.useState(defaultValue); React.useEffect(() => { callback(value); }, [value]); return ( setValue(value)} /> ); } ``` ```jsx ReactDOM.render( console.log(val)} />, document.getElementById('root') ); ```