javascript - 将文本中的 <a> 替换为 React <Link>

标签 javascript reactjs react-router jsx

在我的 React 应用程序中,我从另一台服务器 (Wikipedia) 获取一些 HTML,并且 - 在本文中 - 想要用 react-router 链接替换所有链接。

我想出的是下面的代码:

// Parse HTML with JavaScript DOM Parser
let parser = new DOMParser();
let el = parser.parseFromString('<div>' + html + '</div>', 'text/html');

// Replace links with react-router links
el.querySelectorAll('a').forEach(a => {
  let to = a.getAttribute('href');
  let text = a.innerText;
  let link = <Link to={to}>{text}</Link>;
  a.replaceWith(link);
});
this.setState({
  html: el.innerHTML
})

然后在 render() 中,我使用

将其插入到页面中
<div dangerouslySetInnerHTML={{__html: this.state.html}} />

问题是 React JSX 不是原生 JavaScript 元素,因此不能与 replaceWith 一起使用。我还假设这样一个 Link 对象不能存储为文本,然后使用 dangerouslySetInnerHTML 恢复。

那么:执行此方法的最佳方法是什么?我想保留链接周围的所有各种元素,这样我就不能简单地遍历 render()

中的链接

最佳答案

嗯,你真的需要使用 Link 选项 1:

import { renderToString } from 'react-dom/server';
el.querySelectorAll('a').forEach(a => {
  let to = a.getAttribute('href');
  let text = a.innerText;
  const link = renderToString(<Link to={to}>{text}</Link>);
  a.replaceWith(link);
});

选项 2:使用 html-react-parser

关于javascript - 将文本中的 <a> 替换为 React <Link>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54794229/

相关文章:

javascript - 如何使用 javascript 以编程方式启用和禁用按钮

javascript - 在 React material-ui 上显示对话框

reactjs - “react-bootstrap”不包含名为“MenuItem”的导出

reactjs - React Router 3,与查询参数完全匹配

javascript - React 路由器在组件中抓取 URL 段

javascript - React如何检测路由变化方法

javascript - 当 AngularJS 列表中找不到输入值时如何显示元素?

javascript - 无法从 Ajax 调用获取 'bad response'

javascript - 在 render() 中修改 this.state 是否合理?

reactjs - 请求 Google 日历权限时弹出额外补助金