Реагировать на изменение размера только по ширине поля, а не по высоте

У меня есть компонент перетаскиваемый диалог React-mui, на котором я использую поле с изменяемым размером:

return (
  <StyledDialog
    open={open}
    classes={{root: classes.dialog, paper: classes.paper}}
    PaperComponent={PaperComponent}
    aria-labelledby="draggable-dialog"
  >
    <ResizableBox
      height={520}
      width={370}
      minConstraints={[300, 500]}
      maxConstraints={[Infinity, Infinity]}
      className={classes.resizable}
    >
      <DialogContent classes={{root: classes.dialogContent}} id="draggable-dialog">
        <IconButton className={classes.clearIcon} aria-label="Clear" onClick={onClose}>
          <ClearIcon/>
        </IconButton>
        <iframe
          src={hjelpemiddel.url}
          title={hjelpemiddel.navn}
          width="100%"
          height="100%">
        </iframe>
      </DialogContent>
    </ResizableBox>
  </StyledDialog>
);

Я хотел бы изменить размер iframe внутри диалогового окна вместе с ResizableBox. Но, кажется, я могу изменить только ширину ResizableBox, а не высоту окна, по крайней мере, максимальная высота, похоже, та, которая установлена ​​​​изначально. Как я могу это исправить, чтобы я мог также изменить размер высоты?

ОБНОВЛЕНИЕ

Codesanbox доступен здесь.

К вашему сведению, по какой-то причине иногда появляется сообщение об ошибке импорта, но все работает нормально, если вы обновите страницу codeandbox.


person Leff    schedule 30.08.2020    source источник
comment
Я бы предоставил более подробную информацию на основе medium.com/ better-programming/, я бы попробовал width:100%;border:none; в стиле iframe.   -  person mavarazy    schedule 02.09.2020
comment
Проблема связана с изменяемым размером поля, а не с iframe. Кажется, я не могу изменить размер окна по высоте.   -  person Leff    schedule 02.09.2020
comment
Не могли бы вы создать песочницу, чтобы вам было легче помогать? codesandbox.io/s/new Кроме того, стиль вашего диалога имеет значение   -  person Maxim Mazurok    schedule 02.09.2020
comment
Вы можете предоставить класс с изменяемым размером в вопросе, может быть что-то там, что блокирует переопределение высоты   -  person Mikael Puusaari    schedule 02.09.2020
comment
Я добавил коды и коробку к вопросу.   -  person Leff    schedule 08.09.2020


Ответы (3)


В вашем CodeSandBox, основываясь на моем тестировании, события перетаскивания и изменения размера запускаются одновременно. Вы можете использовать свойство cancel для react-draggable, чтобы перетаскивание не происходило, когда дескриптор изменения размера — это компонент, с которым осуществляется взаимодействие.

<Draggable
  cancel={".react-resizable-handle"}
    ...

Когда вы сделаете это, перетаскиваемый элемент больше не будет обновлять свое свойство CSS transform: translate при изменении размера — для этого вы можете выбрать управление положением перетаскиваемого компонента. Переместите / установите X и Y по мере необходимости, чтобы сохранить свое положение при изменении размера. Обратите внимание, что x и y состояние и установщики состояния должны находиться в общем родителе/предке среди этих компонентов, которые вы будете передавать в качестве реквизита.

export default function App() {
  // have the source of truth for the positions on a common parent/ancestor
  const [x, setX] = React.useState(0);
  const [y, setY] = React.useState(0);

  return (
    <div className="App">
      <PDFDialog x={x} y={y} setX={setX} setY={setY} />
    </div>
  );
}

...

class PDFDialog extends React.Component {
  state = {
    open: true
  };

  render() {
    const { open } = this.state;
    const { classes } = this.props;

    return (
      <StyledDialog
        open={open}
        classes={{ root: classes.dialog, paper: classes.paper }}
        PaperComponent={PaperComponent}
        aria-labelledby="draggable-dialog"
        PaperProps={{
          x: this.props.x,
          y: this.props.y,
          setX: this.props.setX,
          setY: this.props.setY
        }}
      >
        <ResizableBox
          height={520}
          width={370}
          minConstraints={[300, 500]}
          maxConstraints={[Infinity, Infinity]}
          className={classes.resizable}
          onResize={(e) => {
            if (e.movementX !== 0) {
              this.props.setX((prev) => prev + e.movementX);
            } else if (e.movementY !== 0) {
              this.props.setY((prev) => prev + e.movementY / 2);
            }
          }}
        ></ResizableBox>

        ...

// refactored draggable component:
<Draggable
  position={{ x: x, y: y }}
  cancel={".react-resizable-handle"} // <-- cancel the dragging if resize is interacted with
  onDrag={(e) => {
    if (e.movementX !== 0) {
      setX((prev) => prev + e.movementX);
    }
    if (e.movementY !== 0) {
      setY((prev) => prev + e.movementY);
    }
  }}
>
  <Paper {...props} />
</Draggable>

Edit React MUI + Draggable + Resizable Component

(В моем CodeSandBox я избавился от ограничений, таких как минимум height и width, чтобы наглядно показать пример)

person 95faf8e76605e973    schedule 09.09.2020

Вы можете привязать событие изменения размера окна, рассчитать новую высоту и ширину и передать его resizable-box вашему

object.addEventListener("resize", function() {
//Here you can write logic to apply resizing on the resizable-box
});
person Muhammad Asad    schedule 09.09.2020

Очевидно, что react-resizable использует встроенный CSS для обработки ширины и высоты блока, и для вашей проблемы я моделирую эту проблему, обратите внимание на приведенный ниже снимок экрана из Google Chrome devTools:

введите здесь описание изображения

У react-resizable-box есть важный флаг, и он перезаписывает встроенное значение высоты, поэтому в представлении у меня есть следующее поведение:

движение

Вашей информации недостаточно, поэтому я не могу прямо сказать причину или причины вашей проблемы, но очень вероятно, что перезапись CSS является основной причиной этой проблемы.

Итак, проверьте resizable-box в вашем проекте и попытайтесь найти перезапись CSS.

Обновление после добавления повторного создания проблемы

На самом деле, основываясь на моем последнем ответе, что-то перезаписывает ваш height сейчас в песочнице репродукции, я удаляю тег iframe, и все работает хорошо, вы передаете атрибут height="100%" своему тегу iframe, и это предотвращает изменение высоты. Кроме того, вы передаете minConstraints={[300, 500]} компоненту ResizableBox, поэтому его высота не может быть меньше 500px.

person AmerllicA    schedule 06.09.2020
comment
Я добавил коды и коробку с моим примером к вопросу. - person Leff; 08.09.2020