As a follow-up to my big disappointment with Vue due to the lack of typed emits, even with TypeScript, I came back to think about a two-way binding input in React. Turns out, it’s pretty trivial to implement.
import { useState } from 'react';
interface TwoWayValue {
value: string;
setValue: (value: string) => void;
}
interface Props {
data: TwoWayValue;
}
function TwoWayInput(props: Props) {
return <input type="text" value={props.data.value}
onChange={e => props.data.setValue(e.target.value)} />;
}
function useTwoWayState(initialValue: string): TwoWayValue {
const [value, setValue] = useState(initialValue);
return { value, setValue };
}
export { TwoWayValue, TwoWayInput, useTwoWayState };
Usage:
import { TwoWayInput, useTwoWayState } from 'two-way-input';
function App() {
const nome = useTwoWayState('');
return <div>
<h1>{nome.value}</h1>
<TwoWayInput type="text" data={nome} />
</div>;
}
Now I’m still wondering about scoped CSS.