Reactアプリにantd darkテーマを適用する方法は?


8

私の新しい反応Webアプリにこの暗いテーマを使用したい:https : //github.com/ant-design/ant-design-dark-theme

ここでテーマをカスタマイズする手順と、README テーマを適用する手順を実行すると、config-overrides.jsは次のようになります。

const { darkTheme } = require('@ant-design/dark-theme');
const { override, fixBabelImports, addLessLoader } = require('customize-cra');

module.exports = override(
  fixBabelImports('import', {
    libraryName: 'antd',
    libraryDirectory: 'es',
    style: true,
  }),
  addLessLoader({
    javascriptEnabled: true,
    modifyVars: darkTheme
  }),
);

これは機能していないようです。たとえば、Menu antdコンポーネントがまだ「暗い」テーマではなく「明るい」テーマで表示されています。

明示的に設定せずに、すべてのantdコンポーネントをダークテーマでレンダリングしたいのですが。それは可能ですか?はいの場合、私は何が間違っていますか?

ここではフロントエンドの開発者ではないので、明らかなものがない場合はお知らせください。

回答:


3

私にとってうまくいった解決策は、@ JoseFelixと@Anujsの両方の回答の組み合わせでした。両方の回答をありがとう:

const darkTheme = require('@ant-design/dark-theme');
const { override, fixBabelImports, addLessLoader } = require('customize-cra');

module.exports = override(
  fixBabelImports('import', {
    libraryName: 'antd',
    libraryDirectory: 'es',
    style: true,
  }),
  addLessLoader({
    javascriptEnabled: true,
    modifyVars: darkTheme.default
  }),
);

アプリ内で暗いテーマとデフォルトのテーマを直接切り替える方法はありますか?
Greg Forel

2

darkThemeインポートされたコンソールログ変数の場合、すべてのスタイル変数はdarkTheme.defaultオブジェクト内に存在します。私はそれらを実装しましたaliyum-theme

したがって、コードを機能させるにmodifyVarsは、config-overrides.jsファイル内を次のように変更する必要があります。

const { darkTheme } = require('@ant-design/dark-theme');
const { override, fixBabelImports, addLessLoader } = require('customize-cra');

module.exports = override(
  fixBabelImports('import', {
    libraryName: 'antd',
    libraryDirectory: 'es',
    style: true,
  }),
  addLessLoader({
    javascriptEnabled: true,
    modifyVars: {...darkTheme.default}
  }),
);

ProTip:あなたがあなた自身のJavaScriptファイルを作成し、内部にそれをインポートすることができ、アプリケーション内darkThemeを無効にするためにconfig-overrides.js内のファイルとdestructuremodifyVars


2

デフォルトのエクスポートが変数を持つオブジェクトである場合、コードはデフォルトのエクスポートを破壊しています。したがって、次のようになります。

const darkTheme = require('@ant-design/dark-theme').default;
const { override, fixBabelImports, addLessLoader } = require('customize-cra');

module.exports = override(
  fixBabelImports('import', {
    libraryName: 'antd',
    libraryDirectory: 'es',
    style: true,
  }),
  addLessLoader({
    javascriptEnabled: true,
    modifyVars: darkTheme
  }),
);

0

https://www.npmjs.com/package/antd-theme

app.jsx

import { Button, Select } from 'antd';
import { ThemeProvider, useTheme } from 'antd-theme';
import React from 'react';
import ReactDOM from 'react-dom';
import { SketchPicker } from 'react-color';

const initialTheme = {
  name: 'default',
  variables: { 'primary-color': '#00ff00' },
};

const ThemeSelect = () => {
  const [{ name, variables, themes }, setTheme] = useTheme();

  return (
    <>
      <Select
        style={{ width: 100 }}
        value={name}
        onChange={
          (theme) => setTheme({ name: theme, variables })
        }
      >
        {
          themes.map(
            ({ name }) => (
              <Select.Option key={name} value={name}>
                {name}
              </Select.Option>
            )
          )
        }
      </Select>
      <SketchPicker
        color={variables['primary-color']}
        onChange={(value) => {
          // Will update all css attributes affected by primary-color
          setTheme({ name, variables: { 'primary-color': value.hex } });
        }}
      />
    </>
  );
};

const App = () => {
  const [theme, setTheme] = React.useState(initialTheme);
  return (
    <ThemeProvider
      theme={theme}
      onChange={(value) => setTheme(value)}
    >
      <ThemeSelect />
      <Button type="primary">Button</Button>
    </ThemeProvider>
  );
};

ReactDOM.render(<App />, document.getElementById('root'));

ご利用の方へ react-app-rewire-lesscustomize-crareact-app-rewired、このようなJavaScriptを有効にしている人のために

config-overrides.js

const { override, fixBabelImports, addLessLoader, addPostcssPlugins, adjustStyleLoaders, addWebpackPlugin } = require('customize-cra');

const AntdThemePlugin = require('antd-theme/plugin');

module.exports = override(
  fixBabelImports('import', {
    libraryName: 'antd',
    libraryDirectory: 'es',
    style: true,
  }),
  addLessLoader({
    javascriptEnabled: true,
  }),
  adjustStyleLoaders(
    (loaders) => {
      loaders.use[0] = {
        loader: AntdThemePlugin.loader
      }
    }
  ),
  addWebpackPlugin(
    new AntdThemePlugin({
      themes: [
        {
          name: 'dark',
          filename: require.resolve('antd/lib/style/themes/dark.less'),
        },
        {
          name: 'compact',
          filename: require.resolve('antd/lib/style/themes/compact.less'),
        },
      ],
    })
  ),
);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.