我是React JS的新手(使用v0.10.0),我正在尝试修复项目中的内存泄漏。这就是我正在做的事情来渲染有问题的页面......
var mainContent = React.createClass({
/*...various functions for handling state changes...*/
render: function() {
return React.DOM.div({
children: [
/*...some children...*/
React.DOM.input({
id: 'quizname-textbox',
type: 'text',
className: 'textfield text-entry-toggle-textbox',
value: this.state.value,
autoComplete:"off",
autoCorrect: "off",
autoCapitalize: "off",
placeholder: gettext('Name Your Quiz...'),
maxLength: "255",
onBlur: this.handleBlur,
onChange: this.handleChange
}),
/*...more children...*/
]
});
}
});
React.renderComponent(mainContent, document.getElementById('main-content'));
...当我离开页面时,我正在这样做:
React.unmountComponentAtNode(document.getElementById('main-content'));
对unmountComponentAtNode()
的调用返回true,表示该组件已成功删除。但是,如果我使用Chrome的开发人员工具获取堆快照,我会看到一个独立的DOM树,其中包含页面上的所有元素。上面的输入元素是唯一的黄色元素 - 意味着它仍然有一个JavaScript引用 - 所以它可能导致整个页面被泄露(见截图)。我无法弄清楚为什么还有对该输入的引用 - 我没有明确地向其添加任何其他事件侦听器,并且它未在this.handleBlur()
或this.handleChange()
内引用。此外,如果我只是简单地将输入注释到子项列表中,问题就会完全消失(DOM树不再显示在分离列表中)。
这可能是最奇怪的线索:堆快照说输入是名为elt
的窗口对象的属性;但是,我没有给它那个名字,我当然没有明确地将它直接添加到窗口对象。
为什么这个输入仍然存在?