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

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

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

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

Material Design

Material Designとは、Google社によって提唱されたデザインシステムです。デジタルにおける体験を構築するための見た目や振る舞いに関するガイドラインが含まれます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

CSSフレームワーク

CSSフレームワークは、Webページのスタイルを指定する言語であるCSSを容易に構築するためのツールです。ツイッター社が開発した「Bootstrap」や段組レイアウトが可能な「Foundation」など様々なCSSフレームワークがあります。

Q&A

解決済

1回答

3067閲覧

Material-UIのDrawerコンポーネントで、makeStylesで定義されてるCSSをstyled-componentに書き直したい

tacro

総合スコア23

Material-UI

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

Material Design

Material Designとは、Google社によって提唱されたデザインシステムです。デジタルにおける体験を構築するための見た目や振る舞いに関するガイドラインが含まれます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

CSSフレームワーク

CSSフレームワークは、Webページのスタイルを指定する言語であるCSSを容易に構築するためのツールです。ツイッター社が開発した「Bootstrap」や段組レイアウトが可能な「Foundation」など様々なCSSフレームワークがあります。

0グッド

0クリップ

投稿2020/05/20 03:04

#前提・実現したいこと
TypeScript, Material-UI, styled-componentsを使ってReactアプリを開発しています。
Material-UIのDrawerコンポーネントを使ってSideDrawerを実装しているのですが、
スタイリングはstyled-componentsで管理したく、makeStylesで書かれているものをリライトしている最中に、うまくpropsを参照できない問題が発生しています。

#発生している問題
元のコード

typescript

1... 2// styling 3const useStyles = makeStyles((theme: Theme) => 4 createStyles({ 5 ... 6 }, 7 appBar: { 8 transition: theme.transitions.create(['margin', 'width'], { 9 easing: theme.transitions.easing.sharp, 10 duration: theme.transitions.duration.leavingScreen, 11 }), 12 }, 13 appBarShift: { 14 width: `calc(100% - ${drawerWidth}px)`, 15 marginLeft: drawerWidth, 16 transition: theme.transitions.create(['margin', 'width'], { 17 easing: theme.transitions.easing.easeOut, 18 duration: theme.transitions.duration.enteringScreen, 19 }), 20 }, 21 ... 22 }), 23); 24 25//tsx 26... 27<AppBar 28 position="fixed" 29 className={clsx(classes.appBar, { 30 [classes.appBarShift]: open, 31 })} 32 > 33 ... 34</AppBar> 35... 36

上記のコードを、下記のように書き直そうとしています。

typescript

1//styled-components having $ as prefix 2const $AppBar = styled(AppBar)<{open: boolean}>` 3 transition: ${ 4 props => props.theme.transitions.create(['margin', 'width'], { 5 easing: props.theme.transitions.easing.sharp, 6 duration: props.theme.transitions.duration.leavingScreen, 7 }) 8 }; 9  /* 10 "Property 'props' does not exist on type 11 'AppBarProps & { open: boolean; } & ThemeProps<any>'" 12 というエラーが出て、propsをうまく参照することができません。 13 */ 14 ${({ open, props }) => open && ` 15 width: calc(100% - ${drawerWidth}px); 16 margin-left: ${drawerWidth}; 17 transition: ${ 18     /* なので"Parameter 'props' implicitly has an 'any' type."になってしまいます。 */ 19 props => props.theme.transitions.create(['margin', 'width'], { 20 easing: props.theme.transitions.easing.easeOut, 21 duration: props.theme.transitions.duration.enteringScreen, 22 }) 23 }; 24 `} 25`; 26... 27//jsx 28<$AppBar 29 position="fixed" 30 open={open} 31 > 32 ... 33</$AppBar> 34

この時、openによってconditionalにスタイリングしたいのですが、themeの参照に必要なpropsを指示してくれません。

#試してみたこと
下記のように型を指定しようと試みたのですが、上手くいきません。

typescript

1${({ open, props: ThemedStyledProps }) => open && ` 2 ... 3 `}

ご教示いただけると幸いです。

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました!
stackoverflowで同じこと書いたのでそちらのリンク参照ください。
Transforming Material-UI Drawer with makeStyles into one with styled-component

投稿2020/05/20 09:53

tacro

総合スコア23

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問