如何将带有事件绑定的 hml 作为字符串传递给 render() 方法?
How to pass hml with event bindings as a string into the render() method?
我想获取其中包含 a
标记的 HTML 字符串,为它们分配事件处理程序,然后呈现它们。示例 html:
This is a sample blog post with HTML. <a data-id="1">Click here.</a>
我可以使用 jQuery 解析此 HTML 字符串并插入事件(或道具,或其他任何东西),如下所示:
This is a sample blog post with HTML. <a data-id="1" ref="myClick" onClick={this.handleClick}>Click here.</a>
现在我要渲染它:
return (
<div>
<p dangerouslySetInnerHTML={{__html: theHtml}}></p>
</div>
);
但这呈现了原始 HTML,没有任何 React 魔力。如何将 HTML/formatting 创建为字符串,然后将其正常呈现?
没有好的办法。我能想到的最好的方法是将字符串解析为 html ast,然后从中创建虚拟 dom。这不是很快,也不是很容易做到。
除此之外,您的选择是:
- 没有 html 字符串
- 有可以从
生成虚拟dom的数据
- 如果可能的话,这总是最好的
- 使用 dangerouslySetInnerHTML 并在 componentDidMount 中手动附加监听器
- 如果有很多监听器会很慢,你需要在 componentWillUnmount 中清理它们
- 将反应事件处理程序放在包装器上 div,并使用 e.target 查看事件的目标是什么(即使用事件冒泡)
第二个项目符号示例:
componentDidMount: function(){
var el = this.getDOMNode();
// add a click listener to the first <a> child
el.querySelector('a').addEventListener('click', this.aClick)
},
componentWillUnmount: function(){
var el = this.getDOMNode();
el.querySelector('a').removeEventListener('click', this.aClick)
},
aClick: function(event){ ... }
我想获取其中包含 a
标记的 HTML 字符串,为它们分配事件处理程序,然后呈现它们。示例 html:
This is a sample blog post with HTML. <a data-id="1">Click here.</a>
我可以使用 jQuery 解析此 HTML 字符串并插入事件(或道具,或其他任何东西),如下所示:
This is a sample blog post with HTML. <a data-id="1" ref="myClick" onClick={this.handleClick}>Click here.</a>
现在我要渲染它:
return (
<div>
<p dangerouslySetInnerHTML={{__html: theHtml}}></p>
</div>
);
但这呈现了原始 HTML,没有任何 React 魔力。如何将 HTML/formatting 创建为字符串,然后将其正常呈现?
没有好的办法。我能想到的最好的方法是将字符串解析为 html ast,然后从中创建虚拟 dom。这不是很快,也不是很容易做到。
除此之外,您的选择是:
- 没有 html 字符串
- 有可以从 生成虚拟dom的数据
- 如果可能的话,这总是最好的
- 使用 dangerouslySetInnerHTML 并在 componentDidMount 中手动附加监听器
- 如果有很多监听器会很慢,你需要在 componentWillUnmount 中清理它们
- 将反应事件处理程序放在包装器上 div,并使用 e.target 查看事件的目标是什么(即使用事件冒泡)
第二个项目符号示例:
componentDidMount: function(){
var el = this.getDOMNode();
// add a click listener to the first <a> child
el.querySelector('a').addEventListener('click', this.aClick)
},
componentWillUnmount: function(){
var el = this.getDOMNode();
el.querySelector('a').removeEventListener('click', this.aClick)
},
aClick: function(event){ ... }