CSSファイルをスタイル付きコンポーネントにインポートする方法はありますか?
私の依存関係の1つである React Quill Editor は、CSSをベースとしてインポートし、その上に変更を適用することでテーマ設定できます。私のコンポーネントはすべてスタイル付きコンポーネントであり、CSSを「グローバル」スタイルとしてインポートするのではなく、CSSをJSコンポーネントにローカライズしたままにしたいと思います。
今、私は彼らのCSSを次の形式で自分のファイルにコピーすることにしました。
以下に簡単な例を書きました。
/** editorCSS.js **/
import { css } from 'styled-components';
export default css`
/* copied CSS here */
.class-to-extend {
color: green;
}
`
/** EditorComponent.js **/
import styled from 'styled-components';
import ReactQuill from 'react-quill';
import editorCSS from './editorCSS';
const StyledReactQuill = styled(ReactQuill)`
${editorCSS}
/** Additional customization if necessary (e.g. positioning) */
`
export default StyledReactQuill;
`
私はむしろ、スタイル付きコンポーネントのスコープでCSSファイルを参照してインポートするのではなく、コピーするほうがいいです。
import ReactQuillCSS from 'react-quill/dist/quill.snow.css';
を実行すると、css-loader
プラグインにより、CSSがグローバルに適用されます。
ベスト、ダニエル
raw-loader を使用してquill.snow.css
スタイルシートをロードし、スタイル付きコンポーネントに含めることができます。
/** EditorComponent.js **/
import styled from 'styled-components';
import ReactQuill from 'react-quill';
import quillCSS from '!!raw-loader!react-quill/dist/quill.snow.css';
const StyledReactQuill = styled(ReactQuill)`
${quillCSS}
/** Additional customization if necessary (e.g. positioning) */
`
export default StyledReactQuill;
raw-loader
ドキュメントに従って、!!
を使用して、css-loader
を介してスタイルがグローバルに追加されるのを防ぐことができます。
!!
をリクエストに追加すると、構成で指定されたすべてのローダーが無効になります
そのためには、css-loader
以外のローダーを使用する必要があります。グローバルスタイルシートに追加するのではなく、styled-components
用に準備する別のローダーを作成することもできます。
ただし、css-loader
が必要な場合は、どのcssファイルが処理され、どのcssファイルがスタイル付きコンポーネント用にロードされるかを定義する必要があります。
これは私がやった方法です:
import React, { Component } from "react";
import ReactDOM from "react-dom";
import Styled from "styled-components";
const fetchStyles = () =>
fetch(
"https://Gist.githubusercontent.com/bionicvapourboy/61d3d7a8546cb42e0e3194eb9505f48a/raw/5432218dd83320d53d1cbc2f230b81c765183585/style.css"
).then(response => response.text());
class App extends Component {
state = {
style: ""
};
componentDidMount() {
fetchStyles().then(data => this.setState({ style: data }));
}
Wrapper = () => Styled.div`
${this.state.style}
`;
render() {
const Wrapper = this.Wrapper();
return (
<div className="App">
<Wrapper>
<h1>Styled</h1>
</Wrapper>
<h1>Not Styled</h1>
<h2>Start editing to see some magic happen!</h2>
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
私の理解によると、styled-componentsはとにかく本質的にテンプレートリテラルです。
唯一の問題は、インポートされたcssをコンポーネントのcssに配置しようとしたときに、オブジェクトとして定義されていることです。最初に文字列に型キャストしてみましたか?
/** EditorComponent.js **/
import styled from 'styled-components';
import ReactQuill from 'react-quill';
import editorCSS from './editorCSS';
const newCSS = editorCSS.toString();
export default Styled(ReactQuill)`
${newCSS}
`;