質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Material-UI

Material-UIは、Material Designを利用可能なオープンソースのReact向けUIコンポーネントキットです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

880閲覧

material-uiでwithStylesをしようとするとclassesがundefinedになる

wisheebell

総合スコア7

Material-UI

Material-UIは、Material Designを利用可能なオープンソースのReact向けUIコンポーネントキットです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

1グッド

0クリップ

投稿2019/08/18 15:57

現在、rails webpackerにてmaterial-uiを使ってSPAの開発をしています。

material-ui公式のドキュメント(Full-height navigation)

Qiitaの記事(React: Material-UIのwithStyles()でCSSをJavaScriptコードに定める)
をもとに、以下のようにコードを書きました。

javascript

1import React, { Component } from 'react' 2import PropTypes from 'prop-types' 3import { render } from 'react-dom' 4import { BrowserRouter as Router, Route, withRouter } from 'react-router-dom' 5import { makeStyles } from '@material-ui/core/styles' 6import Drawer from '@material-ui/core/Drawer' 7import AppBar from '@material-ui/core/AppBar' 8import CssBaseline from '@material-ui/core/CssBaseline' 9import Toolbar from '@material-ui/core/Toolbar' 10import List from '@material-ui/core/List' 11import Typography from '@material-ui/core/Typography' 12import Divider from '@material-ui/core/Divider' 13import ListItem from '@material-ui/core/ListItem' 14import ListItemIcon from '@material-ui/core/ListItemIcon' 15import ListItemText from '@material-ui/core/ListItemText' 16import InboxIcon from '@material-ui/icons/MoveToInbox' 17import MailIcon from '@material-ui/icons/Mail' 18import { withStyles, MuiThemeProvider } from '@material-ui/core/styles' 19import About from './About' 20import Home from './Home' 21 22const drawerWidth = 240 23 24const styles = (theme) => ({ 25 root: { 26 display: 'flex', 27 }, 28 appBar: { 29 zIndex: theme.zIndex.drawer + 1, 30 }, 31 drawer: { 32 width: drawerWidth, 33 flexShrink: 0, 34 }, 35 drawerPaper: { 36 width: drawerWidth, 37 }, 38 content: { 39 flexGrow: 1, 40 padding: theme.spacing(3), 41 }, 42 toolbar: theme.mixins.toolbar, 43}); 44 45class App extends Component { 46 cpHome = () => { 47 this.props.history.push('/') 48 } 49 50 cpAbout = () => { 51 this.props.history.push('/About') 52 } 53 54 render() { 55 return ( 56 <div className={this.props.classes.root}> 57 <CssBaseline /> 58 <AppBar position="fixed" className={this.props.classes.appBar}> 59 <Toolbar> 60 <Typography variant="h6" noWrap> 61 Clipped drawer 62 </Typography> 63 </Toolbar> 64 </AppBar> 65 <Drawer 66 className={this.props.classes.drawer} 67 variant="permanent" 68 classes={{ 69 paper: this.prpos.classes.drawerPaper, 70 }} 71 > 72 <div className={this.props.classes.toolbar} /> 73 <List> 74 <ListItem button onClick={this.cpHome}> 75 <ListItemText primary={'Home'} /> 76 </ListItem> 77 <ListItem button onClick={this.cpAbout}> 78 <ListItemText primary={'About'} /> 79 </ListItem> 80 </List> 81 </Drawer> 82 <main className={this.props.classes.content}> 83 <Router> 84 <div> 85 <Route exact path='/' component={Home}/> 86 <Route path='/About' render={ () => <About name='shoya' /> }/> 87 </div> 88 </Router> 89 </main> 90 </div> 91 ) 92 } 93} 94 95export default withStyles(styles)(withRouter(App)) 96 97render( 98 <App />, 99 document.getElementById('app') 100);

がしかし、実際に記述したコードを実行すると

Cannot read property 'root' of undefined

とコンソールに表示されます。

試しに、上記のコードから

className={this.props.classes.root}

の記述を削除して実行してみたところ、

Cannot read property 'appBar' of undefined

と表示されます。(おそらくthis.props.classesに問題がある?classes自体がundefinedなのだろうか?)

material-uiは日本語のドキュメントも少なく、とても苦戦しております...。
ぜひお力添えお願いします。

足りない情報があれば追記します。

jun68ykt👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは

以下の回答は、ご質問に掲載のソースコードが(たとえば index.jsだったりの)ひとつのファイルに書かれているものと解釈しての回答になります。(これが違っていたら、コメントからお知らせください。)

以下の部分、

修正前:

jsx

1export default withStyles(styles)(withRouter(App)) 2 3render( 4 <App />, 5 document.getElementById('app') 6);

を、たとえば以下のように修正してみると、いかがでしょうか?

修正後:

jsx

1const AppWithStylesAndRouter = withStyles(styles)(withRouter(App)) 2 3render( 4 <AppWithStylesAndRouter />, 5 document.getElementById('app') 6);

修正前のものだと、 withStyles によって classes がpropsに追加される前の App をマウントしてしまいます。

以上参考になれば幸いです。

追記

コメントから頂きました、別のエラーの対応ですが、

import { BrowserRouter as Router, Route, withRouter } from 'react-router-dom'

で import している BrowserRouter as Router を使って、render の第一引数を以下のように、AppWithStylesAndRouter を Routerで囲むように修正してみるといかがでしょうか?

jsx

1render( 2 <Router> 3 <AppWithStylesAndRouter /> 4 </Router>, 5 document.getElementById('app') 6);

投稿2019/08/18 16:54

編集2019/08/18 17:39
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wisheebell

2019/08/18 17:32

回答ありがとうございます 今確認してみたところ You should not use <withRouter(App) /> outside a <Router> とエラーが出ました。 これについてはわかりますか?
jun68ykt

2019/08/18 17:40

コメントありがとうございます。 > You should not use <withRouter(App) /> outside a <Router> の対策を、回答のほうに追記しました。
wisheebell

2019/08/18 17:44

ありがとうございます。 再度、追記の内容も確認してみましたが、以下のエラーが出てきました。 Cannot read property 'classes' of undefined
jun68ykt

2019/08/18 17:53

> Cannot read property 'classes' of undefined 上記のエラーが発生したのは、どこの行なのかは分かりますか?
wisheebell

2019/08/18 17:59

69行目のようです 68: classes={{ 69: paper: this.prpos.classes.drawerPaper, 70: }}
jun68ykt

2019/08/18 18:00

以下にスペルミスがあります。 <Drawer className={this.props.classes.drawer} variant="permanent" classes={{ paper: this.prpos.classes.drawerPaper, }} > 上記の中で paper: this.prpos.classes.drawerPaper, となっていて、 this.prpos となっていますが、これは this.props のタイポですね。
jun68ykt

2019/08/18 18:04

> 69行目のようです エラー行の特定、ありがとうございます。 はい。 先のコメントにも書きましたが、 > 69: paper: this.prpos.classes.drawerPaper, で、 classes の前が、 this.prpos となっています。正しくは this.props ですね。
jun68ykt

2019/08/19 04:52

その後いかがでしょうか。ご質問のタイトルにある、 「material-uiでwithStylesをしようとするとclassesがundefinedになる」 という問題については解決しましたでしょうか?
wisheebell

2019/08/19 05:00

確認ありがとうございます。 こちらの些細な確認ミスで申し訳ないです...。 書き直してみたところ、正常に動作しました! とても助かりました!ありがとうございます
jun68ykt

2019/08/19 05:05

どういたしまして。 > 書き直してみたところ、正常に動作しました! とのことでよかったです ????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問