我想在材料套件中做一个小例子,在自己的项目中,但我不能让它工作。我做的问题是在我做的渲染中
const {classes,... rest} = this.props;
永不工作原因类未定义。调试我发现我没有得到我的Object Header,然后函数__objectWithStyles,从不起作用,因为在this.props中不是对象Header。
有人能帮助我吗?
我的LoginPage.jsx
import React from "react";
// material-ui components
import withStyles from "@material-ui/core/styles";
// core components
import Header from "components/Header/Header.jsx";
import HeaderLinks from "components/Header/HeaderLinks.jsx";
import loginPageStyle from "assets/jss/material-kit-react/views/loginPage.jsx";
class LoginPage extends React.Component {
constructor(props) {
super(props);
// we use this to make the card to appear after the page has been rendered
this.state = {
cardAnimaton: "cardHidden"
};
}
componentDidMount() {
// we add a hidden class to the card and after 700 ms we delete it and the transition appears
setTimeout(
function() {
this.setState({ cardAnimaton: "" });
}.bind(this),
700
);
}
render() {
const { classes, ...rest } = this.props;
return (
<div>
<Header
absolute
color="transparent"
brand="Material Kit React"
rightLinks={<HeaderLinks />}
{...rest}
/>
<div
className={classes.pageHeader}
style={{
backgroundImage: "url(" + image + ")",
backgroundSize: "cover",
backgroundPosition: "top center"
}}
>
);
}
导出withStyles(loginPageStyle)(LoginPage); }
HeaderPage.jsx
import React from "react";
// nodejs library that concatenates classes
import classNames from "classnames";
// nodejs library to set properties for components
import PropTypes from "prop-types";
// material-ui components
import withStyles from "material-ui/styles/withStyles";
import AppBar from "material-ui/AppBar";
import Toolbar from "material-ui/Toolbar";
import IconButton from "material-ui/IconButton";
import Button from "material-ui/Button";
import Hidden from "material-ui/Hidden";
import Drawer from "material-ui/Drawer";
// @material-ui/icons
import Menu from "@material-ui/icons/Menu";
// core components
import headerStyle from "assets/jss/material-kit-react/components/headerStyle.jsx";
class Header extends React.Component {
constructor(props) {
super(props);
this.state = {
mobileOpen: false
};
this.handleDrawerToggle = this.handleDrawerToggle.bind(this);
this.headerColorChange = this.headerColorChange.bind(this);
}
handleDrawerToggle() {
this.setState({ mobileOpen: !this.state.mobileOpen });
}
componentDidMount() {
if (this.props.changeColorOnScroll) {
window.addEventListener("scroll", this.headerColorChange);
}
}
headerColorChange() {
const { classes, color, changeColorOnScroll } = this.props;
const windowsScrollTop = window.pageYOffset;
if (windowsScrollTop > changeColorOnScroll.height) {
document.body
.getElementsByTagName("header")[0]
.classList.remove(classes[color]);
document.body
.getElementsByTagName("header")[0]
.classList.add(classes[changeColorOnScroll.color]);
} else {
document.body
.getElementsByTagName("header")[0]
.classList.add(classes[color]);
document.body
.getElementsByTagName("header")[0]
.classList.remove(classes[changeColorOnScroll.color]);
}
}
componentWillUnmount() {
if (this.props.changeColorOnScroll) {
window.removeEventListener("scroll", this.headerColorChange);
}
}
render() {
const {
classes,
color,
rightLinks,
leftLinks,
brand,
fixed,
absolute
} = this.props;
const appBarClasses = classNames({
[classes.appBar]: true,
[classes[color]]: color,
[classes.absolute]: absolute,
[classes.fixed]: fixed
});
const brandComponent = (
<Button href="#" className={classes.title}>
{brand}
</Button>
);
return (
<AppBar className={appBarClasses}>
<Toolbar className={classes.container}>
{leftLinks !== undefined ? brandComponent : null}
<div className={classes.flex}>
{leftLinks !== undefined ? (
<Hidden smDown implementation="css">
{leftLinks}
</Hidden>
) : (
brandComponent
)}
</div>
<Hidden smDown implementation="css">
{rightLinks}
</Hidden>
<Hidden mdUp>
<IconButton
color="inherit"
aria-label="open drawer"
onClick={this.handleDrawerToggle}
>
<Menu />
</IconButton>
</Hidden>
</Toolbar>
<Hidden mdUp implementation="css">
<Drawer
variant="temporary"
anchor={"right"}
open={this.state.mobileOpen}
classes={{
paper: classes.drawerPaper
}}
onClose={this.handleDrawerToggle}
>
<div className={classes.appResponsive}>
{leftLinks}
{rightLinks}
</div>
</Drawer>
</Hidden>
</AppBar>
);
}
}
Header.defaultProp = {
color: "white"
};
Header.propTypes = {
classes: PropTypes.object.isRequired,
color: PropTypes.oneOf([
"primary",
"info",
"success",
"warning",
"danger",
"transparent",
"white",
"rose",
"dark"
]),
rightLinks: PropTypes.node,
leftLinks: PropTypes.node,
brand: PropTypes.string,
fixed: PropTypes.bool,
absolute: PropTypes.bool,
// this will cause the sidebar to change the color from
// this.props.color (see above) to changeColorOnScroll.color
// when the window.pageYOffset is heigher or equal to
// changeColorOnScroll.height and then when it is smaller than
// changeColorOnScroll.height change it back to
// this.props.color (see above)
changeColorOnScroll: PropTypes.shape({
height: PropTypes.number.isRequired,
color: PropTypes.oneOf([
"primary",
"info",
"success",
"warning",
"danger",
"transparent",
"white",
"rose",
"dark"
]).isRequired
})
};
export default withStyles(headerStyle)(Header);
来自src存储库的链接:https://github.com/creativetimofficial/material-kit-react/
更新
似乎我的类LoginPagte找不到我导入的组件。例如。
从“components / Header / Header.jsx”导入标题;
我的课程找不到标题对象
答案 0 :(得分:0)
这意味着您没有将classes
传递给LoginPage
。我想你希望它包含withStyles
,它会将classes
注入组件:
export withStyles(loginPageStyle)(LoginPage)
然后在使用LoginPage
的地方使用它。
答案 1 :(得分:0)
也许我来不及了。但是,我有类似的问题。我做了一点改动,它开始正常工作。
之前:import {Register} from "./Register/Register";
之后:import Register from "./Register/Register";
只需从导入根组件中的Register组件中删除“ {}”,对我来说是有用的。当然,您需要:export default withStyles(styles)(Register);
答案 2 :(得分:-1)
以这种方式添加classes
作为组件的支柱:
class LoginPage extends React.Component<{ classes }, {}> {
...
}