【问题标题】:Select all and Select None buttons in Autocomplete Material UI React自动完成材质 UI React 中的全选和全选按钮
【发布时间】:2020-05-18 10:40:15
【问题描述】:

我想在Autocomplete React Material UI中实现两个按钮全选和全选以及每个选项的复选框。单击全选按钮时,必须选中所有选项,单击全选时,必须取消选中所有选项. 我该如何实现?

<Autocomplete
      id={id }
      size={size}
      multiple={multiple}
      value={value}
      disabled={disabled}
      options={items}
      onChange={handleChange}
      getOptionLabel={option => option.label}
      renderOption={(option, { selected }) => (
        <React.Fragment >
          {isCheckBox(check, selected)}
          {option.label}
        </React.Fragment>
      )}
      renderInput={params => (
        <TextField id="dropdown_input"
          {...params} label="controlled" variant={variant} label={label} placeholder={placeholder} />
      )}
    />
export function isCheckBox(check, selected) { 
  if (check) {
    const CheckBox = <Checkbox
      id="dropdown_check"
      icon={icon}
      checkedIcon={checkedIcon}
      checked={selected}
    />
    return CheckBox;
  }
  return null;
}

【问题讨论】:

    标签: javascript reactjs material-ui


    【解决方案1】:

    我今天早些时候偶然发现了同样的问题。 诀窍是使用本地状态来管理已选择的内容,如果本地状态中有“全部”键,则将 renderOption 更改为选择 * 复选框。 我到了最后期限,所以我会为您留下一个代码沙盒解决方案,而不是匆忙解释。希望能帮助到你 : Select All AutoComplete Sandbox

    【讨论】:

      【解决方案2】:

      更新

      适用于 React 版本 16.13.1 及更高版本。 codesandbox

      const [open, setOpen] = useState(false);
      const timer = useRef(-1);
      
      const setOpenByTimer = (isOpen) => {
          clearTimeout(timer.current);
          timer.current = window.setTimeout(() => {
            setOpen(isOpen);
          }, 200);
      }
      
      const MyPopper = function (props) {
          const addAllClick = (e) => {
            clearTimeout(timer.current);
            console.log('Add All');
          }
          const clearClick = (e) => {
            clearTimeout(timer.current);
            console.log('Clear');
          }
          return (
            <Popper {...props}>
              <ButtonGroup color="primary" aria-label="outlined primary button group">
                <Button color="primary" onClick={addAllClick}>
                  Add All
                </Button>
                <Button color="primary" onClick={clearClick}>
                  Clear
                </Button>
              </ButtonGroup>
              {props.children}
            </Popper>
          );
      };
      return (
          <Autocomplete
            PopperComponent={MyPopper}     
            onOpen={(e) => {
              console.log('onOpen');   
              setOpenByTimer(true);    
            }}
            onClose={(obj,reason) => {
              console.log('onClose', reason);
              setOpenByTimer(false);       
            }}
            open={open}  
            .....
            ....
          />
      );
      

      旧答案

      只需自定义 PopperComponent 并为所欲为。

      Autocomplete API

      const addAllClick = (e: any) => {
          setValue(items);
      };
      const clearClick = (e: any) => {
          setValue([]);
      };
      const MyPopper = function (props: any) {
          return (
            <Popper {...props}>
              <ButtonGroup color="primary" aria-label="outlined primary button group">
                <Button color="primary" onClick={addAllClick}>
                  Add All
                </Button>
                <Button color="primary" onClick={clearClick}>
                  Clear
                </Button>
              </ButtonGroup>      
              {props.children}
            </Popper>
          );
      };
      <Autocomplete
          PopperComponent={MyPopper}
          ...  
      />
      

      【讨论】:

      • onClick 事件处理程序不会触发函数 addAllClick 和 clearClick。如何处理?
      • @Shoeb 可能存在不同的问题。你试过这样吗? onClick={e => console.log('worked')}
      • 我试过了。你能看看我的codesandbox吗?
      • @Shoeb 我已经更新了我的答案。可能有它的配置但我已经通过管理打开状态解决了它。至少它运作良好:)
      猜你喜欢
      • 1970-01-01
      • 2020-04-09
      • 2020-03-19
      • 1970-01-01
      • 2022-12-30
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多