Facebook 社交插件评论部分被类名隐藏(ReactJS)

IT技术 facebook reactjs facebook-javascript-sdk facebook-social-plugins
2021-05-23 04:41:58

我正在使用 ReactJS(由 Facebook 开发),我目前在显示 Facebook 社交插件的评论部分时遇到问题......有点讽刺,但嘿,他们自己没有为react制作插件。

无论如何,我已经在我的代码中插入了不同的元素来添加注释部分。当我加载页面时,我可以看到该部分正在加载!(不到一秒钟)但它很快消失了。我检查了 facebook 生成的代码,发现它添加到我的元素类中:FB_hide_iframes。我尝试删除它,该部分显示在我的页面中!

问题是我不知道如何控制添加到我的组件中的类。

正如你所看到的,评论部分是存在的,但它被我没有放在那里的类 FB_hide_iframes 隐藏。

这是在我的主页 (home.js) 中添加该部分的代码

componentDidMount() { 
...
window.fbAsyncInit = function () {
        FB.init({
            appId: 'XXXXXXXXXXXXXX',
            xfbml: true,
            version: 'v2.6'
        });
    };
    (function (d, s, id) {
        console.log('test');
        const fjs = d.getElementsByTagName(s)[0];
        if (d.getElementById(id)) return;
        const js = d.createElement(s); js.id = id;
        js.src = '//connect.facebook.net/fr_CA/sdk.js#xfbml=1&version=v2.6&appId=XXXXXXXX';
        fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));
    FB.XFBML.parse(); 
...
}

在我添加的渲染函数中:

render() {
<div id="fb-root"></div>
...
<div className="fb-comments"
                    data-href="MY-URL"
                    data-width="1000"
                    data-numposts="10"
                    data-order-by="reverse_time">
                </div>

有人有想法吗?

编辑:评论部分正在显示,但是当我进入我网站的另一个部分并卷土重来(单页应用程序)时,它消失了。这是我的组件的代码:

    import React, { Component, PropTypes } from 'react';
import { mediaQueries } from '../../decorators';

@mediaQueries
export default class FacebookComments extends Component {
    static propTypes = {
    mediaQueries: PropTypes.func.isRequired,
    appId: PropTypes.string.isRequired,
    version: PropTypes.string.isRequired,
    url: PropTypes.string.isRequired,
};

state = {
    mobile: false,
}

componentDidMount() {
    this.props.mediaQueries('(max-width: 950px)', () => {
        this.setState({
            mobile: true,
        });
    });
    this.props.mediaQueries('(min-width: 951px)', () => {
        this.setState({
            mobile: false,
        });
    });

        FB.init({
            appId: 'XXXXXXXXXXXXXXXXX',
            xfbml: true,
            version: 'v2.6',
        });

    (function (d, s, id) {
        const fjs = d.getElementsByTagName(s)[0];
        if (d.getElementById(id)) return;
        const js = d.createElement(s); js.id = id;
        js.src = '//connect.facebook.net/fr_CA/sdk.js';
        fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));
}

componentDidUpate() {
    FB.XFBML.parse();
}

render() {
    const componentWidth = this.state.mobile ? '95%' : '75%';

    return (
        <div style={{ width: componentWidth }}>
            <div id="fb-root"></div>
            <div className="fb-comments"
                data-href={this.props.url}
                data-width="100%"
                data-numposts="10"
                data-order-by="reverse_time">
            </div>
        </div>
    );
}
}

luschn 我不知道也不明白你在说什么。我在 fbAsyncInit 中放置了一个 console.log 并且它从未显示过,这意味着它永远不会被调用。我在网上查了一下,没有相关信息。网上的人只会说:把它放在你的代码中,让魔法发生......这就是我从我的代码中删除它的原因。编辑#2:我所有的 Facebook 社交插件都在这段代码中。

2个回答

边注:将 JS SDK 初始化代码添加到componentDidMount. 相反,将该代码添加到您的基本 HTML 或将其放入单独的“init”函数中,并确保在使用组件之前已加载它。

无论哪种方式,您都只能使用FB.XFBML.parseafter FB.init- 即在加载并初始化 JS SDK 时:

FB.init({
    appId: 'XXXXXXXXXXXXXX',
    xfbml: true,
    version: 'v2.6'
});
FB.XFBML.parse();

您甚至应该在浏览器中显示警告或错误,指出 FB 未用您当前的代码定义。

您可能还需要FB.XFBML.parse()再次调用componentDidUpdate

话虽如此,这是我的想法:

componentDidMount() {
    window.fbAsyncInit = () => {
        FB.init({
            appId: 'xxx',
            xfbml: true,
            version: 'v2.6'
        });
        FB.XFBML.parse();
        console.log('make sure this happens');
    };

    (function(d, s, id){
        let 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'));
}
componentDidUpdate() {
    FB.XFBML.parse();
}

同样,您应该将初始化/加载内容放在其他地方,但这只是为了优化。检查您的浏览器控制台是否有错误,有可能componentDidUpdate在 JS SDK 初始化之前被调用。在这种情况下,您可能需要检查 FB 是否可用:

componentDidUpdate() {
    if (FB) {
        FB.XFBML.parse();
    }
}

或者,您可以使用状态变量(例如“isSDKInitialized”)并在 FB.init 之后将其设置为 true:

componentDidUpdate() {
    if (this.state.isSDKInitialized) {
        FB.XFBML.parse();
    }
}

That's你所需要的最低限度,用路由的问题是,无论是componentDidUpdatecomponentDidMount不会被调用。componentWillReceiveProps另外尝试(与componentDidUpdate刷新社交插件的代码相同)。

查看这些链接以获取更多信息 - 假设您正在使用react-router

对于那些想知道如何纠正错误的人。你不能有: <script src="//connect.facebook.net/fr_CA/sdk.js"></script> 在你的<head>,你必须 在你的 FacebookComments 组件<div id="fb-root"></div>中的<body>和这段代码的开头

 componentDidMount() {
        this.props.mediaQueries('(max-width: 950px)', () => {
            this.setState({
                mobile: true
            });
        });
        this.props.mediaQueries('(min-width: 951px)', () => {
            this.setState({
                mobile: false
            });
        });

    window.fbAsyncInit = () => {
        FB.init({
            appId: this.props.appId,
            xfbml: true,
            version: this.props.version,
        });
        FB.XFBML.parse();
    };
    (function (d, s, id) {
        const fjs = d.getElementsByTagName(s)[0];
        if (d.getElementById(id)) {
            return;
        }
        const js = d.createElement(s); js.id = id;
        js.async = true;
        js.src = '//connect.facebook.net/fr_CA/sdk.js';
        fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));
}

componentWillReceiveProps() {
    if (FB) {
        console.log('its in receiveProps');
        FB.XFBML.parse();
    }
}

componentDidUpate() {
    if (FB) {
        FB.XFBML.parse();
    }
}

然而,这个 me 代码给了我一个错误,但它不会阻止 webapp 加载评论部分。你可能会得到一个: Unhandled promise rejection ReferenceError: FB is not defined(…) 我试图用状态元素制作一个标志,但它与以前的状态不同。