Инициализируйте значения так, чтобы компонент появлялся, когда JavaScript отключен
У меня есть 3 компонента на сайте, построенном в GatsbyJS (генератор статических сайтов, построенный на React).
Один компонент предоставляет данные из API и передает их в обернутый компонент через шаблон рендеринга.
class FetchData extends React.Component {
state = {
contactData: {
firstName: "",
lastName: "",
email: "",
},
isLoaded: false,
};
componentDidMount() {
const { email } = this.props;
fetch("some_api_endpoint")
.then(res => res.json())
.then(({ firstName, lastName, email }) => {
this.setState({
contactData: {
firstName,
lastName,
email,
},
isLoaded: true
});
});
// Fallback if API fails
setTimeout(() => {
this.setState({
isLoaded: true,
});
}, 1500);
}
render() {
return this.props.children(this.state);
}
}
InnerForm зависит от isLoaded
prop, чтобы определить, показывать ли форму или значок загрузки.
class OuterForm extends React.Component {
render() {
return (
<FetchData>
{({ contactData, isLoaded }) => (
<InnerForm contactData={contactData} isLoaded={isLoaded} />
)}
</FetchData>
)
}
}
class InnerForm extends React.Component {
render() {
const { isLoaded, contactData } = this.props;
return isLoaded
? <Form contactData={contactData} />)
: <LoadingIcon />;
}
}
Проблема в том, что когда сайт статически построен, а JS отключен в браузере, страница застряла со значком загрузки, а форма никогда не отображается.
Я полагаю, что это связано с тем, что Гэтсби строит сайт с начальными значениями поддержки и состояния, которые получает каждый компонент, что в этом случае статически отображает LoadingIcon
вместо формы, потому что isLoading initialized
как ложь
Каким было бы решение, обеспечивающее визуализацию формы, когда JS отключен, не откладывая хакерскую опцию инициирования FetchData
состояние компонента в isLoading: true
?