如何在我的应用程序中为 React 添加带有来自 Material UI 的“返回顶部”按钮的 AppBar?
How do I add AppBar with Back to Top button from Material UI for React in my App?
在MaterialUI的文档中,我找到了这段代码:
import React from 'react';
import PropTypes from 'prop-types';
import AppBar from '@material-ui/core/AppBar';
import Toolbar from '@material-ui/core/Toolbar';
import Typography from '@material-ui/core/Typography';
import { makeStyles } from '@material-ui/styles';
import CssBaseline from '@material-ui/core/CssBaseline';
import useScrollTrigger from '@material-ui/core/useScrollTrigger';
import Box from '@material-ui/core/Box';
import Container from '@material-ui/core/Container';
import Fab from '@material-ui/core/Fab';
import KeyboardArrowUpIcon from '@material-ui/icons/KeyboardArrowUp';
import Zoom from '@material-ui/core/Zoom';
const useStyles = makeStyles((theme) => ({
root: {
position: 'fixed',
bottom: theme.spacing(2),
right: theme.spacing(2),
},
}));
function ScrollTop(children) {
const classes = useStyles();
const trigger = useScrollTrigger({
target: window ? window() : undefined,
disableHysteresis: true,
threshold: 100
});
const handleClick = (event) => {
const anchor = (event.target.ownerDocument || document).querySelector('#back-to-top-anchor');
if (anchor) {
anchor.scrollIntoView({ behavior: 'smooth', block: 'center' });
}
};
return (<Zoom in={trigger}>
<div onClick={handleClick} role="presetation" className={classes.root}>
{children}
</div>
</Zoom>);
}
export default function BackToTop(children) {
return (
<React.Fragment>
<CssBaseline />
<AppBar>
<Toolbar>
<Typography variant="h6">Scroll to see button</Typography>
</Toolbar>
</AppBar>
<Toolbar id="back-to-top-anchor" />
<Container>
<Box my={2}>
{[...new Array(100)]
.map(
() => `Cras mattis consectetur purus sit amet fermentum.
Cras justo odio, dapibus ac facilisis in, egestas eget quam.
Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
Praesent commodo cursus magna, vel scelerisque nisl consectetur et.`,
)
.join('\n')}
</Box>
</Container>
<ScrollTop {...children}>
<Fab color="secondary" size="small" aria-label="scroll back to top">
<KeyboardArrowUpIcon />
</Fab>
</ScrollTop>
</React.Fragment>
);
}
据说这段代码是顶栏,会绘制Back to top
按钮。但我不明白我应该将什么作为 children
传递给 BackToTop
函数。谁能帮帮我?
P.S 代码还包括内容,存储在Box
元素中,仅供测试。如果我正确理解 children
参数的用途,我应该能够使 BackToTop
函数独立于任何参数。
您所指的文档部分在此处:https://material-ui.com/components/app-bar/#back-to-top. The code sandbox version of that demo is here: https://codesandbox.io/s/r59zg?file=/demo.js。
与文档中的演示相比,您问题中的代码有一些有问题的更改。令人困惑的是,您在几个地方(BackToTop
参数和 ScrollTop
参数)将 props
重命名为 children
。文档中的代码中需要注意的一件事是传递给 BackToTop
的道具从未被使用——它们通过 <ScrollTop {...props}>
传递给 ScrollTop
,但 ScrollTop
没有也不要使用这些道具中的任何一个(因为 index.js
不会将任何道具传递给 BackToTop
,它是一个空对象,所以 可以完成它)。
这里是一个略微简化的演示版本,删除了不使用的道具:
import React from "react";
import PropTypes from "prop-types";
import AppBar from "@material-ui/core/AppBar";
import Toolbar from "@material-ui/core/Toolbar";
import Typography from "@material-ui/core/Typography";
import { makeStyles } from "@material-ui/core/styles";
import CssBaseline from "@material-ui/core/CssBaseline";
import useScrollTrigger from "@material-ui/core/useScrollTrigger";
import Box from "@material-ui/core/Box";
import Container from "@material-ui/core/Container";
import Fab from "@material-ui/core/Fab";
import KeyboardArrowUpIcon from "@material-ui/icons/KeyboardArrowUp";
import Zoom from "@material-ui/core/Zoom";
const useStyles = makeStyles(theme => ({
root: {
position: "fixed",
bottom: theme.spacing(2),
right: theme.spacing(2)
}
}));
function ScrollTop(props) {
const { children } = props;
const classes = useStyles();
const trigger = useScrollTrigger({
disableHysteresis: true,
threshold: 100
});
const handleClick = event => {
const anchor = (event.target.ownerDocument || document).querySelector(
"#back-to-top-anchor"
);
if (anchor) {
anchor.scrollIntoView({ behavior: "smooth", block: "center" });
}
};
return (
<Zoom in={trigger}>
<div onClick={handleClick} role="presentation" className={classes.root}>
{children}
</div>
</Zoom>
);
}
ScrollTop.propTypes = {
children: PropTypes.element.isRequired
};
export default function BackToTop() {
return (
<React.Fragment>
<CssBaseline />
<AppBar>
<Toolbar>
<Typography variant="h6">Scroll to see button</Typography>
</Toolbar>
</AppBar>
<Toolbar id="back-to-top-anchor" />
<Container>
<Box my={2}>
{[...new Array(25)]
.map(
() => `Cras mattis consectetur purus sit amet fermentum.
Cras justo odio, dapibus ac facilisis in, egestas eget quam.
Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
Praesent commodo cursus magna, vel scelerisque nisl consectetur et.`
)
.join("\n")}
</Box>
</Container>
<ScrollTop>
<Fab color="secondary" size="small" aria-label="scroll back to top">
<KeyboardArrowUpIcon />
</Fab>
</ScrollTop>
</React.Fragment>
);
}
ScrollTop
中使用的 children
是 ScrollTop
元素中 JSX 中的子元素。在这种情况下是:
<Fab color="secondary" size="small" aria-label="scroll back to top">
<KeyboardArrowUpIcon />
</Fab>
这是将浮动操作按钮传递给 ScrollTop
作为用户滚动时显示的内容,以及在单击时将导致页面滚动回顶部的内容。
你问题中的代码有 ScrollTop(children)
而不是 ScrollTop({children})
- 即你正在调用整个 props
对象 children
而不是获取 children
撑出来了。
在MaterialUI的文档中,我找到了这段代码:
import React from 'react';
import PropTypes from 'prop-types';
import AppBar from '@material-ui/core/AppBar';
import Toolbar from '@material-ui/core/Toolbar';
import Typography from '@material-ui/core/Typography';
import { makeStyles } from '@material-ui/styles';
import CssBaseline from '@material-ui/core/CssBaseline';
import useScrollTrigger from '@material-ui/core/useScrollTrigger';
import Box from '@material-ui/core/Box';
import Container from '@material-ui/core/Container';
import Fab from '@material-ui/core/Fab';
import KeyboardArrowUpIcon from '@material-ui/icons/KeyboardArrowUp';
import Zoom from '@material-ui/core/Zoom';
const useStyles = makeStyles((theme) => ({
root: {
position: 'fixed',
bottom: theme.spacing(2),
right: theme.spacing(2),
},
}));
function ScrollTop(children) {
const classes = useStyles();
const trigger = useScrollTrigger({
target: window ? window() : undefined,
disableHysteresis: true,
threshold: 100
});
const handleClick = (event) => {
const anchor = (event.target.ownerDocument || document).querySelector('#back-to-top-anchor');
if (anchor) {
anchor.scrollIntoView({ behavior: 'smooth', block: 'center' });
}
};
return (<Zoom in={trigger}>
<div onClick={handleClick} role="presetation" className={classes.root}>
{children}
</div>
</Zoom>);
}
export default function BackToTop(children) {
return (
<React.Fragment>
<CssBaseline />
<AppBar>
<Toolbar>
<Typography variant="h6">Scroll to see button</Typography>
</Toolbar>
</AppBar>
<Toolbar id="back-to-top-anchor" />
<Container>
<Box my={2}>
{[...new Array(100)]
.map(
() => `Cras mattis consectetur purus sit amet fermentum.
Cras justo odio, dapibus ac facilisis in, egestas eget quam.
Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
Praesent commodo cursus magna, vel scelerisque nisl consectetur et.`,
)
.join('\n')}
</Box>
</Container>
<ScrollTop {...children}>
<Fab color="secondary" size="small" aria-label="scroll back to top">
<KeyboardArrowUpIcon />
</Fab>
</ScrollTop>
</React.Fragment>
);
}
据说这段代码是顶栏,会绘制Back to top
按钮。但我不明白我应该将什么作为 children
传递给 BackToTop
函数。谁能帮帮我?
P.S 代码还包括内容,存储在Box
元素中,仅供测试。如果我正确理解 children
参数的用途,我应该能够使 BackToTop
函数独立于任何参数。
您所指的文档部分在此处:https://material-ui.com/components/app-bar/#back-to-top. The code sandbox version of that demo is here: https://codesandbox.io/s/r59zg?file=/demo.js。
与文档中的演示相比,您问题中的代码有一些有问题的更改。令人困惑的是,您在几个地方(BackToTop
参数和 ScrollTop
参数)将 props
重命名为 children
。文档中的代码中需要注意的一件事是传递给 BackToTop
的道具从未被使用——它们通过 <ScrollTop {...props}>
传递给 ScrollTop
,但 ScrollTop
没有也不要使用这些道具中的任何一个(因为 index.js
不会将任何道具传递给 BackToTop
,它是一个空对象,所以 可以完成它)。
这里是一个略微简化的演示版本,删除了不使用的道具:
import React from "react";
import PropTypes from "prop-types";
import AppBar from "@material-ui/core/AppBar";
import Toolbar from "@material-ui/core/Toolbar";
import Typography from "@material-ui/core/Typography";
import { makeStyles } from "@material-ui/core/styles";
import CssBaseline from "@material-ui/core/CssBaseline";
import useScrollTrigger from "@material-ui/core/useScrollTrigger";
import Box from "@material-ui/core/Box";
import Container from "@material-ui/core/Container";
import Fab from "@material-ui/core/Fab";
import KeyboardArrowUpIcon from "@material-ui/icons/KeyboardArrowUp";
import Zoom from "@material-ui/core/Zoom";
const useStyles = makeStyles(theme => ({
root: {
position: "fixed",
bottom: theme.spacing(2),
right: theme.spacing(2)
}
}));
function ScrollTop(props) {
const { children } = props;
const classes = useStyles();
const trigger = useScrollTrigger({
disableHysteresis: true,
threshold: 100
});
const handleClick = event => {
const anchor = (event.target.ownerDocument || document).querySelector(
"#back-to-top-anchor"
);
if (anchor) {
anchor.scrollIntoView({ behavior: "smooth", block: "center" });
}
};
return (
<Zoom in={trigger}>
<div onClick={handleClick} role="presentation" className={classes.root}>
{children}
</div>
</Zoom>
);
}
ScrollTop.propTypes = {
children: PropTypes.element.isRequired
};
export default function BackToTop() {
return (
<React.Fragment>
<CssBaseline />
<AppBar>
<Toolbar>
<Typography variant="h6">Scroll to see button</Typography>
</Toolbar>
</AppBar>
<Toolbar id="back-to-top-anchor" />
<Container>
<Box my={2}>
{[...new Array(25)]
.map(
() => `Cras mattis consectetur purus sit amet fermentum.
Cras justo odio, dapibus ac facilisis in, egestas eget quam.
Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
Praesent commodo cursus magna, vel scelerisque nisl consectetur et.`
)
.join("\n")}
</Box>
</Container>
<ScrollTop>
<Fab color="secondary" size="small" aria-label="scroll back to top">
<KeyboardArrowUpIcon />
</Fab>
</ScrollTop>
</React.Fragment>
);
}
ScrollTop
中使用的 children
是 ScrollTop
元素中 JSX 中的子元素。在这种情况下是:
<Fab color="secondary" size="small" aria-label="scroll back to top">
<KeyboardArrowUpIcon />
</Fab>
这是将浮动操作按钮传递给 ScrollTop
作为用户滚动时显示的内容,以及在单击时将导致页面滚动回顶部的内容。
你问题中的代码有 ScrollTop(children)
而不是 ScrollTop({children})
- 即你正在调用整个 props
对象 children
而不是获取 children
撑出来了。