У меня есть основной "App" класс-компонент, который я отдаю в reactDOM.render.
Там у меня есть форма, в которой указан обработчик на сабмит:
<UI.FormLayout onSubmit={this.handleSubmit} v="new" allowSubmit={true} style={{ padding: "0", paddingBottom: "65px" }}>
<GetTest />
<UI.Group title="Отправление результатов">
<UI.List>
<UI.ListItem>
<UI.Input v="new" type="text" placeholder="Your name" label="Ваше имя" required />
</UI.ListItem>
<UI.ListItem>
<UI.Input v="new" type="tel" placeholder="Phone" label="Ваш телефон" required />
</UI.ListItem>
<UI.ListItem>
<UI.Input v="new" type="email" placeholder="E-mail" label="Ваш e-mail" required />
</UI.ListItem>
<UI.ListItem>
<UI.Button appearance="vk-rich" type="submit" value="Submit">Завершить тест</UI.Button>
</UI.ListItem>
</UI.List>
</UI.Group>
</UI.FormLayout>
(На UI и компоненты не обращайте внимания, просто библиотека). (GetTest - получение данных формы по API).
И есть сама функция где я делаю запрос к какому то файлу на сервере:
handleSubmit (event){
event.preventDefault();
console.log("submit complete");
fetch("//some_url.com/api", {
method: "POST",
headers: {
"Content-type": "application/json"
},
mode: "no-cors",
credentials: "include",
body: "response.formData()"
})
.then(result => result.json())
.then(
(result) => {
this.setState({
isLoaded: true,
TestResults: result,
activePanel: 'Results'
});
},
(error) => {
this.setState({
isLoaded: true,
error,
activePanel: 'Error'
});
}
);
}
Но вот чего я не понимаю, если я отправил данные, скрипт на сервере их обработал и ответил какими то данными.json, то как мне потом взять эти данные, обработать и вывести?
Я пробовал делать отдельный класс под это дело, который вызывался в основном App и при успешном получении данных показывался бы, но в самом классе я создаю в state пустой массив, в котором нет тех данных, полученных с сервера да и вообще не понятно, как он у меня связан с функцией обработки сабмита. Код:
class PrintResult extends Component {
constructor(props) {
super(props);
this.state = {
error: null,
isLoaded: false,
TestResults: []
};
}
render() {
const { error, isLoaded, TestResults } = this.state;
if (error) {
return <div>Error: {error.message}</div>;
} else if (!isLoaded) {
return (
<UI.View popout={<UI.ScreenSpinner />} activePanel="spinner" header>
<UI.ScrollView header={{ title: 'Screen Spinner' }} id="spinner">
</UI.ScrollView>
</UI.View>
);
} else {
return (
<UI.Div style={{ padding: '4px 0' }}>
{TestResults.map((item) => (
<UI.Div>
{item}
</UI.Div>
))}
</UI.Div>
);
}
}
}
А результат, постоянной состояние загрузки (!isLoaded) или же просто обновляется страница.
Сам вопрос то в том, как связать все это воедино? Чтобы обработчик сабмита посылал данные, получал данные и сразу их выводил в нужном месте? Подскажите, пожалуйста, что знаете. Ценен любой совет.