当前位置: 首页 > 面试题库 >

React(Facebook):受控复选框的托管状态

杨飞飙
2023-03-14
问题内容

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

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功能,范围thischecks映射功能是不同的render,这是你需要的范围__changeSelection,所以this.__changeSelection不会找到一个__changeSelection属性。如果.bind(this)在该映射函数的末尾添加a
,则可以将其作用域绑定thisrender

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

}

这是所有示例放在一起的示例,以及一个jsfiddle可供您试用:

/** @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'));


 类似资料:
  • 问题内容: 我是React的新手,可能缺少正确的术语来找到我的问题的解决方案。没那么难。 我正在构建一个简单的应用程序,它显示一组问题,一次显示一个问题。回答一个问题后,显示下一个问题。 我有一个呈现3个复选框的组件,每个复选框代表一个可能的问题。 在我的主要组件内部,我这样调用该组件: 是我的函数,该函数递增以显示下一个问题: 一切正常,除了:当显示下一个问题时,我希望所有3个复选框都不再选中。

  • 我有一个带有复选框的列表,我在中应用了相同的行为 我的问题是,如果我先选中活动中的复选框,然后通过(模拟从服务器下载新数据)删除第一项,然后再次渲染,则选中第二个活动中的复选框。 当它不附加到实例时,的目的是什么。渲染工作正常,因为在控制台中打印的,所以被从第一运动移动到第二运动。

  • 这是我的状态 我试图做的是,每当选中或未选中复选框时,我将相应的复选框设置为true/false。根据每个复选框的这个布尔值,我过滤出,然后在UI上呈现它。当单击复选框时,我能够筛选结果,但当未选中复选框时,我无法显示所有结果。当复选框发生更改时,我就是这样处理的。 我知道我没有正确地处理状态,在这种情况下我能做什么。为了更好地参考,这里是完整的搜索结果代码。

  • 当html页面上没有任何变量可以切换时,是否有人知道如何使用selenium处理或读出复选框的状态(true/false)。我已经尝试了常用函数。isselected()和。isenabled(),但这些函数只读取不可用的值。 有人知道有没有办法得到这个身份吗?此外,xml的屏幕截图以及它是哪个元素。 如果有人有主意就太好了。我在用Java编程。

  • 问题内容: 我的ListView自定义适配器(及其新实现的viewHolder)存在一些问题。我有一个ListView,每个项目都有一个复选框(这里没有新内容)。问题是,如果列表中有9个以上的项目,则当我选中第一个复选框时,将自动检查第10个复选框(第二个和第11个复选框相同),就像两个项目都有一个监听器一样(我相信情况确实如此)。 我在这里阅读了有关listView的位置问题,视图回收以及Vie

  • 警告:组件正在更改要控制的非受控输入类型复选框。输入元件不应从不受控制切换到受控(反之亦然)。决定在组件的生命周期内使用受控或不受控制的输入元件。 我的代码: