Общие косяки:
1) Дублировать props в state - моветон. Используйте defaultValue на инпутах.
2)
Строковые рефы - моветон. И вообще, тут рефы не нужны - по изменению инпута нужно отдавать значение родителю через коллбэк, принятый в props
По данному примеру
1) Greeter в методе render не передает нужные props дочерним компонентам
2) Внутри компонента формы храните состояние и передавайте его в props.onSubmit
Небольшой оффтоп
Вместо привязки контекста функции в конструкторе можно писать так:
class Foo {
onSubmit = (event) => {
// "this" is correct instance
};
}