css 如何呈现部分HTML响应

qco9c6ql  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(182)

我通过fetch在我的React项目中调用一个端点,如下所示。
curl --location 'https://example.com/some/v1'
--header 'Content-Type:中文(简体)
这给予了我一个这样的回应:(超过5000行,仅显示部分内容)。

<style class="ssr-css">
    .some_class {
        margin: 0 auto
    }

    html,
    body {
        overflow-x: hidden;
        width: 100%;
        height: 100%
    }
    /* 100+ more styles */
</style>
<style class="ssr-css">
    .some_class_1 {
        margin: 0 auto
    }
    /* 600+ more styles */
</style>
<div class="some_class">
    <div style="color: red" class="some_class_1">
        some text
    </div>
    <!-- 1000's more lines -->
</div>

如何将其转换为组件并呈现它?
我不能只使用危险的SetInnerHTML。它可以很好地处理html,但不能处理样式。
我可以考虑像下面这样提取样式并直接注入文档。
感觉有点古怪,担心这会对我页面上的其他样式产生副作用。
无论如何,我可以使用React来实现这一点,而不必直接将样式注入到文档中。更干净的方法。
请指教,谢谢。

import React, { useEffect, useState } from 'react';

const MyComponent = () => {
  const [htmlResponse, setHtmlResponse] = useState('');

  useEffect(() => {
    fetch('https://example.com/some/v1', {
      headers: {
        'Content-Type': 'text/html',
      },
    })
      .then((response) => response.text())
      .then((data) => setHtmlResponse(data))
      .catch((error) => console.error(error));
  }, []);

  useEffect(() => {
    const styleRegex = /<style\b[^>]*>([\s\S]*?)<\/style>/gm;
    const matches = [...htmlResponse.matchAll(styleRegex)];
    const styles = matches.map((match) => match[1]).join('');

    const styleElement = document.createElement('style');
    styleElement.innerHTML = styles;
    document.head.appendChild(styleElement);
  }, [htmlResponse]);

  return (
    <div dangerouslySetInnerHTML={{ __html: htmlResponse }} />
  );
};

export default MyComponent;
osh3o9ms

osh3o9ms1#

通常,所谓的端点以JSON形式提供序列化数据,而不是整个HTML文档(参见https://www.freecodecamp.org/news/rest-api-best-practices-rest-endpoint-design-examples/
当接收到这些数据时,这些数据被反序列化,然后注入到一个模板中(例如使用React https://react.dev/learn/writing-markup-with-jsx的JSX),所以这可能是应该走的路。
如果它真的更适合你渲染文档的需要,那么iFrame可能是正确的选择:https://www.w3schools.com/tags/tag_iframe.ASP

相关问题