反应JS和泄漏的输入

时间:2015-03-03 18:35:26

标签: javascript memory-leaks reactjs

我是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的窗口对象的属性;但是,我没有给它那个名字,我当然没有明确地将它直接添加到窗口对象。

为什么这个输入仍然存在?

heap snapshot showing leak

0 个答案:

没有答案