javascript - react ( Facebook ): managed state of controlled checkboxes

标签 javascript facebook reactjs

我在尝试使用 React 创建一个用于选择和取消选择其他单个复选框(全选/取消全选)的复选框时遇到了一个小问题。 .我读过 http://facebook.github.io/react/docs/forms.html并发现controllednot controlled之间存在差异<input>秒。我的测试代码如下:

var Test = React.createClass({
    getInitialState: function() {
        return {
            data: [
                { id: 1, selected: false },
                { id: 2, selected: false },
                { id: 3, selected: false },
                { id: 4, selected: false }
            ]
        };
    },
    render: function() {
        var checks = this.state.data.map(function(d) {
            return (
                <div>
                    <input type="checkbox" data-id={d.id} checked={d.selected} onChange={this.__changeSelection} />
                    {d.id}
                    <br />
                </div>
            );
        });
        return (
            <form>
                <input type="checkbox" ref="globalSelector" onChange={this.__changeAllChecks} />Global selector
                <br />
                {checks}
            </form>
        );
    },
    __changeSelection: function(e) {
        var id = e.target.getAttribute('data-id');
        var state = this.state.data.map(function(d) {
            return {
                id: d.id,
                selected: (d.id === id ? !d.selected : d.selected)
            };
        });

        this.setState({ data: state });

    },
    __changeAllChecks: function(e) {
        var value = this.refs.globalSelector.getDOMNode().checked;
        var state = this.state.data.map(function(d) {
            return { id: d.id, selected: value };
        });

        this.setState({ data: state });
    }
});

React.renderComponent(<Test />, document.getElementById('content'));

“全局选择器”按预期工作:选中时,将选中所有其他检查。问题是 __changeSelection()单击其他复选框之一时不会触发处理程序。

我不知道完成这项工作的正确方法是什么。也许 React 模型不是模拟这种交互的最佳模型?我能做什么?

提前致谢

最佳答案

在您的render 函数中,checks 映射函数的this 的作用域不同于render,这是 __changeSelection 所需的范围,因此 this.__changeSelection 不会找到 __changeSelection 属性。如果将 .bind(this) 添加到该映射函数的末尾,则可以将其范围绑定(bind)到与 render 相同的 this:

var checks = this.state.data.map(function(d) {
    return (
        <div>
            <input type="checkbox" data-id={d.id} checked={d.selected} onChange={this.__changeSelection} />
            {d.id}
            <br />
        </div>
    );
}.bind(this));

附带说明一下,我只是将 id 传递给处理函数,而不是分配数据属性。这将消除在您的处理程序中定位该元素的需要:

var checks = this.state.data.map(function(d) {
    return (
        <div>
            <input type="checkbox" checked={d.selected} onChange={this.__changeSelection.bind(this, d.id)} />
            {d.id}
            <br />
        </div>
    );
}.bind(this));

然后更新您的 __changeSelection 函数以将 id 作为第一个 arg 传递并删除属性查找行:

__changeSelection: function(id) {
    var state = this.state.data.map(function(d) {
        return {
            id: d.id,
            selected: (d.id === id ? !d.selected : d.selected)
        };
    });

    this.setState({ data: state });

}

这是所有内容的示例,along with a jsfiddle for you to try it out :

/** @jsx React.DOM */

var Test = React.createClass({
    getInitialState: function() {
        return {
            data: [
                { id: 1, selected: false },
                { id: 2, selected: false },
                { id: 3, selected: false },
                { id: 4, selected: false }
            ]
        };
    },
    render: function() {
        var checks = this.state.data.map(function(d) {
            return (
                <div>
                    <input type="checkbox" checked={d.selected} onChange={this.__changeSelection.bind(this, d.id)} />
                    {d.id}
                    <br />
                </div>
            );
        }.bind(this));
        return (
            <form>
                <input type="checkbox" ref="globalSelector" onChange={this.__changeAllChecks} />Global selector
                <br />
                {checks}
            </form>
        );
    },
    __changeSelection: function(id) {
        var state = this.state.data.map(function(d) {
            return {
                id: d.id,
                selected: (d.id === id ? !d.selected : d.selected)
            };
        });

        this.setState({ data: state });

    },
    __changeAllChecks: function() {
        var value = this.refs.globalSelector.getDOMNode().checked;
        var state = this.state.data.map(function(d) {
            return { id: d.id, selected: value };
        });

        this.setState({ data: state });
    }
});

React.renderComponent(<Test />, document.getElementById('content'));

关于javascript - react ( Facebook ): managed state of controlled checkboxes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21581688/

相关文章:

javascript - 有没有办法让外部固定布局 iframe 子页面在移动设备上工作?

javascript - 防止用户篡改 Chrome 扩展程序的免费试用版

ios - React Native 选择器值在选择时重置

php - 为什么我的应用程序 (Android) 和网站 (PHP) 的相同帐户无法获得相同的 Facebook ID?

javascript - 在react input中没有输入时显示信息

javascript - 如何在 Javascript 中创建单例类?

javascript - 按数据属性对 div 进行排序 - 类型错误

javascript - jquery 的语义选项卡和 Handlebars 问题,选项卡内容未变为事件状态

javascript - FB.login,防止启动新窗口,在当前窗口导航

javascript - 创建逗号分隔对象列表的最短方法