Den*_*nko 2 javascript appbar jsx reactjs material-ui
在 Material UI 的文档中,我找到了这段代码:
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>
);
}
Run Code Online (Sandbox Code Playgroud)
据说这段代码是顶栏,会画 Back to top按钮。但我不明白我应该通过什么children来实现BackToTop功能。谁能帮我?
PS 代码还包括内容,即存储在Box元素内部,仅用于测试。如果我children正确理解参数的目的,我应该有能力使BackToTop函数独立于任何参数。
您所指的文档部分在这里:https : //material-ui.com/components/app-bar/#back-to-top。该演示的代码沙盒版本在这里:https : //codesandbox.io/s/r59zg?file=/demo.js。
与文档中的演示相比,您问题中的代码有一些有问题的更改。令人困惑的是,您在几个地方(参数和参数)重命名props为。在文档中的代码中需要注意的一件事是从未使用传递给的道具——它们被传递给via ,但也不使用任何这些道具(并且由于没有将任何道具传递给,它是一个空对象,所以没有什么可以用它做的)。childrenBackToTopScrollTopBackToTopScrollTop<ScrollTop {...props}>ScrollTopindex.jsBackToTop
这是演示的稍微简化版本,用于删除未使用的道具:
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>
);
}
Run Code Online (Sandbox Code Playgroud)
在children所用的存在ScrollTop是内的JSX子元素ScrollTop的元素。在这种情况下,即:
<Fab color="secondary" size="small" aria-label="scroll back to top">
<KeyboardArrowUpIcon />
</Fab>
Run Code Online (Sandbox Code Playgroud)
这将传递一个浮动操作按钮ScrollTop作为用户滚动时显示的内容,以及点击时将导致页面滚动回顶部的内容。
您问题中的代码ScrollTop(children)虽然不是ScrollTop({children})- 即您正在调用整个props对象children而不是从中获取children道具。