Помимо создания функции, которое само по себе не такая затратная операция, в компонент каждую перерисовку будет приходить новая ссылка, что при сравнении свойств вызовет его обновление.
Читаемость кода с таким подходом так же хуже.
Определяйте хандлеры в классовых компонентах свойствами класса, а в функциональных используйте хук useCallback.
Реальную разницу в производительности вы можете замерить с помощью бенчмарков и вкладок Performance и React Profiler в Dev Tools.
Что касается хранения состояния форм в redux, то в большинстве случаев в этом нет необходимости.
Насколько я понял, вы хотите использовать анонимные функции, потому что у вас возникли проблемы с определением имени обновляемого свойства в колбеке. Решение этой задачи:
const Example = () => {
const [order, setOrder] = useState({
building: '',
otherProp: '',
});
const handleChange = useCallback(e => {
const { name, value } = e.target;
setOrder(s => ({ ...s, [name]: value }));
}, []);
return (
<Input
name="building"
onChange={handleChange}
value={order.building}
/>
);
};
Версия с redux
Меняем редьюсер так, чтобы по действию updateOrder он принимал только измененные свойства и подмешивал их к старому значению order. Это позволит не добавлять зависимость в useCallback, да и вообще более правильное решение.
const Example = () => {
const dispatch = useDispatch();
const order = useSelector(orderSelector);
const handleChange = useCallback(e => {
const { name, value } = e.target;
dispatch(updateOrder({ [name]: value }));
}, []);
return (
<Input
name="building"
onChange={handleChange}
value={order.building}
/>
);
};
Этот прием описан в документации:
Обработка нескольких полей ввода