Можно ли использовать ReactDOMServer.renderToString в браузере в областях, где React напрямую не управляет DOM?
Я работаю над приложением, используя листовка (via реагировать-листовка). Листовка непосредственно манипулирует DOM. Библиотека листовок react не изменяет этого, она просто дает вам компоненты React, которые вы можете использовать для управления картой листовок в React-friendly.
в этом приложении я хочу использовать пользовательские маркеры карты, которые divs, содержащие несколько простых элементов. Способ сделать это в листовке-установить icon
свойство a DivIcon, в котором вы можете установить свой собственный HTML. Установить, что внутренний HTML-код путем установки DivIcon на html
свойство строки, содержащей HTML. В моем случае я хочу, чтобы HTML отображался из компонента React.
для этого, похоже, правильный подход заключается в использовании ReactDOMServer.renderToString()
чтобы отобразить компонент, который я хочу внутри маркера карты в строку, которую я бы затем установил как html
свойства 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} />
)
}
}
однако, согласно React docs:
этот [renderToString] должен использоваться только на сервере.
это строгое правило, или оно предназначено только для того, чтобы отговорить людей от обхода эффективного управления DOM ReactDOM?
Я не могу придумать другой (лучший) способ выполнить то, что мне нужно. Все комментарии или идеи будут с благодарностью.
2 ответов
согласно новой документации:https://reactjs.org/docs/react-dom-server.html
следующие методы могут использоваться как на сервере, так и в браузере окружение:
- renderToString ()
- renderToStaticMarkup ()
я использовал то же самое, renderToString
, но поскольку документация рекомендует не использовать его на стороне клиента, я достиг этого другим способом, используя react-dom
' s render
метод для визуализации пользовательского компонента в div
var myDiv = document.createElement('div');
ReactDOM.render(
<MarkerContents data={this.props.data} />,
myDiv
);
var myIcon = L.divIcon({
iconSize: new L.Point(50, 50),
html: myDiv.innerHTML
});