代码之家  ›  专栏  ›  技术社区  ›  JChao

reactjs-handle复选框(多个)单击事件

  •  0
  • JChao  · 技术社区  · 6 年前

    我有一个组件,它显示键列表,每个键都有一个附加到字符串的复选框。另外,我还有一个按钮,可以调用一个API,选择所有键并删除这些键。

    我正在努力实现以下几点:

    1. 选中复选框将启用“删除”按钮
    2. 点击delete按钮应该发送一个POST到API,然后重新加载列表
    3. 由于列表被重新加载,所有复选框都应该被取消选中,因此删除按钮再次被禁用
    4. 在这个函数之外还有一个按钮可以检查列表的长度,如果我在组件中获取列表,我不知道如何将它与这个列表相关联。

    我面临的问题是,我不知道如何使按钮和复选框相互关联。我试着用一个 checked 状态,这是一个布尔值,但这只是一个布尔值,不能记录多个键。我觉得用数组行吗?我不知道如何正确地附加或删除选中的键。

    我的代码看起来像

    class AppList extends Component {
        constructor() {
            super();
            this.state = {
                checked: [],
                apps: []
            };
            this.handleChecked = this.handleChecked.bind(this);
        }
    
    
        componentDidMount() {
            fetch("some_url", {
                method: 'post',
                body: JSON.stringify({"user": "some_email"}),
                headers: {'Content-Type': ' application/json'}
            })
            .then(res => res.json())
            .then(
                (result) => {
                    this.setState({apps: JSON.parse(result)});
                },
                (error) => {
                    console.log("error", error);
                }
            );
        }
    
        handleDeleteKey = (event) => {
            // fetch(I'll worry about this later)
            this.setState({checked: false});
            console.log("delete!!!!");
        }
    
        handleChecked () {
            this.setState({checked: !this.state.checked});
        }
    
    
        render () {
            const apps = this.state.apps.map((app) =>
                <div>
                    <input type="checkbox" onChange={this.handleChecked} />
                    {`   ${app}`}
                </div>
            );
    
            return (
                <div>
                    <h4>Client Key List:</h4>
                    {this.state.apps.length > 0 ? <ul>{apps}</ul> : <p>No Key</p>}
                    {this.state.apps.length > 0 ? <button className="api-instruction-button" onClick={this.handleDeleteKey}>Delete Selected Key(s)</button> : null}
                </div> 
            );
        }
    
    
    } 
    
    export default AppList;
    

    我觉得我的设计是完全错误的,但我不知道如何修复它。似乎要传递的状态太多了,没有什么是最外层的,几乎是循环依赖。

    有人有处理这个问题的经验吗?这似乎是一个常见的用户行为,但我想不通。

    编辑:再挖一点,好像我需要打电话 componentDidMount 外面的 AppList . 它应该在使用 ,我们称之为 MainApp .

    主控制程序 组件安装 和我的一样 申请者 . 在里面的那个 申请者 被移除,键作为道具传递给AppList。

    我无法处理点击事件。组件似乎总是在更新,所以如果我想将clicked键附加到数组中,它就不起作用了。同样的电话会一次又一次地打。

    因为里面还有一个按钮 主控制程序 那需要钥匙清单,我不能把电话传给 . 但是,在 申请者 应该更新 主控制程序 也。它是如何工作的?我很困惑

    https://codesandbox.io/s/7w2w11477j

    这个娱乐活动应该包含我目前为止的所有功能,但我不能让它们一起工作。

    • 我有一个字符串列表,每个字符串都有一个复选框
    • 有一个按钮,我可以点击删除我的数据库中的这些条目调用一个API
    1 回复  |  直到 6 年前
        1
  •  1
  •   Jacob Lockett    6 年前

    我相信你的目的是: https://codesandbox.io/s/w23wv002yw

    内容:

    这个 MainApp.js 只包含 apps 以及在后端删除它们的方法。除了这两种方法之外,没有其他方法真正关系到 文件。

    这个 AppList.js 将包含更新其自身的所有方法 checked 状态、删除按钮本身以及清除 选中的 删除时的状态。

    过程:

    将加载和重新装载后端api并填充其 应用程序 应用程序.js . 从那里开始, 将该列表呈现为屏幕上的多选字段。然后用户可以选择或取消选择任何选项。选择某个选项后,其索引将被推送到 选中的

    (订购阵列并不是那么必要,但我认为如果您想在将来某个时候对其进行重新配置,它会有所帮助)

    delete 按钮将出现。当用户单击 删除 应用程序.js 从传递给它的函数 主应用程序.js ,则会清除电流 选中的