【问题标题】:how to toggle all checkbox by clicking header checkbox react js如何通过单击标题复选框来切换所有复选框反应js
【发布时间】:2022-01-30 05:33:06
【问题描述】:

有没有人可以帮助我如何在 toggleCheckboxes() 中实现功能以选中所有复选框。在我的代码中有一个 map 方法。它控制复选框输入的数量。在表 Data 中,每个复选框类型的输入都会在从 manageOrder 映射项目后显示。我尝试使用 useState、setAttribute 但无法解决此问题。

import React, { useEffect, useState, useRef } from 'react';
import { Container, Spinner } from 'react-bootstrap';
import './ManageAllOrder.css';

const ManageAllOrder = () => {
    const [manageOrder, setManageOrder] = useState([]);
    useEffect(() => {
        fetch('https://ghostly-blood-77078.herokuapp.com/orders')
        .then(res => res.json())
        .then(data => setManageOrder(data))
    }, [])
    //change status after click
    const changeStatus= (e) => {
        e.target.innerText = 'active'
    }
    //toggle checkbox
    const rowCheckbox = useRef('')
    const toggleCheckboxes = () => {
        


    }

    return (
        <Container>
            <div>
                <h3 className='my-4' style={{color: '#34495E'}}>Order Management</h3>
                <div>
                {!manageOrder.length ? 
                      <Spinner animation="grow" variant="warning" /> :

                    //table to show data
                    <table className="table">
                        <thead className='table-warning'>
                            <tr>
                                <th><input id='header-checkbox' type='checkbox' onClick={toggleCheckboxes()} /></th>
                                <th>OrderID</th>
                                <th>Date</th>
                                <th>Customer</th>
                                <th>Order</th>
                                <th>Place</th>
                                <th>Price</th>
                                <th>Status</th>
                                <th>Delete</th>
                            </tr>
                        </thead>
                        <tbody>
                    {manageOrder.map(order =>
                            <tr>
                                <td><p><input type='checkbox' ref={rowCheckbox}/></p></td>
                                <td><p>{order._id}</p></td>
                                <td><p>{order.date}</p></td>
                                <td><p>{order.displayName}</p></td>
                                <td><p>{order.name}</p></td>
                                <td><p>{order.place}</p></td>
                                <td><p>{order.amount}</p></td>
                                <td><p onClick={(e) => changeStatus(e)}>pending...</p></td>
                            </tr>
                        )}
                        </tbody>
                    </table>
                }
                </div>
            </div>
        </Container>
    );
};

export default ManageAllOrder;```


[i want to toggle all checkboxes after clicking the checkbox top left corner, i tried a few ways to implement that but i can't because of map method. ][1]
  [1]: https://i.stack.imgur.com/SfbSJ.png

【问题讨论】:

标签: javascript reactjs checkbox


【解决方案1】:

您可以尝试使用 useState 钩子将检查设置为 true/false,然后使用输入道具 checked 并将其设置为如下状态:

import React, { useEffect, useState, useRef } from 'react';
import { Container, Spinner } from 'react-bootstrap';
import './ManageAllOrder.css';

const ManageAllOrder = () => {
    const [manageOrder, setManageOrder] = useState([]);
    const [checked, setChecked] = useState(false)
    useEffect(() => {
        fetch('https://ghostly-blood-77078.herokuapp.com/orders')
        .then(res => res.json())
        .then(data => setManageOrder(data))
    }, [])
    //change status after click
    const changeStatus= (e) => {
        e.target.innerText = 'active'
    }
    //toggle checkbox
    const rowCheckbox = useRef('')
    const toggleCheckboxes = () => {
        setChecked(prevState => !prevState)
    }

    return (
        <Container>
            <div>
                <h3 className='my-4' style={{color: '#34495E'}}>Order Management</h3>
                <div>
                {!manageOrder.length ? 
                      <Spinner animation="grow" variant="warning" /> :

                    //table to show data
                    <table className="table">
                        <thead className='table-warning'>
                            <tr>
                                <th><input id='header-checkbox' type='checkbox' onClick={toggleCheckboxes} /></th>
                                <th>OrderID</th>
                                <th>Date</th>
                                <th>Customer</th>
                                <th>Order</th>
                                <th>Place</th>
                                <th>Price</th>
                                <th>Status</th>
                                <th>Delete</th>
                            </tr>
                        </thead>
                        <tbody>
                    {manageOrder.map(order =>
                            <tr>
                                <td><p><input type='checkbox' ref={rowCheckbox} checked={checked}/></p></td>
                                <td><p>{order._id}</p></td>
                                <td><p>{order.date}</p></td>
                                <td><p>{order.displayName}</p></td>
                                <td><p>{order.name}</p></td>
                                <td><p>{order.place}</p></td>
                                <td><p>{order.amount}</p></td>
                                <td><p onClick={(e) => changeStatus(e)}>pending...</p></td>
                            </tr>
                        )}
                        </tbody>
                    </table>
                }
                </div>
            </div>
        </Container>
    );
};

export default ManageAllOrder;

【讨论】:

  • 如果您不担心,我想分享一个链接给您,以便更有效地找出这个问题,即:“zealous-bhaskara-09c56b.netlify.app/manage-all-order”。请帮我将此链接粘贴到您的浏览器.在该页面中,我想单击标题复选框并希望选择所有复选框下方的所有复选框。
  • 我明白了,你能解释一下我给你的解决方案中缺少什么吗?
  • 当你给出这个时,我尝试了你的解决方案。但它不起作用。我不知道为什么它不起作用。
  • 您是否遇到了某种错误,您能分享一下codeandbox吗?
  • 我非常抱歉??您的代码是真实的并且 100% 有效。当你给我这个解决方案时,我犯了一个错误。那完全是我的错。我的问题已经解决了。谢谢!
【解决方案2】:

首先我看不到你在哪里设置复选框的状态值。因此,您可以做的是为提取的数据中的每个条目设置检查柴火,然后相应地更新该字段,一旦您单击选中所有复选框,然后迭代列表,将所有这些复选框标记为 true,您也应该将该值填充回您的复选框(绑定数据)。如果您还有其他问题,请告诉我。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 2015-05-12
  • 1970-01-01
  • 2020-08-11
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多