ウェブフロント
- angular
- corewebvitals
- editorconfig
- gatsby
- hls
- html
- javascript
querySelectorAllで取得した要素は配列ではないらしい
JavaScript 配列内のオブジェクトの更新ってどうする?
デバッグ関数とかnullチェック関数をutil/index.tsにおいとけば楽なことに今頃気づいた。
ブラウザからジャイロセンサーを使ってみる
JS 画像のアップロード、プレビュー機能を実装
「数値から各桁の値を取り出す処理」って言われたら数学的な処理が一番に思い浮かぶけど、JSならそんなことなかった。
Callback時代の関数をPromise化する
個人的実装されてほしいECMA Script Proposal
JavaScriptのprototypeを使う
音声をなみなみさせる
AudioWorkletとAudioWorkletProcessorを使って音声のビジュアライゼーション
- next
- nuxt
- playwright
- prettier
- react
- reactnative
- tensorflowjs
- tools
- typescript
- wasm
- websocket
- ポエム
- 開発環境
サーバー
その他
styled-components と material-ui でダークモードを実装する
まず、ダークモード時とライトモード時での配色を定義します。
自分で配色を上書きもできます。urlを参考に。
createMuiTheme
でmaterial-uiの配色を継承して自分の配色を定義できます。
ダークモード時のテーマにtype: 'dark'
とすることでmaterial-uiが定義してくれているダークモードの配色を使うことができます。自分で配色を上書きもできます。urlを参考に。
Material-UI palatte
https://material-ui.com/customization/palette/
そしてテーマを切り替える
theme.ts
getTheme
関数を作成します。theme.ts
import { createMuiTheme } from "@material-ui/core";
const lightTheme = createMuiTheme({
palette: {},
});
const darkTheme = createMuiTheme({
palette: {
type: "dark",
},
});
export const getTheme = (colorMode) => {
switch (colorMode) {
case "light":
return lightTheme;
case "dark":
return darkTheme;
}
};
テーマをどこからでも参照、切り替えできるようにContextを作成します。
createContextの引数にContextの配列を入れます。
配列の中身はテーマの状態(デフォルトをライトモード)と切り替え用の関数です。
そしてコンテキストに流す用のカスタムフックを作成します。
createContextの引数にContextの配列を入れます。
配列の中身はテーマの状態(デフォルトをライトモード)と切り替え用の関数です。
そしてコンテキストに流す用のカスタムフックを作成します。
useState
とuseCallback
を使っています。(命名はらくしましたthemeContext.ts
import { createContext, useCallback, useState } from "react";
type ThemeContext = [string, (mode: string) => void];
const defaultContext: ThemeContext = ["light", () => {}];
export const ThemeContext = createContext<ThemeContext>(defaultContext);
export const useMode = (): ThemeContext => {
const [mode, _setMode] = useState("light");
const setMode = useCallback((_mode: string): void => {
_setMode(_mode);
}, []);
return [mode, setMode];
};
最後にmaterial-uiとstyled-componentsのProviderにテーマを流して、作成したテーマコンテキストにはカスタムフックを流します。
これでmaterial-uiではテーマによる自動的に配色の変更、styled-componentsではpropsとしてどこからでも配色を受け取れるようになり、テーマの切り替えはどのコンポーネントでもできるようになります。
これでmaterial-uiではテーマによる自動的に配色の変更、styled-componentsではpropsとしてどこからでも配色を受け取れるようになり、テーマの切り替えはどのコンポーネントでもできるようになります。
themeProvider.ts
import React from "react";
import { ThemeProvider as StyledThemeProvider } from "styled-components";
import {
StylesProvider,
ThemeProvider as MaterialThemeProvider,
} from "@material-ui/styles";
import { useMode } from "./themeContext";
import { ThemeContext } from "./themeContext";
import { getTheme } from "./theme";
export const ThemeProvider = ({ children }) => {
const [mode, setMode] = useMode();
return (
<StylesProvider injectFirst>
<MaterialThemeProvider theme={getTheme(mode)}>
<StyledThemeProvider theme={getTheme(mode)}>
<ThemeContext.Provider value={[mode, setMode]}>
{children}
</ThemeContext.Provider>
</StyledThemeProvider>
</MaterialThemeProvider>
</StylesProvider>
);
};
参考文献
https://qiita.com/Ouvill/items/c6761c32d31ffb11e114#usestyles-の嬉しいところ
Thanks you for reading.