【问题标题】:Call function on default when checkboxes are rendered渲染复选框时默认调用函数
【发布时间】:2022-01-19 11:32:58
【问题描述】:
this.state.pageData.map((elem) =>
  elem.map((ele) => {
    this.props.AllSelectedFlag ? (
      <Td>
        {' '}
        <Input type="checkbox" value={ele.id} checked={true} onClick={(e) => this.selectHandle(e, ele)} />
      </Td>
    ) : (
      <Td>
        <Input type="checkbox" value={ele.id} onClick={(e) => this.selectHandle(e, ele)} />
      </Td>
    );
  }),
);

基本上我必须在按下全选按钮时检查所有复选框,当按下按钮时我正在更改 AllSelectedFlag 的状态,但问题是当条件为真时 onClick 按钮不起作用。

还有什么办法可以解决吗?

【问题讨论】:

    标签: javascript reactjs foreach react-redux redux-saga


    【解决方案1】:

    方法 1:如果您有“检查”属性

    您不需要为复选框渲染和应用检查属性,您只需在“全部”选择​​和重置时为所有元素设置“已检查”属性。

    您可以在每个复选框上添加事件 onChange,用于单独的选中/取消选中部分。

    参考示例:https://codesandbox.io/s/vvxpny4xq3

    方法 2:如果您在 json 中没有“已检查”属性

    维护内部带有“ids”的本地数组并对其进行oncheck/uncheck add/remove,并将其用于处理与检查相关的情况

        const [isCheckAll, setIsCheckAll] = useState(false);
        const [isCheck, setIsCheck] = useState([]);
        const [list, setList] = useState([]);
    
        const handleSelectAll = e => {
            setIsCheckAll(!isCheckAll);
            setIsCheck(list.map(li => li.id));
            if (isCheckAll) {
              setIsCheck([]);
            }
        };
    
        const handleClick = e => {
            const { id, checked } = e.target;
            setIsCheck([...isCheck, id]);
            if (!checked) {
              setIsCheck(isCheck.filter(item => item !== id));
            }
        };
    

    参考例子:https://codesandbox.io/s/react-select-all-checkbox-jbub2

    【讨论】:

    • 如果我使用 prop 来改变状态,onChange 会起作用吗?
    • onChange 将在您尝试更改检查状态时触发,然后您可以使用处理函数更改父级的状态(该处理函数将通过道具可用)
    • 对不起,还有一个问题,在我的情况下,数据来自 API,并且数据中没有 ischecked 密钥,我应该如何处理任何想法?
    • 答案已更新,请参考方法2。对于基于钩子的实现,您也可以对基于类的类似实现
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    相关资源
    最近更新 更多