由于classNames的分配方式不同,我在Material-UI组件中的客户端和服务器端样式渲染之间存在差异。
第一次加载页面时会正确分配className,但是刷新页面后,className将不再匹配,因此组件将失去其样式。这是我在控制台上收到的错误消息:
警告:道具
className
不匹配。服务器:“ MuiFormControl-root-3 MuiFormControl-
marginNormal-4 SearchBar-textField-31 ”客户端:“ MuiFormControl-root-3
MuiFormControl-marginNormal-4 SearchBar-textField-2 ”
我遵循了Material-UI TextField 示例文档及其随附的代码沙箱示例,但是我似乎无法弄清楚是什么原因导致服务器类和客户端类名之间的差异。
在添加带有删除“ x”图标的Material-UI芯片时,我遇到了类似的问题。刷新后呈现的“
x”图标宽度达到了惊人的1024px。同样的潜在问题是该图标没有收到正确的样式类。
关于堆栈溢出,有几个问题解决了为什么客户端和服务器可能会以不同的方式呈现className(例如,需要使用自定义server.js并在setState中使用Math.random升级到@
Material-UI / core版本^ 1.0.0) ),但这些都不适用于我的情况。
我还不知道该Github讨论是否会有所帮助,但由于他们使用的是Material-UI的Beta版,因此可能没有帮助。
创建项目文件夹并启动节点服务器:
mkdir app
cd app
npm init -y
npm install react react-dom next @material-ui/core
npm run dev
添加到“脚本”: "dev": "next",
import Head from "next/head"
import CssBaseline from "@material-ui/core/CssBaseline"
import SearchBar from "../components/SearchBar"
const Index = () => (
<React.Fragment>
<Head>
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css?family=Roboto:300,400,500"
/>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta charSet="utf-8" />
</Head>
<CssBaseline />
<SearchBar />
</React.Fragment>
)
export default Index
import PropTypes from "prop-types"
import { withStyles } from "@material-ui/core/styles"
import TextField from "@material-ui/core/TextField"
const styles = (theme) => ({
container: {
display: "flex",
flexWrap: "wrap",
},
textField: {
margin: theme.spacing.unit / 2,
width: 200,
border: "2px solid red",
},
})
class SearchBar extends React.Component {
constructor(props) {
super(props)
this.state = { value: "" }
this.handleChange = this.handleChange.bind(this)
this.handleSubmit = this.handleSubmit.bind(this)
}
handleChange(event) {
this.setState({ value: event.target.value })
}
handleSubmit(event) {
event.preventDefault()
}
render() {
const { classes } = this.props
return (
<form
className={classes.container}
noValidate
autoComplete="off"
onSubmit={this.handleSubmit}
>
<TextField
id="search"
label="Search"
type="search"
placeholder="Search..."
className={classes.textField}
value={this.state.value}
onChange={this.handleChange}
margin="normal"
/>
</form>
)
}
}
SearchBar.propTypes = {
classes: PropTypes.object.isRequired,
}
export default withStyles(styles)(SearchBar)
在浏览器中访问页面localhost:3000
并看到以下内容:
TextField组件周围的红色边框
刷新浏览器,然后看到以下内容:
TextField组件的样式消失了
请注意,TextField周围的红色边框消失了。
问题是服务器端生成类名,但是样式表不会自动包含在HTML中。您需要显式提取CSS并将其附加到服务器端渲染组件的UI中。整个过程在这里进行了说明:https://material-ui.com/guides/server-
rendering/
由于类名的分配不同,我对Material-UI组件中样式的客户端和服务器端呈现之间的差异感到困难。 第一次加载页面时,类名分配正确,但刷新页面后,类名不再匹配,因此组件失去其样式。这是我在控制台上收到的错误消息: 警告:道具不匹配。服务器:“MuiformControl-Root-3 MuiFormControl-marginNormal-4 SearchBar-TextField-31”客户端:
React Native Material UI (iOS and Android supported) Highly customizable material design components for React Native! Documentation Getting Started Usage Demo & Examples Components Showroom Savee.io i
问题内容: 我在项目中一直使用这两个工具,有时我发现需要在Bootstrap组件和UI显示中使用Material UI组件,这与我期望的一样。有人建议我不要使用这种方法。既然两者都在使用网格并且可以灵活使用,那有什么理由吗? 问题答案: 我倾向于冗长,因此我将简洁的答案放在这里: 结论: 谁说不好用两者可能只是在表达自己的观点,实际上说不好用两者在设计时确实缺乏上下文。@ user3770494提
材料拥有确定不变的特性和固定的行为。了解这些特性将有助于你在一定程度上熟悉材料,这与 Material Design 的构想是一致的。 物理特性 材料具有变化的长宽尺寸(以 dp 为计)和均匀的厚度(1dp)。 (上图)可取 材料的高度和宽度是可变的。 (上图)不可取 材料总是 1dp 厚。 材料会形成阴影。 阴影是由于材料元件之间的相对高度(Z 轴位置)而自然产生的。 (上图)可取 阴影描述材料
问题内容: 我想给我的新应用程序一致的外观和使用感觉。另外,我希望样式等易于维护。因此,默认主题似乎是一个不错的开始。该所提供的似乎要检查所有的盒子,所以我想试一试。令人惊讶的是,这没有用。CSS主题不是我真正的事情。我在这里被误导了吗?以下代码是我在App.js组件中实现的,没有运气(从此处获取)。我希望这只是一个实现细节。 编辑 :这是位于项目的根目录: 编辑: 我新的App.js 问题答案:
目前我的列表都有折叠,但它们链接到一个“打开”的状态,所以如果我打开一个列表,所有其他列表都打开。什么是最好的方法来保持崩溃彼此分开,而不为每个列表提供大量的状态。 ThreadList.tsx