React (Facebook): managed state of controlled checkboxes

后端 未结 2 493
执笔经年
执笔经年 2020-12-14 01:05

I\'m having a little problem while trying to create a checkbox that selects and deselects other individual checkboxes (select/deselect all) with React. I\'ve read http://fac

2条回答
  •  南笙
    南笙 (楼主)
    2020-12-14 02:05

    In your render function, the scope of this for the checks mapping function is different from render, which is the scope you need for __changeSelection, so this.__changeSelection won't locate a __changeSelection property. If you add a .bind(this) to the end of that mapping function, you can bind it's scope to the same this as render:

    var checks = this.state.data.map(function(d) {
        return (
            
    {d.id}
    ); }.bind(this));

    On a side note, I would just pass the id to the handler function instead of assigning data-attributes. This will remove the need to locate that element in your handler:

    var checks = this.state.data.map(function(d) {
        return (
            
    {d.id}
    ); }.bind(this));

    Then update your __changeSelection function to pass in the id as the first arg and remove the attribute lookup line:

    __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 });
    
    }
    

    Here is an example of it all put together, 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 (
                    
    {d.id}
    ); }.bind(this)); return (
    Global selector
    {checks}
    ); }, __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(, document.getElementById('content'));

提交回复
热议问题