我正在尝试使用this._rootNodeID
handleClick: function() { React.unmountComponentAtNode(this._rootNodeID) }
但它会返回false
。
单击某个元素时会触发handleClick
,并应卸载根节点。有关unmountComponentAtNode
here
我也试过这个:
React.unmountComponentAtNode($( '* [数据reactid = “ '+ this._rootNodeID +”']')[0])
该选择器适用于jQuery.hide()
,但不能与卸载它一起使用,而文档说明它应该是DOMElement
,就像您用于React.renderComponent
经过几次测试后发现它适用于一些元素/选择器。
它以某种方式适用于选择器:document.getElementById('maindiv')
,其中maindiv
是一个不是用React.js生成的元素,而只是普通的html。然后它返回true
。
但是一旦我尝试选择使用React.js生成的不同ElementById,它就会返回false。它也不能与document.body
一起工作,尽管如果我控制它们,它们基本上都返回相同的东西.log(getElementsByClassName('bla')[0]
也不起作用)
应该有一种简单的方法可以通过this
选择节点,而不必诉诸jQuery或其他选择器,我知道它就在那里......
答案 0 :(得分:75)
从安装它们的同一DOM元素中卸载组件。所以如果你做了类似的事情:
ReactDOM.render(<SampleComponent />, document.getElementById('container'));
然后你将用以下方法卸载它:
ReactDOM.unmountComponentAtNode(document.getElementById('container'));
以下是a simple JSFiddle我们安装组件,然后在3秒后卸载它。
答案 1 :(得分:35)
这对我有用。如果findDOMNode
返回null,您可能需要采取额外的预防措施。
ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(this).parentNode);
答案 2 :(得分:6)
我使用的例子:
unmount: function() {
var node = this.getDOMNode();
React.unmountComponentAtNode(node);
$(node).remove();
},
handleClick: function() {
this.unmount();
}
答案 3 :(得分:2)
您不需要卸载组件的简单解决方案是更改状态并呈现空div
const AlertMessages = React.createClass({
getInitialState() {
return {
alertVisible: true
};
},
handleAlertDismiss() {
this.setState({alertVisible: false});
},
render() {
if (this.state.alertVisible) {
return (
<Alert bsStyle="danger" onDismiss={this.handleAlertDismiss}>
<h4>Oh snap! You got an error!</h4>
</Alert>
);
}
return <div></div>
}
});
答案 4 :(得分:1)
如the GitHub issue you filed中所述,如果要访问组件的DOM节点,可以使用this.getDOMNode()
。但是组件无法卸载自身。请参阅迈克尔的答案,了解正确的方法。
答案 5 :(得分:0)
首先,我也是反应新手。当然我们可以通过切换状态来控制所有组件,但是当我尝试测试时,我得到了,React.unmountComponentAtNode(parentNode)
只能卸载由{{1}呈现的组件}。因此,必须使用React.render(<SubComponent>,parentNode)
方法添加要删除的<SubComponent>
,因此我会编写代码
React.render()
在jsFiddle中运行示例代码,然后试一试。
注意:示例代码
<script type="text/jsx"> var SubComponent = React.createClass({ render:function(){ return ( <div><h1>SubComponent to be unmouned</h1></div> ); }, componentWillMount:function(){ console.log("componentWillMount"); }, componentDidMount:function(){ console.log("componentDidMount"); }, componentWillUnmount:function(){ console.log("componentWillUnmount"); } }); var App = React.createClass({ unmountSubComponent:function(){ var node = React.findDOMNode(this.subCom); var container = node.parentNode; React.unmountComponentAtNode(container); container.parentNode.removeChild(container) }, componentDidMount:function(){ var el = React.findDOMNode(this) var container = el.querySelector('.container'); this.subCom = React.render(<SubComponent/> , container); }, render:function(){ return ( <div className="app"> <div className="container"></div> <button onClick={this.unmountSubComponent}>Unmount</button> </div> ) } }); React.render(<App/> , document.body); </script>
被React.findDOMNode
替换为reactjs版本问题。