Как заставить не расширять панель расширения MaterialUI - PullRequest
1 голос
/ 07 мая 2020

Я ищу способ принудительно установить панель расширения на expanded=false, когда панель расширения отключена. Представьте себе расширенную панель расширения. Произойдет событие, и панель расширения будет отключена. Моя проблема в том, что он все еще расширяется. Я хочу принудительно установить expanded=false, но не знаю, как это сделать.

Вот мой код:

return (


<ExpansionPanel disabled={props.body==null} >
  <ExpansionPanelSummary
  expandIcon={<ExpandMoreIcon />}
  id="panel1a-header"
  classes={{
    content: classes.spaced,
  }}
  >
    <Box fontWeight="fontWeightBold">{props.name}</Box>
    <Box fontWeight="fontWeightBold" className={props.hasError ? classes.error : classes.ok}>
      {props.hasError ? 'DOWN' : 'UP'}
    </Box>
  </ExpansionPanelSummary>
  <ExpansionPanelDetails 
  classes={{
    root: classes.rowSpaced
    }}>
      {
      props.body != null && props.body.checks != null ?

      <Box>
        <List
      component="nav"
      aria-labelledby="nested-list-subheader"
      subheader={
        <ListSubheader component="div" id="nested-list-subheader">Liveness</ListSubheader>
      }
      className={classes.root}
      >
        <ListItem>
          <ListItemText>
            <Box display="flex" flexDirection="row" className={classes.spaced}>
              <Typography key={props.body.checks[0].name}>{props.body.checks[0].name}</Typography>
              <Typography key={props.body.checks[0].name + props.body.checks[0].status} className={props.body.checks[0].status === 'UP' ? classes.ok : classes.error}>
                {props.body.checks[0].status}
              </Typography>
            </Box>
          </ListItemText>
        </ListItem>
      </List>

      <Divider />
      <List
      component="nav"
      aria-labelledby="nested-list-subheader"
      subheader={
        <ListSubheader component="div" id="nested-list-subheader">
          Readyness
        </ListSubheader>
      }
      className={classes.root}
      >
        {
        props.body != null && props.body.checks != null ? props.body.checks.slice(1).sort((a, b) => (a.name > b.name) ? 1 : -1).map((check, i) => (

        <ListItem key={check.name + check.status}>
          <ListItemText>
            <Box display="flex" flexDirection="row" className={classes.spaced}>
              <Typography key={check.name}>{check.name}</Typography>
              <Typography key={check.name + check.status}  className={check.status === 'UP' ? classes.ok : classes.error}>
               {check.status}
              </Typography>
            </Box>
          </ListItemText>
        </ListItem>
        )) : null
        }
      </List>

      </Box>

      : null
      }


    </ExpansionPanelDetails>
  </ExpansionPanel>
  );

Если props.body==null, то панель расширения должна быть disabled=true И expanded=false, потому что я не хочу, чтобы он был расширен, когда он отключен ... Если this.props.body!=null, тогда я хочу, чтобы пользователь щелкнул по нему, чтобы развернуть его по своему усмотрению.

Обратите внимание на props.body != null && props.body.checks != null ? условие, потому что выполняется вызов asyn c. См. отреагируйте на this.props неопределенный или пустой объект

Как это сделать?

Спасибо!

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Поскольку вы хотите иметь возможность отключать / включать панель, а также параметры развертывания / свертывания, вам нужно будет перейти на управляемую панель. Это означает, что вам нужна переменная, которая сохраняет статус развертывания / свертывания (и, вероятно, также статус панели (включена / отключена).

Как только пользователь у вас есть панель, которая отключена - убедитесь, что это изменение также установит значение расширения в false:

const MyControlledPanel = props => {
  const { children, disabled } = props;
  const [isExpanded, setIsExpanded] = React.useState(false);

  const handleChange = () => {
    setIsExpanded(!isExpanded);
  };

  React.useEffect(() => {
    if (disabled) {
      setIsExpanded(false);
    }
  }, [disabled]);

  return (
    <ExpansionPanel
      disabled={disabled}
      expanded={isExpanded}
      onChange={handleChange}
    >
      {children}
    </ExpansionPanel>
  );
};

Установив для isExpanded значение false, как только вы получите значение disabled=true в опоре, вы сделаете убедитесь, что даже если вы получите disabled=false - панель все равно свернута (и теперь пользователь сможет ее снова развернуть).

Здесь вы можете найти рабочую версию этого: https://codesandbox.io/s/controlled-panel-collapse-on-disable-1ejtt?file= / демо. js

0 голосов
/ 08 мая 2020
const [isExpanded, setIsExpanded] = React.useState(false);
const isDisabled = (props.body === null);

React.useEffect(() => {
  if(isExpanded && isDisabled) {
    setIsExpanded(false);
  }
}, [isExpanded, isDisabled]);
<ExpansionPanel disabled={isDisabled} expanded={isExpanded && !isDisabled} onChange={() => setIsExpanded(!isExpanded)}>
....
</ExpansionPanel>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...