Невозможно скопировать в буфер обмена из Popper, который находится внутри Dialogue в Material-UI - PullRequest
0 голосов
/ 25 февраля 2019

Действия по воспроизведению ошибки здесь: (Попробуйте открыть в Firefox, у меня был почти разбит хром: P) https://codesandbox.io/s/73z5293391

  1. Нажмите на кнопку OPEN SIMPLE DIALOGUE.Теперь вы видите диалог. Нажмите на кнопку TOGGLE POPPER.
  2. Теперь вы видите Popper, у которого есть поле ввода и кнопка COPY.
  3. В этом случае вам необходимо скопировать текст внутри поля ввода hello.

Так что я не могу скопировать в буфер обмена.Сначала я подумал, что это может быть проблема с Dialogue.Но нет.Всего за Dialogue это работает.Но не на Popper, который всплывает из Dialogue (только для Popper также это работает).Можете ли вы помочь мне скопировать в буфер обмена в этой ситуации?

Еще раз исходный код:

    import React from "react";
    import PropTypes from "prop-types";
    import { withStyles } from "@material-ui/core/styles";
    import Button from "@material-ui/core/Button";
    import Avatar from "@material-ui/core/Avatar";
    import List from "@material-ui/core/List";
    import ListItem from "@material-ui/core/ListItem";
    import ListItemAvatar from "@material-ui/core/ListItemAvatar";
    import ListItemText from "@material-ui/core/ListItemText";
    import DialogTitle from "@material-ui/core/DialogTitle";
    import Dialog from "@material-ui/core/Dialog";
    import PersonIcon from "@material-ui/icons/Person";
    import AddIcon from "@material-ui/icons/Add";
    import Typography from "@material-ui/core/Typography";
    import blue from "@material-ui/core/colors/blue";
    import DialogContent from "@material-ui/core/DialogContent";
    import Popper from "@material-ui/core/Popper";

    const emails = ["username@gmail.com", "user02@gmail.com"];

    const styles = {
      avatar: {
        backgroundColor: blue[100],
        color: blue[600]
      }
    };

    class SimpleDialog extends React.Component {
      state = {
        anchorEl: null,
        openPopper: false
      };

      handleClose = () => {
        this.props.onClose(this.props.selectedValue);
      };

      handleListItemClick = value => {
        this.props.onClose(value);
      };

      copytoClipBoard = () => {
        this.hello.select();
        try {
          return document.execCommand("copy");
        } catch (err) {
          console.log("Oops, unable to copy");
        }
      };

      handleClick = event => {
        const { currentTarget } = event;
        this.setState(state => ({
          anchorEl: currentTarget,
          openPopper: !state.openPopper
        }));
      };

      render() {
        const { classes, onClose, selectedValue, ...other } = this.props;
        const { anchorEl, openPopper } = this.state;
        const id = openPopper ? "simple-popper" : null;

        return (
          <Dialog
            onClose={this.handleClose}
            aria-labelledby="simple-dialog-title"
            {...other}
          >
            <DialogTitle id="simple-dialog-title">Set backup account</DialogTitle>
            <DialogContent>
              <Button
                aria-describedby={id}
                variant="contained"
                onClick={this.handleClick}
              >
                Toggle Popper
              </Button>

              <Popper
                id={id}
                open={openPopper}
                anchorEl={anchorEl}
                style={{ zIndex: 10000 }}
              >
                <input
                  value="hello"
                  readOnly
                  type="text"
                  ref={node => (this.hello = node)}
                />
                <Button onClick={this.copytoClipBoard}> Copy </Button>
              </Popper>
              <List>
                {emails.map(email => (
                  <ListItem
                    button
                    onClick={() => this.handleListItemClick(email)}
                    key={email}
                  >
                    <ListItemAvatar>
                      <Avatar className={classes.avatar}>
                        <PersonIcon />
                      </Avatar>
                    </ListItemAvatar>
                    <ListItemText primary={email} />
                  </ListItem>
                ))}
                <ListItem
                  button
                  onClick={() => this.handleListItemClick("addAccount")}
                >
                  <ListItemAvatar>
                    <Avatar>
                      <AddIcon />
                    </Avatar>
                  </ListItemAvatar>
                  <ListItemText primary="add account" />
                </ListItem>
              </List>
            </DialogContent>
          </Dialog>
        );
      }
    }

    SimpleDialog.propTypes = {
      classes: PropTypes.object.isRequired,
      onClose: PropTypes.func,
      selectedValue: PropTypes.string
    };

    const SimpleDialogWrapped = withStyles(styles)(SimpleDialog);

    class SimpleDialogDemo extends React.Component {
      state = {
        open: false,
        selectedValue: emails[1]
      };

      handleClickOpen = () => {
        this.setState({
          open: true
        });
      };

      handleClose = value => {
        this.setState({ selectedValue: value, open: false });
      };

      render() {
        return (
          <div>
            <Typography variant="subtitle1">
              Selected: {this.state.selectedValue}
            </Typography>
            <br />
            <Button
              variant="outlined"
              color="primary"
              onClick={this.handleClickOpen}
            >
              Open simple dialog
            </Button>
            <SimpleDialogWrapped
              selectedValue={this.state.selectedValue}
              open={this.state.open}
              onClose={this.handleClose}
            />
          </div>
        );
      }
    }

    export default SimpleDialogDemo;

1 Ответ

0 голосов
/ 27 февраля 2019

@ akhila-hegde Вы можете добавить disablePortal в Поппер, чтобы решить эту проблему.Обратите внимание, что проблема не в копировании в буфер обмена.Проблема в том, что вы не можете выделить текст в поле (потому что он находится на портале).

Вот ссылка «Песочница» с параметром disablePortal, установленным в true - https://codesandbox.io/s/lxjwj3p8m9

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...