Вы используете dangerouslySetInnerHTML
для компонента Text
, который является абзацем styled-component
. Проблема в том, что после добавления содержимого вы получаете p из содержимого, вложенного в этот элемент p. Это нестандартная разметка, и поэтому браузеры должны преобразовать ее в разборчивую разметку.
Таким образом, этот вид разметки <p><p></p></p>
часто будет отображаться как <p></p><p></p>
.
This на самом деле именно то, что происходит в вашем случае. Я позволил себе найти репозиторий GitHub для этого проекта и провел следующий эксперимент:
Я построил проект и искал родительский элемент p в сгенерированном Gatsby html. Вот оно:
Абзац с классом blog__Text...
является вашим стилевым компонентом p, и вы можете ясно видеть, что он содержит другие элементы p который является нестандартным.
Затем я открыл этот файл в веб-браузере и проверил сгенерированную разметку:
... Сюрприз! Ваш компонент Text
теперь пуст. Браузер, не зная ничего лучшего, выберет для удаления его содержимое и добавит его прямо рядом с ним. После повторной визуализации компонента он не будет содержать ничего. Поскольку это происходит за пределами React, компонент не будет повторно обработан новым содержимым, поскольку React не знает, что это произошло.
Если вы ограничите скорость своего соединения и попытаетесь получить доступ к странице, которую вы действительно может видеть содержимое в течение некоторого времени, пока страница загружена не полностью. Это происходит потому, что Гэтсби сначала выводит чистый html в браузер, прежде чем React вступит во владение. Затем вы кратко видите испорченное html представление вашей страницы до тех пор, пока компонент не будет отрисован, и все не встанет на свои места.
Решение
Как вы уже догадались, вам не следует вкладывать p
элементов. Вместо этого вы должны использовать dangerouslySetInnerHTML
в родительском div для вашего контента.
Вместо:
<Body>
<Text dangerouslySetInnerHTML={{ __html: item.html }} />
</Body>
Использование:
<Body>
<div dangerouslySetInnerHTML={{ __html: item.html }} />
</Body>
Я пробовал именно это и все работает как положено.