reactjs - withStyles 组件包装
问题描述
我有以下组件:
import React from 'react';
import PropTypes from 'prop-types';
import { withStyles } from '@material-ui/core/styles';
import SnackbarContent from '@material-ui/core/SnackbarContent';
import Snackbar from '@material-ui/core/Snackbar';
const styles = theme => ({
error: {
backgroundColor: theme.palette.error.dark,
}
})
class Snack extends React.Component {
state = {
opendialog: false,
}
constructor(props) {
super(props);
}
test() {
this.setState({opendialog: !this.state.opendialog});
}
render() {
return (
<Snackbar open={this.state.opendialog}>
<SnackbarContent message="test"/>
</Snackbar>
);
}
}
export default withStyles(styles)(Snack);
和应用程序主要:
import React, { Component } from 'react';
import Button from '@material-ui/core/Button';
import logo from './logo.svg';
import './App.css';
import Snack from './Snack.js';
class App extends Component {
constructor(props) {
super(props);
this.snack = React.createRef();
}
render() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<h1 className="App-title">Welcome to React</h1>
</header>
<p className="App-intro">
To get started, edit <code>src/App.js</code> and save to reload.
</p>
<Button variant="contained" color="primary" onClick={this.handleHello}>Hello World</Button>
<div>
<Snack ref={ ref => this.snack = ref } />
</div>
</div>
);
}
handleHello = () => {
this.snack.test();
}
}
export default App;
单击按钮时,我收到“TypeError:_this.snack.test 不是函数”,但是如果我删除 withStyles,则代码可以正常工作。
我只是替换“export default withStyles(styles)(Snack);” 符合“导出默认(小吃);”。
为什么它不能与“withStyles”一起正常工作?我怎样才能让它工作?
解决方案
因为withStyles
包装了您的组件,所以您需要改用:
<Snack innerRef={ref => (this.snack = ref)} />
withStyles将innerRef
属性作为ref
.
我尝试使用最新版本@material-ui/core
(当前为 3.8.1)。我不能保证旧版本以同样的方式支持这一点。
这是一个完整的工作示例:
推荐阅读
- javascript - 传入反应组件的语言对象道具
- java - Spring rest服务使用@RestController将多个实体类作为xml响应返回
- tensorflow - 我在 http://projector.tensorflow.org/ 中发现了一件奇怪的事情。我想确定是我的问题还是网站的问题
- grafana - Grafana tar 文件下载
- python - 如何为以下数据框绘制饼图
- postgresql - 在 PostgreSQL 中不使用 pg_restore 恢复分区表数据
- reactjs - 如何通过反应实现 Windows kerberose 身份验证?
- javascript - Material-UI 中的自定义 TransitionComponent
- php - Mailchimp SMTP 配置错误为“无法使用 2 个可能的身份验证器在用户名“{username}”的 SMTP 服务器上进行身份验证”
- mesh - CGAL Mesh_3:如何使用 Polyhedral_complex_mesh_domain_3 粘附到域内的表面?