【问题标题】:How can we open a Popper when page load the first time第一次加载页面时如何打开 Popper
【发布时间】:2020-04-03 01:37:36
【问题描述】:

https://material-ui.com/components/popper/React,material-ui, 我想在页面加载后立即显示 Popper,而不点击按钮。

import React from 'react'
import Popper from '@material-ui/core/Popper'
import Typography from '@material-ui/core/Typography'
import Button from '@material-ui/core/Button'
import Fade from '@material-ui/core/Fade'
import Paper from '@material-ui/core/Paper'

export default function PositionedPopper() {
  const elRef = React.useRef(null)

  return (
    <div>
      <Popper open={true} anchorEl={elRef.current} placement={'left'} transition>
        {({ TransitionProps }) => (
          <Fade {...TransitionProps} timeout={350}>
            <Paper>
              <Typography>The content of the Popper.</Typography>
            </Paper>
          </Fade>
        )}
      </Popper>
      <Button ref={elRef}>left</Button>
    </div>
  )
}

此代码在屏幕左上角显示弹出器,因为 onInit, anchorEl 为 Null

如何在组件第一次加载时设置anchorEl

【问题讨论】:

  • 第一次是什么意思?就像用户第一次访问任何页面、他们在本次会话中第一次访问该站点、他们第一次访问该站点一样?

标签: javascript reactjs material-ui ref popper.js


【解决方案1】:

使用 useEffect 初始化 open status 会起作用

const [open, setOpen] = useState(false);
useEffect(() => {
  setOpen(true);
}, []);

<Popper
  open={open}
  ...
/>

完整代码:

import React, { useEffect, useState, useRef } from "react";
import Popper from "@material-ui/core/Popper";
import Typography from "@material-ui/core/Typography";
import Button from "@material-ui/core/Button";
import Fade from "@material-ui/core/Fade";
import Paper from "@material-ui/core/Paper";

export default function PositionedPopper() {
  const elRef = useRef(null);
  const [open, setOpen] = useState(false);
  useEffect(() => {
    setOpen(true);
  }, []);
  return (
    <div>
      <Popper
        open={open}
        anchorEl={elRef.current}
        placement={"left"}
        transition
      >
        {({ TransitionProps }) => (
          <Fade {...TransitionProps} timeout={350}>
            <Paper>
              <Typography>The content of the Popper.</Typography>
            </Paper>
          </Fade>
        )}
      </Popper>
      <Button ref={elRef}>left</Button>
    </div>
  );
}

【讨论】:

    【解决方案2】:

    使用 state 代替 ref

    export default function App(){
       const [el, setEl] = useState(null);
       const [open, setOpen] = useState(true);
       return (
         <div>
            <button ref={setEl} onClick={()=> setOpen(true)}></button>
            <Popper open={el != null && open} anchorEl={el}>
               ....
            </Popper>
         </div>
       )
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多