添加index.css文件

先不使用CSS preprocessor
在src 目录下添加一个新的index.css 文件,在index.js中导入

  1. import './index.css'

注意当index.js变化时,react并不会自动刷新
在项目根目录新建.env文件, 写入下列代码则会自动刷新

  1. FAST_REFRESH=false

在React中,我们必须使用className属性而不是 class 属性。

  1. <li className='note'>
  2. {note.content}
  3. <button onClick={toggleImportance}>{label}</button>
  4. </li>

Improved error message

新建Notification组件

  1. const Notification = ({ message }) => {
  2. if (message === null) {
  3. return null
  4. }
  5. return (
  6. <div className="error">
  7. {message}
  8. </div>
  9. )
  10. }

样式
注意,如果border没给color, 则其color和字体color一样

  1. .error {
  2. color: red;
  3. background-color: lightgrey;
  4. font-size: 20px;
  5. border-style: solid;
  6. border-radius: 5px;
  7. padding: 10px;
  8. margin-bottom: 10px;
  9. }

错误处理逻辑

  1. .catch(error => {
  2. setErrorMessage(
  3. `Note '${note.content}' was already removed from server`
  4. )
  5. setTimeout(() => {
  6. setErrorMessage(null)
  7. }, 5000)
  8. setNotes(notes.filter(n => n.id !== id))
  9. })

Inline styles 内嵌样式

React的Inline styles看起来像这样

  1. {
  2. color: 'green',
  3. fontStyle: 'italic',
  4. fontSize: 16
  5. }
  • 连字符(kebab case)的 CSS 属性是用 camelCase 驼峰式编写
  • 像素的数值可以简单写成整数,不带px
  • 用逗号分隔(其实就是一个对象)

让我们定义一个Footer组件

  1. const Footer = () => {
  2. const footerStyle = {
  3. color: 'green',
  4. fontStyle: 'italic',
  5. fontSize: 16
  6. }
  7. return (
  8. <div style={footerStyle}>
  9. <br />
  10. <em>Note app, Department of Computer Science, University of Helsinki 2021</em>
  11. </div>
  12. )
  13. }

内联样式有一定的限制, 例如不能使用伪类pseudo-classes
React哲学:构成应用功能实体的结构单元是 React 组件。 React 组件定义了组织内容的 HTML,确定功能的 JavaScript 函数,以及组件的样式; 所有这些都放在一个地方。 这是为了创建尽可能独立和可重用的单个组件。