Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it ok to use ReactDOMServer.renderToString in the browser in areas where React isn't directly managing the DOM?

I'm working on an app using Leaflet (via react-leaflet). Leaflet directly manipulates the DOM. The react-leaflet library doesn't change that, it just gives you React components that you can use to control your Leaflet map in a React-friendly way.

In this app, I want to use custom map markers that are divs containing a few simple elements. The way to do that in Leaflet is to set your marker's icon property to a DivIcon, in which you can set your custom HTML. You set that inner HTML by setting the DivIcon's html property to a string containing the HTML. In my case, I want that HTML to be rendered from a React component.

In order to do that, it seems like the correct approach is to use ReactDOMServer.renderToString() to render the Component that I want inside the map marker into a string, which I would then set as the html property of the DivIcon:

MyMarker.js:

import React, { Component } from 'react' import { renderToString } from 'react-dom/server' import { Marker } from 'react-leaflet' import { divIcon } from 'leaflet'  import MarkerContents from './MarkerContents'  export class MyMarker extends Component {   render() {     const markerContents = renderToString(<MarkerContents data={this.props.data} />)     const myDivIcon = divIcon({       className: 'my-marker',       html: markerContents     })      return (       <Marker         position={this.props.position}         icon={myDivIcon} />     )   } } 

However, according to the React docs:

This [renderToString] should only be used on the server.

Is this a strict rule, or is it only meant to dissuade people from circumventing ReactDOM's efficient management of the DOM?

I can't think of another (better) way to accomplish what I'm after. Any comments or ideas would be greatly appreciated.

like image 497
Shane Cavaliere Avatar asked May 06 '16 19:05

Shane Cavaliere


People also ask

What is renderToString in react?

renderToString(element) Render a React element to its initial HTML. React will return an HTML string. You can use this method to generate HTML on the server and send the markup down on the initial request for faster page loads and to allow search engines to crawl your pages for SEO purposes.

Which of following methods can be used in both the server and browser environments?

The following methods can be used in both the server and browser environments: renderToString() renderToStaticMarkup()

How does react render on browser?

React internally creates, updates, and destroys instances to figure out the DOM elements tree that needs to be rendered to the browser. When working with class components, it's common to refer to their browser-rendered DOM elements as component instances. You can render many instances of the same component.


1 Answers

According to the new documentation: https://reactjs.org/docs/react-dom-server.html

The following methods can be used in both the server and browser environments:

  • renderToString()
  • renderToStaticMarkup()
like image 114
Thomas Grainger Avatar answered Sep 21 '22 15:09

Thomas Grainger