如何在React.js中更新元标记?

Har*_*uja 24 reactjs

我正在使用react.js中的单页应用程序,那么在页面转换或浏览器后退/前进上更新元标记的最佳方法是什么?

eed*_*rah 23

您几乎肯定要使用:

反应头盔

react-meta-tags它相反,它可以嵌套<Helmet>s,因此您可以在应用程序的深处定义元标记 - 就像<title>s 应该相互覆盖。与此相反,react-document-meta您可以使用 jsx(和嵌套事物)定义事物。

这似乎是社区几乎完全使用的解决方案 - 每周下载 600,000 次,而其他解决方案中给出的则是 6,000 次。“Helmet 采用纯 HTML 标签并输出纯 HTML 标签。它非常简单,而且 React 初学者友好。” - 并支持服务器端渲染。

这是一个改编自首页的例子:

<Parent>
    I'm a parent
    <Helmet>
        <title>My Title</title>
        <meta name="description" content="Helmet application" />
    </Helmet>
 
    <Child>
        I'm a child
        <Helmet>
            <title>Nested Title</title>
            <meta name="description" content="Nested component" />
        </Helmet>
    </Child>
</Parent>
Run Code Online (Sandbox Code Playgroud)

输出:

<head>
    <title>Nested Title</title>
    <meta name="description" content="Nested component">
</head>
<Parent>
    I'm a parent
    <Child>
        I'm a child
    </Child>
</Parent>
Run Code Online (Sandbox Code Playgroud)


Sud*_*dav 17

您可以使用react-meta-tags.它允许您以声明方式和正常的jsx格式编写标题和其他元标记,这些格式将被移动到头部(检查文档上的服务器使用情况).

import React from 'react';
import MetaTags from 'react-meta-tags';

class Component1 extends React.Component {
  render() {
    return (
        <div class="wrapper">
          <MetaTags>
            <title>Page 1</title>
            <meta id="meta-description" name="description" content="Some description." />
            <meta id="og-title" property="og:title" content="MyApp" />
            <meta id="og-image" property="og:image" content="path/to/image.jpg" />
          </MetaTags>
          <div class="content"> Some Content </div>
        </div>
      )
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您有高级用例,您可能还想查看react-helmet.


小智 14

我在旧项目中使用了react-document-meta.

只需定义您的元值

const meta = {
    title: 'Some Meta Title',
    description: 'I am a description, and I can create multiple tags',
    canonical: 'http://example.com/path/to/page',
    meta: {
        charset: 'utf-8',
        name: {
            keywords: 'react,meta,document,html,tags'
        }
    }
Run Code Online (Sandbox Code Playgroud)

并放置一个

<DocumentMeta {...meta} />
Run Code Online (Sandbox Code Playgroud)

在回报中

  • 标签会随着页面转换而改变还是只针对登陆页面? (3认同)

thi*_*ign 11

首先,如果您不需要动态数据,您可以直接编辑public/index.html.

对于动态数据,React 团队建议使用React-helmet

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

class Application extends React.Component {
  render () {
    return (
        <div className="application">
            <Helmet>
                <meta charSet="utf-8" />
                <title>React app</title>
                <meta name="description" content="React application" />
            </Helmet>
            ...
        </div>
    );
  }
};
Run Code Online (Sandbox Code Playgroud)

或者使用占位符并在服务器端替换它们

<html lang="en">
  <head>
    <meta property="og:title" content="__OG_TITLE__" />
    <meta property="og:description" content="__OG_DESCRIPTION__" />
  </head>
</html>
Run Code Online (Sandbox Code Playgroud)

  • 您能否分享一下如何在服务器端替换它们的方法 (2认同)

Ven*_*omu 9

您还可以通过以下方式提供页面标题和元标记说明.

像这样在index.html文件中放置描述的元标记.

<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<title>Dynamic Page title here</title>
Run Code Online (Sandbox Code Playgroud)

在您的.js文件或render()方法下面的.jsx文件中,像这样写入页面的页面标题和元描述.

render()
{
document.title ="Welcome | here is your page title to display"; 
document.getElementsByTagName("META")[2].content="Your description about the page or site here to set dynamically";

return(
    <div>Page content</div>
);
}
Run Code Online (Sandbox Code Playgroud)

  • 我可以看到使用这种方法更新了我的元标签,但是当我使用 twitter 卡验证器或 facebook 共享调试器时,它没有找到我的元/opengraph 标签:( 注意:我是静态托管 (2认同)

小智 6

根据官方文档React Doc - Title and Meta Tags,你也可以使用React Helmet


小智 6

您可以使用文档查询并更新它们的值。

const setTitle = title => {
    const el = document.querySelector('title');
    el.innerText = `${el.text} | ${title}`;
  };

const setDescription = desc => {
    const el = document.querySelector("meta[name='description']");
    el.setAttribute('content',desc)
  }
Run Code Online (Sandbox Code Playgroud)