Мне кажется в задаче немного неверный порядок. Обычное решение следующее:
Кнопке submit делаем атрибут disabled, который проставляется в результате работы функции validate. Внутри validate проверяем - валидная форма или нет. Если валидная - disabled=false и юзер может отправить форму, итого имеем "досерверную валидацию". Затем, если пришла с сервера ошибка - показываем ее и снова ставим disabled=true, до тех пор, пока не будет изменений.
valiadte = () => {
if (форма не валидная) {
return false
}
return true
}
render() {
<form> ...
<button disabled={this.validate()}> отправить </button>
}
...
Главное в том, что вы вызываете this.validate() внутри метода render, а это значит, что на каждое изменение state (ваших данных формы), будет перерендер и следовательно вызов validate. То есть, всегда актуальное состояние.
> Я хочу провалидировать форму после нажатия submit
Зачем? лучше сразу запрещать отправлять форму, если она не валидная. Так и для UI понятнее, и вам код организовать проще будет.