reactjs 如何设置动态og Meta标签?

qv7cva1a  于 12个月前  发布在  React
关注(0)|答案(1)|浏览(122)

我一直在尝试使用react-helmet-browser c来为博客文章创建自定义URL缩略图,以便在社交媒体上发布。
我已经在index.js中设置了提供程序

import 'bootstrap/dist/css/bootstrap.min.css';
import 'react-tooltip/dist/react-tooltip.css';
import React from 'react';
import ReactDOM from 'react-dom/client';
import { Provider } from 'react-redux';
import { HelmetProvider } from 'react-helmet-async';
import store from './redux/store';
import App from './App';

const root = ReactDOM.createRoot(document.getElementById('root'));

root.render(
  <Provider store={store}>
    <HelmetProvider>
      <App />
    </HelmetProvider>
  </Provider>
);

字符串
我已经创建了一个Seo组件,它接受数据:

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

export default function SEO({ title, description, imageUrl }) {
  return (
    <Helmet>
      <title>{title}</title>
      <meta property='og:type' content='artical' />
      <meta property='og:title' content={title} />
      <meta property='og:description' content={description} />
      <meta property='og:image' content={imageUrl} />
    </Helmet>
  );
}


在此呈现组件

import React from "react";
import { useDispatch } from "react-redux";
import { Container } from "react-bootstrap";
import { setVisitedRoot } from "../../redux/visitedSlice";
import { useParams } from "react-router-dom";
import useScrollAndDispatch from '../Tools/useScrollAndDispatch';
import posts from "./posts"; 
import  Seo  from '../Tools/Seo.jsx'
import { toKebabCase } from "../Tools/toKebabCase";

const BlogPost = () => {
  const dispatch = useDispatch();
  useScrollAndDispatch(dispatch, setVisitedRoot(true));

  const { id } = useParams();
  const kebabCaseId = toKebabCase(id);
  let post = posts.find((post) => toKebabCase(post.id) === kebabCaseId);

  if (!post) {
    return <div>Post not found!</div>;
  }

  const renderHTMLContent = () => {
    return { __html: post.content };
  };

  return (
    <Container style={{ maxWidth: "500px" }}>
      <Seo
      title={post.title}
      description={post.description}
      name={post.name}
      type={post.type}
      imageUrl={post.imageUrl}
    
      />
      <img src={post.image} alt={post.title} style={{ width: "70px", height: "70px" }} />
      <h1 style={{ paddingTop: "20px", paddingBottom: "20px"}}>{post.title}</h1>
      <div
        dangerouslySetInnerHTML={renderHTMLContent()}
      />
    </Container>
  );
};

export default BlogPost;


标题实际上似乎工作得很好,我在Chrome开发工具的元素部分找到了所有正确的信息,沿着了我在index.html文件中编写的元数据。然而,当在Facebook的sharing debugger上检查我的链接时,它显示了我的index.html文件中的元数据。我试着从index.html中删除元标记,但是它在调试器上没有显示任何信息。有什么建议吗?

lnvxswe2

lnvxswe21#

需要注意的一点是,在Facebook的分享博客上分享链接时,动态更新可能不会立即反映出来,因为Facebook可能会缓存信息

import React, { useEffect } from 'react';
import { Helmet } from 'react-helmet-async';

const SEO = ({ title, description, imageUrl }) => {
  useEffect(() => {
    // Use Helmet here if you need to dynamically update meta tags after the initial load
  }, [title, description, imageUrl]);

  return (
    <Helmet>
      <title>{title}</title>
      <meta property='og:type' content='article' />
      <meta property='og:title' content={title} />
      <meta property='og:description' content={description} />
      <meta property='og:image' content={imageUrl} />
    </Helmet>
  );
};

export default SEO;

字符串

重要注意事项

1.确保你的React应用在服务器端渲染。React Helmet默认在客户端工作,社交媒体爬虫可能不会执行JavaScript。要处理这个问题,你可以使用服务器端渲染(SSR)和Next.js或Gatsby等框架。

  1. Facebook缓存有关共享链接的信息。如果您更改了Meta标签,请尝试再次在Facebook共享插件中获取URL。您可能需要使用“再次抓取”按钮来强制Facebook更新其缓存。

相关问题