首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法修改已解析的html中的子项

无法修改已解析的html中的子项
EN

Stack Overflow用户
提问于 2019-04-03 10:30:15
回答 2查看 990关注 0票数 0

我想通过用React组件(即<StyledParagraph><StyledLink>)替换特定的标记(如<p><a> )来呈现一大块html

我测试了很多库,包括html-react-parser。与其他许多不同的是,html-react-parser有一个满足我需要的示例。但是,我不能让这个例子工作。(使用React 16.5.3)

代码语言:javascript
复制
const test = () =>
  <>
    {parse(
      `
      <p id="main">
        <span class="prettify">
          keep me and make me pretty!
        </span>
      </p>
    `,
      {
        replace: ({ attribs, children }) => {
          if (!attribs) return;

          if (attribs.id === 'main') {
            return (
              <h1 style={{ fontSize: 42 }}>
                {domToReact(children)}
              </h1>
            );
          } else if (attribs.class === 'prettify') {
            return (
              <span style={{ color: 'hotpink' }}>
                {domToReact(children)}
              </span>
            );
          }
        }
      }
    )}
  </>

我没有将parserOptions传递给domToReact函数,因为我还没有找到这些选项的文档。

预期结果:

代码语言:javascript
复制
<h1 style="font-size:42px">
  <span style="color:hotpink">keep me and make me pretty!</span>
</h1>

到目前为止,我还不能修改嵌套的节点(在本例中是<span>)。

实际结果:

代码语言:javascript
复制
<h1 style="font-size: 42px;">
    <span class="prettify">keep me and make me pretty!</span>
  </h1>
EN

回答 2

Stack Overflow用户

发布于 2019-04-04 03:26:05

您必须将replace函数作为其options参数的一部分传递给domToReact。在源代码中:

代码语言:javascript
复制
/**
 * Converts DOM nodes to React elements.
 *
 * @param  {Array}    nodes             - The DOM nodes.
 * @param  {Object}   [options]         - The additional options.
 * @param  {Function} [options.replace] - The replace method.
 * @return {ReactElement|Array}
 */

在本例中,这意味着...

代码语言:javascript
复制
function replaceHtmlWithReact({ attribs, children }) {
  if (!attribs) return;

  if (attribs.id === 'main') {
    return (
      <h1 style={{ fontSize: 42 }}>
        {domToReact(children, { replace: replaceHtmlWithReact })}
      </h1>
    );
  } else if (attribs.class === 'prettify') {
    return (
      <span style={{ color: 'hotpink' }}>
        {domToReact(children, { replace: replaceHtmlWithReact })}
      </span>
    );
  }
}

const test = () => 
<>
  {parse(
    `
      <p id="main">
        <span class="prettify">
          keep me and make me pretty!
        </span>
      </p>
    `,{ replace: replaceHtmlWithReact }
  )}
</>
票数 0
EN

Stack Overflow用户

发布于 2021-05-04 04:24:43

我可以在没有domToReact选项的情况下工作。我将一个从Wordpress获取的JSON对象的超文本标记语言字符串传递给react-syntax-highlighter。我还没有检查过html-react-parser源代码以了解使用两者之间的区别,但是用JSX替换HTML标记似乎可以很好地与domNode.attribs一起工作。

该组件获取JSON对象(由Wordpress post组成),将每个post映射到单独的解析部分,然后将满足特定条件(在本例中为class=wp-block-codeclass=CodeMirror)的每个解析部分的每个pre标记替换为JSX SyntaxHighlighter标记,同时保留代码块的文本(domNode.children[0].data)。

注意:在分析JSON对象时,我发现这些domNode.children数组都没有一个位置,所以在我的例子中只需要位置[0] -显然,您的需求可能会有所不同。

从Wordpress检索到的html-react-parser或JSON对象中的命令都不是非结构化的,所以您可以看到API/命令的清晰描述。

代码语言:javascript
复制
import parse from 'html-react-parser';
import SyntaxHighlighter from 'react-syntax-highlighter';
import { gruvboxDark } from 'react-syntax-highlighter/dist/esm/styles/hljs';

export const Blog = (props) => {
  return (
    <div>
      <h1>This is an example of a blog component</h1>
      <div>
        {props.posts.map((post, index) => (
          <div key={post.id}>
            <h3>{post.id}</h3>
            <div>{parse(post.title.rendered)}</div>
            <div>{parse(post.excerpt.rendered)}</div>
            <div>
              {parse(post.content.rendered, {
                replace: (domNode) => {
                  if (
                    (domNode.attribs && domNode.attribs.class === 'CodeMirror') ||
                    (domNode.attribs && domNode.attribs.class === 'wp-block-code')
                  ) {
                    return (
                      <SyntaxHighlighter
                        language="bash"
                        showLineNumbers={true}
                        style={gruvboxDark}
                        wrapLongLines={true}
                      >
                        {domNode.children[0].data}
                      </SyntaxHighlighter>
                    );
                  }
                },
              })}
            </div>
          </div>
        ))}
      </div>
    </div>
  );
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55486157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档