nuxt.js (vue.js) 路线改变时 Facebook 分享按钮消失
Facebook share button disappear when route changed in nuxt.js (vue.js)
在我的 nuxt.js ("nuxt": "^2.15.7") 网络应用程序中,我正在使用 Facebook 分享按钮,如 full code example 中所述。
第一次加载应用程序时,Facebook 分享按钮会正确呈现。不幸的是,当我导航到另一条路线 and/or 导航回来时,Facebook 分享按钮消失了。 为什么会发生这种情况以及如何解决?
我尝试实施以下解决方案,包括@Cbroe 和@kissu 提供的解决方案:
- Facebook share button dissapear after updatePanel
- How to add a 3rd party script code into Nuxt
不幸的是,上面提供的解决方案没有解决我的问题。
有趣的是,Chrome 浏览器中的 Vue 开发人员工具表明,该组件 <FbShareButton>
存在,但未显示在页面上。
有我的初始代码:
我已经创建了 nuxt 插件 loadFacebookSdk.js 来将 Facebook SDK 加载到应用程序中,有代码:
Vue.prototype.$loadFacebookSDK = async (d, s, id) => {
var js = d.getElementsByTagName(s)[0]
var fjs = d.getElementsByTagName(s)[0]
if (d.getElementById(id)) {
return
}
js = d.createElement(s)
js.id = id
js.src = "https://connect.facebook.net/en_US/sdk.js#xfbml=1&version=v3.0"
fjs.parentNode.insertBefore(js, fjs)
}
然后在nuxt.config.js中注册上面的插件如下:
plugins: [
{ src: "~/plugins/loadFacebookSdk.js", mode: 'client' }
]
最后创建 FbShareButton.vue 组件来加载 facebook SDK 和渲染 facebook 分享按钮:
<template>
<div>
<div id="fb-root"></div>
<div class="fb-share-button"
data-href="https://developers.facebook.com/docs/plugins/"
data-layout="button"
data-size="small"
>
</div>
</div>
</template>
<script>
export default {
async created () {
if (process.client) {
await this.$loadFacebookSDK(document, 'script', 'facebook-jssdk')
}
}
}
</script>
有解决问题的方法。
我创建了单独的组件FbShareButton.vue
根据 this and 个帖子将所有逻辑(包括 Facebook SDK 加载)放入该组件。
因此:
<template>
<div id="1">
<div id="fb-root"></div>
<div class="fb-share-button"
:data-href="this.articleUrl"
data-layout="button"
data-size="small"
>
</div>
</div>
</template>
<script>
export default {
props: ['articleUrl', 'articleTitle', 'articleImage', 'articleDescription'],
head () {
return {
meta: [
{ property: "og:url", content: this.articleUrl },
{ property: "og:type", content: "website" },
{ property: "og:title", content: this.articleTitle },
{ property: "og:description", content: this.articleDescription },
{ property: "og:image", content: this.articleImage },
{ property:"fb:app_id", content:"YOUR_FB_APP_ID" }
],
script: [
{
hid: 'fb',
src: 'https://connect.facebook.net/en_US/sdk.js#xfbml=1&version=v3.0',
defer: true,
// changed after script load
callback: () => {
FB.XFBML.parse()
}
}
]
}
}
}
</script>
在我的 nuxt.js ("nuxt": "^2.15.7") 网络应用程序中,我正在使用 Facebook 分享按钮,如 full code example 中所述。
第一次加载应用程序时,Facebook 分享按钮会正确呈现。不幸的是,当我导航到另一条路线 and/or 导航回来时,Facebook 分享按钮消失了。 为什么会发生这种情况以及如何解决?
我尝试实施以下解决方案,包括@Cbroe 和@kissu 提供的解决方案:
- Facebook share button dissapear after updatePanel
- How to add a 3rd party script code into Nuxt
不幸的是,上面提供的解决方案没有解决我的问题。
有趣的是,Chrome 浏览器中的 Vue 开发人员工具表明,该组件 <FbShareButton>
存在,但未显示在页面上。
有我的初始代码:
我已经创建了 nuxt 插件 loadFacebookSdk.js 来将 Facebook SDK 加载到应用程序中,有代码:
Vue.prototype.$loadFacebookSDK = async (d, s, id) => {
var js = d.getElementsByTagName(s)[0]
var fjs = d.getElementsByTagName(s)[0]
if (d.getElementById(id)) {
return
}
js = d.createElement(s)
js.id = id
js.src = "https://connect.facebook.net/en_US/sdk.js#xfbml=1&version=v3.0"
fjs.parentNode.insertBefore(js, fjs)
}
然后在nuxt.config.js中注册上面的插件如下:
plugins: [
{ src: "~/plugins/loadFacebookSdk.js", mode: 'client' }
]
最后创建 FbShareButton.vue 组件来加载 facebook SDK 和渲染 facebook 分享按钮:
<template>
<div>
<div id="fb-root"></div>
<div class="fb-share-button"
data-href="https://developers.facebook.com/docs/plugins/"
data-layout="button"
data-size="small"
>
</div>
</div>
</template>
<script>
export default {
async created () {
if (process.client) {
await this.$loadFacebookSDK(document, 'script', 'facebook-jssdk')
}
}
}
</script>
有解决问题的方法。
我创建了单独的组件FbShareButton.vue
根据 this and
因此:
<template>
<div id="1">
<div id="fb-root"></div>
<div class="fb-share-button"
:data-href="this.articleUrl"
data-layout="button"
data-size="small"
>
</div>
</div>
</template>
<script>
export default {
props: ['articleUrl', 'articleTitle', 'articleImage', 'articleDescription'],
head () {
return {
meta: [
{ property: "og:url", content: this.articleUrl },
{ property: "og:type", content: "website" },
{ property: "og:title", content: this.articleTitle },
{ property: "og:description", content: this.articleDescription },
{ property: "og:image", content: this.articleImage },
{ property:"fb:app_id", content:"YOUR_FB_APP_ID" }
],
script: [
{
hid: 'fb',
src: 'https://connect.facebook.net/en_US/sdk.js#xfbml=1&version=v3.0',
defer: true,
// changed after script load
callback: () => {
FB.XFBML.parse()
}
}
]
}
}
}
</script>