javascript - 当内容太大时,对话的第一定位不好

标签 javascript reactjs material-ui

我正在使用material-ui^0.20和react^16.2,当第一次显示一个嵌入了太多内容的ComponentDialog时,我遇到了问题。

这是显示问题的图片:

enter image description here

这就是应该显示的内容(在关闭Dialog并第二次显示它之后,或者在调整窗口大小之后等)

enter image description here

这里是一些重现问题的源代码( online demo hereand the source code ):

import React, { Component } from 'react';
import { render } from 'react-dom';

import Dialog from 'material-ui/Dialog';
import RaisedButton from 'material-ui/RaisedButton';

import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';
import getMuiTheme from 'material-ui/styles/getMuiTheme';

class BuggyComponent extends Component {
  render() {
    return <img src="https://upload.wikimedia.org/wikipedia/commons/b/be/Random_pyramids.jpg" />
  }
}

class MyComponent extends React.Component {
  state = {
    open: false,
  };

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

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

  render() {

    return (
      <div>
        <RaisedButton label="Buggy Dialog" onClick={this.handleOpen} />
        <Dialog
          title="Dialog"
          modal={false}
          open={this.state.open}
          onRequestClose={this.handleClose}
        >
          <BuggyComponent />
        </Dialog>
      </div>
    );
  }
}

export default class App extends Component {
  constructor() {
    super();
    this.state = {
      name: 'React'
    };
  }

  render() {
    return (
      <MuiThemeProvider muiTheme={getMuiTheme({})}>
        <MyComponent /> 
      </MuiThemeProvider>
    );
  }
}

有什么办法可以避免这个问题吗?据我观察,对话框内没有组件,但整个对话框作为一个组件似乎可以纠正这个问题,但这不是很方便,而且并不总是可行。

最佳答案

这里发生的事情是这样的: 弹出窗口打开,material ui 尝试将其居中并居中,它尝试计算出内容的高度。此时,图像不可用,因此内容(图像)没有高度。

图像加载。图像现在有高度,但对话框已经定位,因此这没有帮助。

您可以尝试预加载图像(这基本上是更新后发生的事情)。一种黑客式的方法是这样的:

<RaisedButton label="Buggy Dialog" onClick={this.handleOpen} />
<img src="https://upload.wikimedia.org/wikipedia/commons/b/be/Random_pyramids.jpg" style={{width: '0', height: '0', visibility: 'hidden'}} />

这会将图像加载到不可见的 img 标记中,因此当对话框打开时图像已经加载。问题是无法保证在用户单击按钮时加载图像。

另一种方法是检测图像何时加载,然后重新定位对话框。这可行,但缺点是一旦加载图像,对话框就会跳转,这可能是问题,也可能不是问题。

class BuggyComponent extends Component {
    reRender() {
        this.props.dialog.forceUpdate();
    }

    render() {
        return <img onLoad={() => this.reRender()} src="https://upload.wikimedia.org/wikipedia/commons/b/be/Random_pyramids.jpg" />
    }
}

<Dialog
    ref="dialog"
    repositionOnUpdate
    title="Dialog"
    modal={false}
    open={this.state.open}
    onRequestClose={this.handleClose}
>
    <BuggyComponent dialog={ this.refs.dialog} />
</Dialog>

仅当图像高度已知时才有效的第三个选项是显式设置 img 标签的高度。这也可以防止在加载图像时重新渲染,但您需要事先知道大小。

第四个选项是更改打开模式的函数,以便函数在尝试打开模式之前预加载图像(如果需要)。

第五个也是希望可行的选项是使自定义组件滚动固定大小。这解决了未知高度的问题,但需要您确定什么是好的固定高度,这可能有意义也可能没有意义,具体取决于内容。为了避免过多担心屏幕尺寸,高度以 vh 表示。

class BuggyComponent extends Component {
    render() {
        return <div style={ {height: '70vh', overflow: 'scroll'} }>
            <img src="https://upload.wikimedia.org/wikipedia/commons/b/be/Random_pyramids.jpg" />
        </div>
    }
}

关于javascript - 当内容太大时,对话的第一定位不好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48606831/

相关文章:

javascript - NaN 问题 - 为什么相同的代码会返回不同的结果?

javascript - 如何使用样式组件覆盖 ExpansionPanelSummary 深层元素?

javascript - React Material UI 取消选择

javascript - jquery empty() 阻止选择

c# - 如何访问网站客户端的内容?

reactjs - 连接路由器类型错误: Cannot read property 'dispatch' of undefined

javascript - 在reactjs中创建一个网格

javascript - jhipster react 形式 onChange state 类型 '{ [x: number]: any; }' 的参数不可分配

javascript - 找不到模块 : Can't resolve '@material-ui/core/Container'

php - 如何提交字段名重复的表单数据?