Javascript 将GraphQL数据拉入gatsby-browser.js(或更好的解决方案,请)
我正试图在Javascript 将GraphQL数据拉入gatsby-browser.js(或更好的解决方案,请),javascript,reactjs,react-router,graphql,gatsby,Javascript,Reactjs,React Router,Graphql,Gatsby,我正试图在gatsby browser.js()内运行GraphQL查询replaceRouterComponent。然而,我可以从访问数据 这可能不是最好的解决方案,如果您能给我一些建议,我将不胜感激 问题就在这里- 在组件TripAdvisor.js内部,我正在componentDidMount中装载脚本,而locationId是基于this.props.tripAdvisorId的数据从Contentful中创建的个人帖子中提取的。每个post(属性)都有一个单独的locationId,当
gatsby browser.js
()内运行GraphQL查询replaceRouterComponent
。然而,我可以从访问数据
这可能不是最好的解决方案,如果您能给我一些建议,我将不胜感激
问题就在这里-
在组件TripAdvisor.js内部,我正在componentDidMount
中装载脚本,而locationId
是基于this.props.tripAdvisorId
的数据从Contentful中创建的个人帖子中提取的。每个post
(属性)都有一个单独的locationId
,当在脚本src
中更改时,该ID会显示相关的审阅
componentDidMount () {
const tripadvisorLeft = document.createElement("script");
tripadvisorLeft.src = "https://www.jscache.com/wejs?wtype=selfserveprop&uniq=789&locationId=" + this.props.tripAdvisorId + "&lang=en_AU&rating=true&nreviews=0&writereviewlink=true&popIdx=true&iswide=true&border=false&display_version=2";
tripadvisorLeft.async = true;
document.body.appendChild(tripadvisorLeft);
const tripadvisorRight = document.createElement("script");
tripadvisorRight.src = "https://www.jscache.com/wejs?wtype=selfserveprop&uniq=998&locationId=" + this.props.tripAdvisorId + "&lang=en_AU&rating=false&nreviews=4&writereviewlink=false&popIdx=false&iswide=true&border=false&display_version=2";
tripadvisorRight.async = true;
document.body.appendChild(tripadvisorRight);
}
我在页面级的componentDidMount
中还有一个函数,用于重写上面TripAdvisor脚本中的数据。TripAdvisor脚本创建了一个名为injectselfserveprop***(其中***是随机数)的函数。如果没有此功能,则在使用链接到达组件时不会调用此函数
/templates/properties/reviews.js
componentDidMount() {
Object.keys(window).forEach((key) => {
if (key.match(/^injectselfserveprop[0-9]+$/)) {
window[key]();
}
});
}
在/templates/properties/reviews.js的同一个文件中,我使用shouldComponentUpdate
来返回false
,因为当使用链接时,它会阻止TripAdvisor在页面之间不断更新(导致其中断)
shouldComponentUpdate() {
return false;
}
现在,这个解决方案的失败之处在于更改脚本src
的locationId
。如果我不需要按照post
更改locationId
,它就可以正常工作
当链接
到另一个具有不同位置ID
的post
且reviews组件未更新时,它将失败。但是,然后链接
并返回到新评论
您可以看到这种情况发生,并遵循以下步骤-
单击此项并向下滚动查看与Chatelaine相关的评论
然后在菜单>选择Varenna>水平菜单中选择评论,您仍然可以看到Chatelaine评论
现在,单击水平菜单中的>位置>然后再次单击评论>您将获得正确的评论并计算Varenna
完整站点有一个GitHub存储库。要查找的两个文件位于/src/templates/properties/reviews.js
和src/components/properties/TripAdvisor.js
现在我已经概述了我的问题,我认为最好的解决方案是在gatsby browser.js
中使用条件语句将TripAdvisor脚本包装在replaceRouterComponent
中,以仅应用于通过链接直接访问reviews.js
的页面
但是,在使用gatsby browser.js
()中的tripAdvisorID
数据时,我找不到解决方案。然而,我可以使用GraphQL从访问数据
如果您有其他解决方案,请让我知道。好吧,如果您的问题是更新组件,那么问题可能是您处理副作用的方式(组件安装
获取TripAdvisor)
据我所见,您在props中接收到的数据都很好,应该可以获取,但有一个错误componentDidMount
将只调用一次,这是组件第一次加载到页面中。因此,道具更改和再次渲染都无关紧要,不再调用componentDidMount
中的代码
您可以通过两种方式进行修复。相反,您添加了密钥
<TripAdvisor key={tripAdvisorId} name={name} starRating={starRating} location={location} tripAdvisorId={tripAdvisorId} * />
这样react将卸载以前的TripAdvisor并装载一个新的TripAdvisor,从而再次调用componentDidMount方法。。。如果你不得不重新安装所有东西,只是为了从道具中获取不同的数据,那会有什么问题呢
我可以向您推荐第二种方法,这也是他们在中推荐的方法,而不是在componentDidMount
中实现您的更改,而是在componentdiddupdate(prevProps,prevState)
(注意:您需要通过this.props.tripAdvisorId!==prevProps.tripAdvisorId
保护您的获取,否则您将进入无限循环)
我认为这是您更新数据的问题,与盖茨比无关……但如果问题持续存在,请评论我,我可以进一步检查您遇到的GraphQL问题