[解決済み] MakeStyles を使用してコンポーネントのスタイルを設定し、マテリアル UI のライフサイクル メソッドを維持するにはどうすればよいですか?
2022-05-09 14:06:08
質問
を使用しようとすると、以下のエラーが発生します。
makeStyles()
を、ライフサイクル・メソッドを持つコンポーネントで使用することができます。
無効なフック呼び出しです。フックは、関数コンポーネントの本体内部でのみ呼び出すことができます。これは、次のいずれかの理由で発生する可能性があります。
- Reactとレンダラー(React DOMなど)のバージョンが不一致である可能性があります。
- フックのルールを破っている可能性があります。
- 同じアプリに複数のReactのコピーを持っている可能性があります。
以下は、このエラーを発生させるコードの小さな例です。他の例でも同様に、子アイテムにクラスを割り当てています。MUIのドキュメントには、他の方法を示すものは見当たりません。
makeStyles
で、ライフサイクルメソッドを使用する機能があります。
import React, { Component } from 'react';
import { Redirect } from 'react-router-dom';
import { Container, makeStyles } from '@material-ui/core';
import LogoButtonCard from '../molecules/Cards/LogoButtonCard';
const useStyles = makeStyles(theme => ({
root: {
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
},
}));
const classes = useStyles();
class Welcome extends Component {
render() {
if (this.props.auth.isAuthenticated()) {
return <Redirect to="/" />;
}
return (
<Container maxWidth={false} className={classes.root}>
<LogoButtonCard
buttonText="Enter"
headerText="Welcome to PlatformX"
buttonAction={this.props.auth.login}
/>
</Container>
);
}
}
export default Welcome;
どのように解決するのですか?
結局、クラスコンポーネントをやめて、ファンクショナルコンポーネントを作りました。
使って
useEffect()
から
ライフサイクルメソッド用フックAPI
. これにより、今まで通り
makeStyles()
ライフサイクルメソッドによる
高次のコンポーネントを作るという複雑な作業を加えることなく
. どちらがよりシンプルかというと
例
import React, { useEffect, useState } from 'react';
import axios from 'axios';
import { Redirect } from 'react-router-dom';
import { Container, makeStyles } from '@material-ui/core';
import LogoButtonCard from '../molecules/Cards/LogoButtonCard';
const useStyles = makeStyles(theme => ({
root: {
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
margin: theme.spacing(1)
},
highlight: {
backgroundColor: 'red',
}
}));
// Highlight is a bool
const Welcome = ({highlight}) => {
const [userName, setUserName] = useState('');
const [isAuthenticated, setIsAuthenticated] = useState(true);
const classes = useStyles();
useEffect(() => {
axios.get('example.com/api/username/12')
.then(res => setUserName(res.userName));
}, []);
if (!isAuthenticated()) {
return <Redirect to="/" />;
}
return (
<Container maxWidth={false} className={highlight ? classes.highlight : classes.root}>
<LogoButtonCard
buttonText="Enter"
headerText={isAuthenticated && `Welcome, ${userName}`}
buttonAction={login}
/>
</Container>
);
}
}
export default Welcome;
関連
-
[解決済み] useStateプロパティのフックにmap関数を使用する方法
-
[解決済み] react router dom v4でwebpack dev serverを構成する方法は?
-
[解決済み] react nativeで関数だらけのヘルパーファイルを作成する方法は?
-
[解決済み] React - _this2.SetStateは関数ではありません。
-
[解決済み] reactstrapのドロップダウンで選択されたアイテムを設定する方法は?
-
[解決済み] validateDOMNesting警告React
-
[解決済み] Cross-envでyarnの実行時にenv変数が変更されない。
-
[解決済み] react-router-domを使用する際に「Function components cannot be given refs」を回避する方法は?
-
[解決済み] reactのuseStateフックでコールバックを使う方法 [重複]。
-
[解決済み] ESLintとTSLintの違い【クローズド】について
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】React 17で動作するEnzymeアダプターはどれですか?
-
[解決済み】Reactコンポーネント内でswitchステートメントを使用するには?
-
[解決済み】Reactでclsxを使用する方法
-
[解決済み] SVGサークル内の画像にボーダーを追加する方法
-
[解決済み] Next.jsでWebSocketを利用する
-
[解決済み] カスタマイズ素材UI チェックした場合としない場合の切り替え
-
[解決済み] ReactコンポーネントのJest SnapshotテストにおけるSnapshotテストの仕組みとtoMatchSnapshot()関数は何をするのか?
-
[解決済み] Static HTML elements with event handlers require a role." を修正するにはどうすればよいですか?
-
[解決済み] アクシオスは定義されていません
-
[解決済み] Error: yarn start - エラー コマンド "start" が見つかりません。