このコードを使用して、ボタンを上からマージンで囲みます。
const makeTopMargin = (elem) => {
return styled(elem)`
&& {
margin-top: 1em !important;
}
`;
}
const MarginButton = makeTopMargin(Button);
MarginButton
ノードを使用すると、次のエラーが発生します:Warning: Prop
クラス名did not match. Server: "ui icon left labeled button sc-bwzfXH MjXOI" Client: "ui icon left labeled button sc-bdVaJa fKCkqX"
これが生成されたことがわかります ここ 。
私は何をすべきか?
Styled-componentsのbabelプラグインをインストールし、.babelrcでプラグインを有効にする必要があります
npm install --save-dev babel-plugin-styled-components
.babelrc
{
"plugins": [
[
"babel-plugin-styled-components"
]
]
}
PropTypeエラーは、小道具に渡されると予想されるデータが予想とは異なることを通知するランタイムエラーです。コンポーネントに設定されているclassNamepropは、コンポーネントがサーバーでレンダリングされるときと、クライアントのDOMでレンダリングされるときで同じではないようです。
サーバー側のレンダリングを使用しているように見えるため、クラス名が決定論的であることを確認する必要があります。このエラーは、サーバー上のstyled-components
ライブラリによって作成されているクラスと、それがDOMとどのように異なるかを示しています。通常、確定的なクラス名を持たないライブラリの場合は、高度な構成を確認する必要があります。 SSRに関連する特異性に関するstyled-componentsのドキュメントをご覧ください 。
サーバーサイドレンダリングstyled-componentsは、スタイルシートの再ハイドレーションを使用した同時サーバーサイドレンダリングをサポートします。基本的な考え方は、サーバー上でアプリをレンダリングするたびに、ServerStyleSheetを作成し、コンテキストAPIを介してスタイルを受け入れるプロバイダーをReactツリーに追加できるということです。
これは、キーフレームやcreateGlobalStyleなどのグローバルスタイルに干渉せず、React DOMのさまざまなSSRAPIでスタイル付きコンポーネントを使用できます。
import { renderToString } from 'react-dom/server'
import { ServerStyleSheet } from 'styled-components'
const sheet = new ServerStyleSheet()
try {
const html = renderToString(sheet.collectStyles(<YourApp />))
const styleTags = sheet.getStyleTags() // or sheet.getStyleElement();
} catch (error) {
// handle error
console.error(error)
} finally {
sheet.seal()
}
import { renderToString } from 'react-dom/server'
import { ServerStyleSheet, StyleSheetManager } from 'styled-components'
const sheet = new ServerStyleSheet()
try {
const html = renderToString(
<StyleSheetManager sheet={sheet.instance}>
<YourApp />
</StyleSheetManager>
)
const styleTags = sheet.getStyleTags() // or sheet.getStyleElement();
} catch (error) {
// handle error
console.error(error)
} finally {
sheet.seal()
}
私の場合、nextjsを使用しているimとして
import Document, { Head, Main, NextScript } from "next/document";
import { ServerStyleSheet } from "styled-components";
export default class MyDocument extends Document {
static getInitialProps({ renderPage }) {
const sheet = new ServerStyleSheet();
const page = renderPage(App => props =>
sheet.collectStyles(<App {...props} />)
);
const styleTags = sheet.getStyleElement();
return { ...page, styleTags };
}
render() {
return (
<html>
<Head>{this.props.styleTags}</Head>
<body>
<Main />
<NextScript />
</body>
</html>
);
}
}