在 ReactJS 应用程序中实现 Facebook 评论插件
Implementing Facebook comments plugin in ReactJS app
我正在尝试在当前使用 React Router 的 ReactJS 应用程序中加载 facebook 评论插件。
如果我将 facebook 初始化代码放在我页面的 componentDidMount() 方法中,它会在第一次加载。但是在转到另一个页面然后再次返回它之后,它根本不会加载插件。
我需要做些什么才能让它一直显示吗?
我想我需要删除 facebook init 并重新初始化。但这感觉不对。
有什么建议吗?下面是我的组件代码
```
import React, { Component } from 'react';
import SlidingPanels from '../components/SlidingPanels';
export class Feedback extends Component {
constructor() {
super();
}
componentDidMount() {
$(window).scrollTo(0, '0.5s');
window.fbAsyncInit = function() {
FB.init({
appId : '115517331888071',
cookie : true, // enable cookies to allow the server to access the session
xfbml : true, // parse social plugins on this page
version : 'v2.5' // use version 2.1
});
}.bind(this);
// Load the SDK asynchronously
(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
}
render() {
return (
<div>
<div className="fb-comments" data-href="https://www.facebook.com/cna.net.au/" data-numposts="10"></div>
</div>
);
}
}
``
谢谢,
约翰.
您只需要初始化 JavaScript SDK 一次,因为 componentDidMount
只被调用一次,所以它在哪里都很好。尝试将 FB.XFBML.parse()
放入 componentDidUpdate
:
componentDidUpdate() {
FB.XFBML.parse();
}
我不确定这是否是最佳解决方案,但它应该可行。
您可以将 FB.XFBML.parse()
放在 componentDidUpdate()
中,但它仅在组件更新时有效,因为 componentDidUpdate()
是一种更新生命周期方法。如果您导航到某个其他组件然后返回到它,则此解决方案将不起作用。因为在这种情况下,componentDidMount()
再次调用但没有调用 componentDidUpdate。因此,最好将 FB.XFBML.parse()
放在 componentDidMount()
的顶部。
componentDidMount() {
if(window.FB){
FB.XFBML.parse();
}
// all other code is same
}
我正在尝试在当前使用 React Router 的 ReactJS 应用程序中加载 facebook 评论插件。
如果我将 facebook 初始化代码放在我页面的 componentDidMount() 方法中,它会在第一次加载。但是在转到另一个页面然后再次返回它之后,它根本不会加载插件。
我需要做些什么才能让它一直显示吗?
我想我需要删除 facebook init 并重新初始化。但这感觉不对。
有什么建议吗?下面是我的组件代码
```
import React, { Component } from 'react';
import SlidingPanels from '../components/SlidingPanels';
export class Feedback extends Component {
constructor() {
super();
}
componentDidMount() {
$(window).scrollTo(0, '0.5s');
window.fbAsyncInit = function() {
FB.init({
appId : '115517331888071',
cookie : true, // enable cookies to allow the server to access the session
xfbml : true, // parse social plugins on this page
version : 'v2.5' // use version 2.1
});
}.bind(this);
// Load the SDK asynchronously
(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
}
render() {
return (
<div>
<div className="fb-comments" data-href="https://www.facebook.com/cna.net.au/" data-numposts="10"></div>
</div>
);
}
}
``
谢谢, 约翰.
您只需要初始化 JavaScript SDK 一次,因为 componentDidMount
只被调用一次,所以它在哪里都很好。尝试将 FB.XFBML.parse()
放入 componentDidUpdate
:
componentDidUpdate() {
FB.XFBML.parse();
}
我不确定这是否是最佳解决方案,但它应该可行。
您可以将 FB.XFBML.parse()
放在 componentDidUpdate()
中,但它仅在组件更新时有效,因为 componentDidUpdate()
是一种更新生命周期方法。如果您导航到某个其他组件然后返回到它,则此解决方案将不起作用。因为在这种情况下,componentDidMount()
再次调用但没有调用 componentDidUpdate。因此,最好将 FB.XFBML.parse()
放在 componentDidMount()
的顶部。
componentDidMount() {
if(window.FB){
FB.XFBML.parse();
}
// all other code is same
}