use*_*422 5 javascript reactjs
在这里反应新手.我有一个contenteditable
div dangerouslySetInnerHTML
作为孩子,因为我需要在运行时格式化用户输入的内容.在特定范围内单击HTML内部,我想要setState
包含组件的变量之一.
可以这样做吗?
如果没有,我应该如何改变我的结构?
这是代码:
updateText:function(){
var txt = $('#text_Box').text();
if(txt.indexOf('@Name') > -1)
{
txt = txt.replace('@Name','<span class=\'tagged\' contenteditable = \'false\' onclick=\'doSomething()\'>:Name</span>');
}
this.setState({userText:txt});
},
render:function(){
return <div className="inputDiv" contentEditable="true" type="text" className="form-control" id="text_Box" dangerouslySetInnerHTML={{__html:this.state.userText}} onInput = {this.updateText} />
}
Run Code Online (Sandbox Code Playgroud)
我正在采取doSomething()方法.
如果希望跨度响应单击事件,则只应在重新呈现组件后分配事件处理程序(doSomething),因为当您为innerHtml分配新值时,将清除此组件中的所有事件处理程序.另一种解决方案是使用这样的事件委托:
onClick: function(e) {
var $el = $(e.target);
if ($el.is('span.tagged')) {
this.doSomething($el);
}
},
render:function(){
return (
<div
className="inputDiv form-control"
contentEditable="true"
onClick={this.onClick}
type="text"
id="text_Box"
dangerouslySetInnerHTML={{__html: this.state.userText}}
onInput={this.updateText} />
);
}
Run Code Online (Sandbox Code Playgroud)
另一种可能的解决方案是使用createElement,createTextNode和appendChild方法直接使用DOM树.
尝试这个:
updateText: function() {
var txt = $('#text_Box').text();
if (txt.indexOf('@Name') > -1) {
txt = txt.replace('@Name', '<span class="tagged" contenteditable="false" onclick="' + this.doSomething() + '">:Name</span>');
}
this.setState({userText: txt});
},
render:function(){
return (
<div
className="inputDiv form-control"
contentEditable="true"
type="text"
id="text_Box"
dangerouslySetInnerHTML={{__html: this.state.userText}}
onInput={this.updateText} />
);
}
Run Code Online (Sandbox Code Playgroud)