当前位置: 首页 > 知识库问答 >
问题:

为什么renderToString在呈现Material-UI组件时抛出关于UseLayouteFffect的错误?

东郭展
2023-03-14

我使用的是React v.16.12.0和@MaterialUI/Core v4.8.1。

我正在尝试为React传单标记创建自定义图标。图标是来自Material-UI的Fab组件。为此,我需要将HTML字符串传递给L.DivIcon(DivIcon Docs)传单组件,因此我使用RenderToString()方法从React-DOM/Server

它会抛出一个错误:

警告:UseLayouteFffect在服务器上不执行任何操作,因为它的效果无法编码为服务器呈现器的输出格式。这将导致初始、非水合UI和预期UI之间的不匹配。为了避免这种情况,UseLayouteFffect应该只用于在客户端上以独占方式呈现的组件中。NoSsr中的按钮中的ForwardRef(ButtonBase)中的WithStyles(ForwardRef(ButtonBase))中的ForwardRef(Fab)中的WithStyles(ForwardRef(Fab))(在src/index.js:9)

而我没有使用uselayouteffect。

这里有一个简单的例子:

import React from "react";
import ReactDOM from "react-dom";
import ReactDOMServer from 'react-dom/server';
import Fab from '@material-ui/core/Fab';

function App() {
  return ReactDOMServer.renderToString(
    <Fab size="small" variant="extended">
      Test
    </Fab>);
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

在线:https://codesandbox.io/s/material-ui-rendertoString-tc90b

它为什么要抛出那个错误?这个代码有什么不对的?有没有其他方法可以从Material-UI组件生成HTML-String,以便将其作为图标传递给传单标记?

共有1个答案

廖臻
2023-03-14

我使用RenderToStaticMarkup呈现自定义标记。标记正在呈现,但仍然得到警告。

import React, { Component } from "react";
import ReactDOM from "react-dom";
import { renderToStaticMarkup } from "react-dom/server";
import { divIcon } from "leaflet";
import { Map, TileLayer, Marker, Popup } from "react-leaflet";
import Fab from "@material-ui/core/Fab";

import "./styles.css";

class App extends Component {
  state = {
    lat: 51.505,
    lng: -0.091,
    zoom: 13
  };

  render() {
    const position = [this.state.lat, this.state.lng];
    const iconMarkup = renderToStaticMarkup(
      <Fab size="small" variant="extended">
        Test
      </Fab>
    );
    const customMarkerIcon = divIcon({
      html: iconMarkup
    });

    return (
      <div>
        <Map center={position} zoom={this.state.zoom}>
          <TileLayer
            attribution='&amp;copy <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
            url="https://{s}.tile.osm.org/{z}/{x}/{y}.png"
          />
          <Marker position={position} icon={customMarkerIcon}>
            <Popup>
              A pretty CSS3 popup. <br /> Easily customizable.
            </Popup>
          </Marker>
        </Map>
      </div>
    );
  }
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

工作代码:https://codesandbox.io/s/react-leaflet-icon-material-MX1IU

 类似资料:
  • 我一直在尝试一些组件,这些组件执行react-cache风格的事情,并在render方法中执行web服务调用,将promise抛出到React.Suspense组件,并在数据存在时重新呈现。它们调用web服务,检查响应,并根据响应呈现或抛出错误到错误边界。我注意到,每当在组件中抛出错误时,它都会呈现两次。第一次callstack看起来正常,第二次callstack包括对invokeGuardedC

  • 我有两个反应组件Post和Postform。Posts是显示从api获取的帖子列表的组件。Postform组件是一种创建新帖子,然后更新帖子组件的表单。我在Posts中声明了一个函数addPost()为全局函数,并将其绑定在Posts构造函数中。然后,addPost()方法从Posts导出,并导入到Postform组件中,在那里我想使用导入的addPost()方法更新Posts组件的状态 但是,我

  • 我得到而调用 Java语言lang.StackOverflowerr:org处为null。阿帕奇。平民登录中。日志适配器$Slf4jLog。isDebugEnabled(LogAdapter.java:300)~[spring-jcl-5.1.10.RELEASE.jar:5.1.10.RELEASE]位于org。springframework。安全身份验证。ProviderManager。在or

  • 我正在遵循JavaFX教程并编写了以下代码。 将导入所有必需的头文件。 主要的Java语言 主要的fxml(使用SceneBuilder创建) 堆栈跟踪 我尝试了与getResource(“Main.fxml”)的每一种组合,包括以各种可能的方式使用相对路径和绝对路径,但我还是遇到了错误。代码与该教程完全相同。

  • 我正在编码一个不和谐机器人,它检查用户是否在我的不和谐服务器上,以及他是否有某个角色。然而,我得到一个错误消息,如果用户不是在我的不和,尽管使用捕捉。我有以下代码: 现在,错误消息是: (节点: 15184)UnhandledPromiseRejtionWarning: DiscordAPIError:未知成员在请求Handler.execute(c:\用户\用户\桌面\DiscordBot\My

  • 问题内容: 我正在使用iReport构建jaspersoft报告,并且正在使用Fishbowl作为我的DBMS。 我建立了表,并在iReport中显示了我的表是关系型的,但是由于某种原因,它使我出错并且无法运行。它应该非常简单。我要输入邮政编码,日期范围或州名,并输出productName,已实现的总数量,邮政编码和州名的缩写。 当我确实将报告上载到Fishbowl时,它可以运行,但最终崩溃并显示