跳至主要内容

如何在 React 頁面增加 facebook 分享按鈕

· 4 分鐘閱讀
Eric Cheng

facebook developers 有官方文件教學怎麼在 html 頁面增加 分享按鈕

Share Button - Social Plugins - Documentation - Facebook for Developers

舉例如果要在網頁加入一個 的連結

步驟 1: 包含你粉絲專頁的 JavaScript SDK 一次,最好是接在開頭的內文標籤後。

<div id="fb-root"></div>
<script async defer crossorigin="anonymous" src="https://connect.facebook.net/zh_TW/sdk.js#xfbml=1&version=v12.0" nonce="yiBPDvjL"></script>

步驟 2: 將此程式碼放置在你希望外掛程式顯示的頁面位置。

<div class="fb-share-button" data-href="https://developers.facebook.com/docs/plugins/" data-layout="button_count" data-size="large"><a target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fdevelopers.facebook.com%2Fdocs%2Fplugins%2F&amp;src=sdkpreparse" class="fb-xfbml-parse-ignore">分享</a></div>

實測在 html 頁面沒有問題,但是如果貼到 react 的 js 頁面就看不到 icon 得效果

踩雷一:使用 React Helmet

React Helmet 可以在 React components 寫應該在 head 出現的東西,方法是用 Helmet 包起來,就會自動的放進 head

google 到有文章說要將

<script async defer crossorigin="anonymous" src="https://connect.facebook.net/zh_TW/sdk.js#xfbml=1&version=v12.0" nonce="YJDXOVgP"></script>

放進 head

測試程式碼如下

import React from 'react';
import { Helmet } from 'react-helmet';

export default function Test() {
return (
<div>
<div id="fb-root"></div>
<Helmet>
<script async defer crossorigin="anonymous" src="https://connect.facebook.net/zh_TW/sdk.js#xfbml=1&version=v12.0" nonce="dmrjeGLN"></script>
</Helmet>
<div class="fb-share-button" data-href="https://developers.facebook.com/docs/plugins/" data-layout="button_count" data-size="large"><a target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fdevelopers.facebook.com%2Fdocs%2Fplugins%2F&amp;src=sdkpreparse" class="fb-xfbml-parse-ignore">分享</a></div>
</div>
);
}

第一次執行的時候,分享按鈕 有出現,貌似問題已經解決了,但是有點不對,第一次執行都 OK,但是如果使用 react router 的 link 連到頁面,分享按鈕 就又不見了,只好繼續 google

踩雷二:使用 useEffect

google 到最多的解法是這個,說要在 useEffect 中先 init facebook sdk

測試程式碼如下

useEffect(() => {
window.fbAsyncInit = function () {
//SDK loaded, initialize it
window.FB.init({
xfbml: true,
version: 'v12.0'
});
//JS SDK initialized
window.FB.XFBML.parse();
};

//load the JavaScript SDK
(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/zh_TW/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));

}, []);

第一次執行 ⇒ 分享按鈕有出現

react router 的 link 連到頁面 ⇒ 結果和踩雷一一樣,還是看不到

寫了幾行 log 測試一下發現這兩個 function 在執行第一次都會執行,但是 react router 的 link 連回來時 init 因為執行過了,所以不會再執行,而 load 也因為 getElementById facebook-jssdk 已經存在所以不再執行

都不執行當然就不會有畫面啊 !

最後方法

讓 分享按鈕 出現的關鍵其實是這一行

window.FB.XFBML.parse();

使用踩雷二的程式碼,在 useEffect 的最後再增加這幾行 code,確保每次 render 都會執行到

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

終於每個頁面都可以看到分享按鈕了,問題解決 !



版權聲明

,轉載請註明出處
本文連結: https://tech.havocfuture.tw/blog/react-fb-share



這是 google 廣告