我正在制作我的网站组合,我已经创建了一个Navbar组件链接到主页,项目页面和博客页面.主页和博客页面是内部链接,而项目链接是外部链接.

现在我的设置是这样的:

import * as React from 'react';
import { Link, useStaticQuery, graphql } from 'gatsby';
import Icon from '../images/icon.svg';

const Navbar = ({pageTitle}) => {

    const data = useStaticQuery(graphql`
      query {
        site {
          siteMetadata {
            title
          }
        }
      }
    `);

    const menu = [
        { title: 'HOME', path:'/' },
        { title: 'PRØJECTS', path: 'https://github.com/chukkyiii?tab=repositories' },
        { title: 'BLØG', path: '/blog' }
    ]

    return (
      <main>
        <title>
          {pageTitle} | {data.site.siteMetadata.title}
        </title>
        <div>
          <div className="mx-auto mb-9 flex items-center justify-between max-w-2xl ">
            <Icon className="w-12 h-12 p-1 rounded-full ring-2 ring-gray-300 dark:ring-gray-500" />
            <nav>
              <ul className="flex">
                {menu.map((item) => (
                  <li key={item.title}>
                    <Link to={item.path} className="pl-8 hover:text-amber-500">
                      {item.title}
                    </Link>
                  </li>
                ))}
              </ul>
            </nav>
          </div>
        </div>
      </main>
    );
}

export default Navbar;

所以我不用再重复相同的代码行了,我只用了Link,虽然行得通,但它给了我一个警告,有没有其他方法可以在没有警告的情况下做到这一点?

它发出的警告是:

react_devtools_backend.js:4026 External link https://github.com/chukkyiii?tab=repositories was detected in a Link component. Use the Link component only for internal links. See: https://gatsby.dev/internal-links
...

推荐答案

您可以轻松地自定义menu数组,以显示循环所基于的新属性:

const menu = [
    { title: 'HOME', path:'/', isInternal: true },
    { title: 'PRØJECTS', path: 'https://github.com/chukkyiii?tab=repositories', isInternal: false },
    { title: 'BLØG', path: '/blog', true }
]

然后:

{
  menu.map((item) => {
    if (item.isInternal) {
      return (
        <li key={item.title}>
          <Link to={item.path} className="pl-8 hover:text-amber-500">
            {item.title}
          </Link>
        </li>
      );
    }
    return (
      <li key={item.title}>
        <a href={item.path} target="_blank">
          {item.title}
        </a>
      <li key={item.title}>
    );
  });
}

您甚至可以在返回中执行一个三元条件,以利用<li>包装器:

{
  menu.map((item) => (
    <li key={item.title}>
      {item.isInternal ? (
        <Link to={item.path} className="pl-8 hover:text-amber-500">
          {item.title}
        </Link>
      ) : (
        <a href={item.path} target="_blank">
          {item.title}
        </a>
      )}
    </li>
  ));
}

组件仅用于内部导航,在您的应用程序和Reaction/Gatsby可以知道的范围内发生了什么.如果链接指向任何外部源(如本例中的GitHub),则需要使用标准锚(实际上它呈现的是Link组件).

添加isInternal属性的相同方法(我个人认为它更简洁)可以使用正则表达式或类似的方法以相同的方式完成,只需判断path的情况.

Javascript相关问答推荐

警告!合同执行期间遇到错误[执行已恢复](Base Layer 2)

在页面上滚动 timeshift 动垂直滚动条

如何粗体匹配的字母时输入搜索框使用javascript?

将现场录音发送到后端

无法检测卡片重叠状态的问题

Chart.js-显示值应该在其中的引用区域

我怎么在JS里连续加2个骰子的和呢?

Reaction Native中的范围滑块

用JS从平面文件构建树形 struct 的JSON

Web Crypto API解密失败,RSA-OAEP

如何在我的Next.js项目中.blob()我的图像文件?

将相关数据组合到两个不同的数组中

输入的值的类型脚本array.排序()

MUI迷你图:如何将$符号添加到MUI迷你图中的工具提示数据

MUI-TABLE:MUI表组件中交替行的不同 colored颜色 不起作用

ReactJS Sweep Line:优化SciChartJS性能,重用wasmContext进行多图表渲染

我正在为我的单选按钮在HTML中设置一个值.使用Java脚本,我如何才能获得该值?

Html/JS:如何在脚本执行前阻止呈现?

V-如果使用数组[vue3]中的布尔结果

从D3 v3更新,没有错误,但输出SVG路径不可见