我正在开发一个基于Map的应用程序,它使用Google Map API在React中创建标记和信息窗口。js。infowindow.setContent()
只接受String
或HTML
。我不可能传入String
,因为我有一个button
链接到另一个react组件中的特定方法(类似于:_this.props.addList(place)
)。因此,我必须将参数填充为HTML DOM,如以下代码行所示:
var div = document.createElement('div');
var title = document.createElement('h4');
title.innerHTML = place.name;
var btn = document.createElement('button');
btn.className = 'btn btn-danger btn-block';
btn.appendChild(document.createTextNode('I want to go here !!'));
div.appendChild(title).appendChild(btn);
google.maps.event.addListener(marker, 'click', function() {
infowindow.setContent( div );
infowindow.open(map, this);
});
btn.addEventListener('click', function() {
_this.props.addList(place);
});
这些代码对我有用,但我不想一个一个地创建元素。我也尝试过用React组件传递参数,但似乎不起作用:
createMarker: function() {
/** Some other lines of code */
var _this = this;
google.maps.event.addListener(marker, 'click', function() {
infowindow.setContent( _this._renderInfoWindow(place) );
infowindow.open(map, _this);
});
},
// my infowindow rendering method
_renderInfoWindow: function(place) {
return(
<div>
<h4>{place.name}</h4>
<p>{place.cost}</p>
<button className="btn btn-danger btn-block" onClick={this.props.addList.bind(this, place)}>I want to go here !! </button>
</div>
)
},
那么,有没有其他方法至少可以将React组件转换为HTML,这样我就不必逐个编写document.createElement()
了?
谢谢
7条答案
按热度按时间a2mppw5e1#
您可以通过
React.render
在分离的DOM节点中渲染ReactElement。因此,下面的代码应该为您工作。3gtaxfhh2#
你也可以使用React的renderToString()方法
这应该适用于如图所示的简单组件。React.renderToString()将只返回组件的html。
yzckvree3#
对于较新版本的React
xzlaal3s4#
这应该会呈现HTML。
lskq00tm5#
Alexandre的方法现在已被弃用,而且从来都不是惯用的。这是一种新的方式,用惯用法写:
请注意,JSX混合到了click处理程序中,InfoWindow提取到了它自己的组件中:惯用React
下一个要解决的问题是在同一个节点上创建多个根。这可以通过保持在一个单一的,共享的一个来解决:
然后
8xiog9wr6#
kqlmhetl7#
这就是React 18中应该是这样做的:
我在尝试迁移到React 18时丢失的主要部分是
flushSync
部分。在添加它之前,我的innerHtml
总是返回空字符串。根据这篇文章: www.example.com
flushSync调用是必要的,这样DOM就可以在阅读其innerHTML属性之前更新。
此外,仍然不建议将
renderToString
和将react-dom/server
导入浏览器。