Как исправить умножение Snipcart пользовательских HTML в Гэтсби?
Недавно я перенес сайт на Gatsby[v2] и обнаружил, что пользовательский HTML-код для Snipcart умножается после того, как происходит событие. Как можно предотвратить умножение пользовательского HTML-кода Snipcart при каждом переходе по странице или при возникновении события? Многократный рендеринг виден, когда я открываю модальный. Я не уверен, является ли это проблемой жизненного цикла компонента React или проблемой компонента Gatsby[v2] Layout.
Компонент CustomSnipcartText использует componentDidMount для вызова API Snipcart и использования этих методов для привязки текста к DOM. Компонент CustomSnipcartText импортируется в компонент макета Gatsby. Я попытался импортировать компонент туда, где открывается модальная функция без изменений в результатах.
Пользовательский HTML-компонент Snipcart:
// Binds the Snipcart subscription services to the component
componentDidMount() {
/* global Snipcart:false */
Snipcart.execute('bind', 'cart.opened', function() {
Snipcart.execute('unbind', 'cart.opened')
/* global $: false */
let html = $('#cart-content-text').html()
$(html).insertBefore($('#snipcart-footer'))
})
} ....
Компонент макета GatsbyJs:
export default class Layout extends Component {
render() {
return (
<div className="wrapper">
<CustomSnipcartText /> ...
Я ожидаю, что CustomSnipcartComponent не должен умножаться после любого события.
0 ответов
Когда ваш код запускается, он добавляет новый фрагмент #cart-content-text
но если это не первый раз, он продолжит добавлять больше.
Код Snipcart не знает о введенном вами HTML-коде, поэтому вы обязаны удалить его ИЛИ для обновления его содержимого.
Вам нужно будет добавить логику, чтобы проверить, есть ли там ваш собственный HTML.
Также, Snipcart.subscribe
можно использовать вместо Snipcart.execute
:)
Основываясь на посте Jean-Sébastien Tremblay, я понял, что проблема была в компоненте Gatsby Layout.
В версии 1 компонент макета был специальным компонентом, который действовал как оболочка за пределами компонента страницы. В версии 2 компонент макета является обычным компонентом, где вы оборачиваете его на страницах, которые хотите использовать. Более подробно об этом можно узнать из блога Гэтсби.
Все страницы в этом проекте создаются динамически.
Я использовал gatsby-plugin-layout
переопределить макет из v1. Я переместил компонент из каталога компонентов обратно в каталог макетов и изменил имя файла с Layout.js
в index.js
,