2015-04-12 74 views
11

我正在使用基于地图的应用程序,该应用程序使用Google Map API在React.js中创建标记及其信息窗口。 infowindow.setContent()只接受StringHTML。我不可能通过String,因为我有一个button链接到另一个反应组件中的特定方法(如:_this.props.addList(place))。因此,我必须填写的参数作为HTML DOM为下面的代码行:React.js:是否可以将反应组件转换为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); 
 
});

的代码为我工作,但一个我不想创建元素之一。我也试图通过与阵营成分的说法,但似乎不工作:

​​

所以是有另一种方式来至少转换反应成分为HTML,让我不要不必一一写下document.createElement()

感谢

回答

15

您可以通过React.render呈现一种超然的DOM节点上ReactElement。因此,下面的代码应该适合你。

createMarker: function() { 

    /** Some other lines of code */ 

    _this = this; 

    google.maps.event.addListener(marker, 'click', function() { 

    var div = document.createElement('div'); 
    ReactDOM.render(_this._renderInfoWindow(place), div); 
    infowindow.setContent(div); 
    infowindow.open(map, this); 

    }); 

}, 
+0

我收到以下错误:“未捕获的错误:不变冲突:React.render():无效的组件元素。”当应用您的解决方案 –

+0

得到了解决方案,对不起。这是因为代码在创建元素之前运行React.remder()。这里是解决方案:var div = document.createElement('div'); \t \t \t的setInterval(函数(){ \t \t \t \t如果(DIV) \t \t \t \t \t clearInterval(); \t \t \t},5); \t \t \t React.render(_this._renderInfoWindow(place),div); –

+0

不会'_this'出现在没有'var'的全局范围之前吗?这是打算吗? – wprl

6

你也可以使用阵营的renderToString()方法

_renderInfoWindow: function(place) { 
    return React.renderToString(
    <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.renderToString()将仅返回组件的html。

+3

我用'react-dom/server'和'ReactDOMServer.renderToStaticMarkup'导入ReactDOMServer' – aceofspades

+0

按钮事件处理程序不能使用这种方法。 –

0
// Create a DOM element to hold the react component. 
var span = document.createElement('span'); 
// Render the React component. 
React.render(h.button(null, 'Buttonz!'), span); 
// This will give the result as a string, which is useful if you've escaped 
// React's context (e.g. inside DataTables). 
// Obviously, the component will no longer be reactive but this is a 
// good way to leverage simple stuff you've already written in React. 
// In my case, I'm primarily leveraging React wrappers around Bootstrap components. 
// The important thing is that componentDidMount gets called. 
return span.outerHTML; 
相关问题