将mdx中的动态'href'传递到NextJs '锚'自定义样式组件

to94eoyn  于 2023-05-28  发布在  其他
关注(0)|答案(1)|浏览(144)

我试图通过MDX访问markdown标记中的'href'数据,并进入自定义样式的NextJS组件。
目前我希望有人能够在markdown中写道:

[Website](http://www.website.com)

然后将数据放入一个自定义样式组件中,如下所示:

./components/md/Anchor.tsx 

function Anchor({ hrefProp, text }) {
 
  return <a className="text-blue-600 my-4 text-base" href={hrefProp} target="_blank" rel="noopener">{text}</a>;
}
export default Anchor;

从mdx到jsx的url 'http://website.com'丢失了,我只能点击{text}。
理想情况下,我根本不需要改变markdown的语法来实现这一点。有什么建议吗?
我想也许可以尝试通过metafrontmatter来放置href数据。

goqiplq2

goqiplq21#

假设您正在使用@next/mdx@mdx-js/react,您可以通过Anchor组件中的href prop访问href prop。
1.实现样式化链接组件:

// components/mdx/Anchor.tsx

import * as React from "react";

export default function Anchor({
  href,
  children,
  ...rest
}: React.JSX.IntrinsicElements["a"]) {
  return (
    <a
      href={href}
      target="_blank"
      rel="noreferer noopener"
      className="text-blue-600 my-4 text-base"
      {...rest}
    >
      {children}
    </a>
  );
}

1.将带有自定义链接组件的MDXProvider添加到_app.tsx

// pages/_app.tsx

import * as React from "react";
import { AppProps } from "next/app";
import { MDXProvider } from "@mdx-js/react";

import Anchor from "@/components/mdx/Anchor";
import "@/styles/globals.css";

const components = {
  a: Anchor,
};

export default function App({ Component, pageProps }: AppProps) {
  return (
    <MDXProvider components={components}>
      <Component {...pageProps} />
    </MDXProvider>
  );
}

1.在next.config.js中设置@next/mdx

// next.config.js

const withMDX = require("@next/mdx")({
  extension: /\.mdx?$/,
  options: {
    remarkPlugins: [],
    rehypePlugins: [],
    providerImportSource: "@mdx-js/react",
  },
});

/** @type {import('next').NextConfig} */
const nextConfig = {
  pageExtensions: ["ts", "tsx", "js", "jsx", "md", "mdx"],
};

module.exports = withMDX(nextConfig);

沙盒-https://codesandbox.io/p/sandbox/stackoverflow-76283549-h1fkf9?file=%2Fcomponents%2Fmdx%2FAnchor.tsx

相关问题