介绍
React 是由 Facebook 创建和维护的开源视图库。它是渲染当代 Web 应用程序用户界面(UI)的绝佳工具。
React 使用名为 JSX 的 JavaScript 语法扩展,允许你直接在 JavaScript 中编写 HTML。这有几个好处。它允许你在 HTML 中使用 JavaScript 的完整程序功能,并有助于保持代码的可读性。在大多数情况下,JSX 类似于你已经学过的 HTML,但是在这些挑战中将会涉及一些关键差异。
例如,因为 JSX 是 JavaScript 的语法扩展,所以你实际上可以直接在 JSX 中编写 JavaScript。要做到这一点,你只需在花括号中包含你希望被视为 JavaScript 的代码:{“这被视为 JavaScript 代码”}
。
但是,由于浏览器不能解析 JSX,因此必须将 JSX 代码编译为 JavaScript。在这个过程中,转换器 Babel 是一个很受欢迎的工具。
创建 JSX
添加注释
渲染 DOM 树
定义样式类
因为class
是 JavaScript 中的关键字。JSX 使用className
代替。
JSX 中所有 HTML 属性和事件引用的命名约定都变成了驼峰式。
自动闭合标记
创建无状态组件
组件是 React 的核心。React 中的所有内容都是一个组件。
有两种方法可以创建 React 组件:
-
使用函数
以这种方式定义组件会创建无状态功能组件,可以将无状态组件视为可以接收数据并对其进行渲染的组件,但是它不管理或跟踪对数据的更改。React 要求你的函数名以大写字母开头。
-
使用 class 语法
嵌套组件
渲染组件为 Dom 树
将 Props 传递给组件
传递数组作为 Props
使用默认的 Props
覆盖默认的 Props
使用 PropTypes 来定义你期望的 Props
使用 this.props 访问 Props
{this.props.tempPassword}
复习
创建有状态的组件
React 中最重要的主题之一是state
。 state 包含应用程序需要了解的任何数据,这些数据可能会随时间而变化。你希望应用程序能够响应 state 的变更,并在必要时显示更新后的 UI。React 为现代 Web 应用程序的状态管理提供了一个很好的解决方案。
你可以通过在constructor
中的组件类上声明state
属性来在 React 组件中创建 state,它在创建时使用state
初始化组件。state
属性必须设置为 JavaScript对象
。声明如下:
this.state = { // describe your state here }
你可以在组件的整个生命周期内访问state
对象,你可以更新它、在 UI 中渲染它,也可以将其作为 props 传递给子组件。state
对象的使用可以很简单,亦可以很复杂,就看你怎么用了。请注意,你必须通过扩展React.Component
来创建类组件,以便像这样创建state
。
在用户界面中渲染状态
以另一种方式在用户界面中渲染状态
用 this.setState 设置状态
将 this 绑定到 Class 方法
除了设置和更新state
之外,你还可以为组件类定义方法。类方法通常需要使用this
关键字,以便它可以访问方法中类的属性(例如state
和props
)。有几种方法可以让你的类方法访问this
。
一种常见的方法是在构造函数中显式地绑定this
,这样当组件初始化时,this
就会绑定到类方法。你可能已经注意到上一个挑战使用了this.handleClick = this.handleClick.bind(this)
用于其在构造函数中的handleClick
方法。然后,当你在类方法中调用像this.setState()
这样的函数时,this
指的是这个类,而不是undefined
。
注意: this
关键字是 JavaScript 中最令人困惑的方面之一,但它在 React 中扮演着重要的角色。虽然它的行为在这里是完全正常的,但是这些课程并不深入研究this
,所以如果以上内容令你感到困惑,请参考其他课程!
改变 state 方式
input 双向绑定
控制表单
将 State 作为 Props 传递给子组件
传递回调作为 Props
生命周期方法
React 组件有几种特殊方法,可以在组件生命周期的特定点执行操作。这些称为生命周期方法或生命周期钩子,允许你在特定时间点捕获组件。这可以在渲染之前、更新之前、接收 props 之前、卸载之前等等。以下是一些主要生命周期方法的列表:
componentWillMount()
当组件被挂载到 DOM 时,componentWillMount()
方法在render()
方法之前被调用。
componentDidMount()
React 的最佳实践是在生命周期方法componentDidMount()
中对服务器进行 API 调用或任何其他调用。将组件装载到 DOM 后会调用此方法。此处对setState()
的任何调用都将触发组件的重新渲染。在此方法中调用 API 并使用 API 返回的数据设置 state 时,一旦收到数据,它将自动触发更新。
componentWillUnmount()
componentWillReceiveProps()
shouldComponentUpdate(nextProps,nextState)
优化重渲染
如果任何组件收到新的状态或新的道具,它将重新呈现自己及其所有子级。通常没关系。但是 React 提供了一个生命周期方法,您可以在子组件收到新状态或道具时调用该方法,并明确声明组件是否应该更新。该方法为 shouldComponentUpdate(),它使用 nextProps 和 nextState 作为参数。 此方法是优化性能的有用方法。
例如,默认行为是您的组件在收到新道具时会重新渲染,即使这些道具没有更改也是如此。您可以使用 shouldComponentUpdate()通过比较道具来防止这种情况。该方法必须返回一个布尔值,该值告诉 React 是否更新组件。您可以将当前道具(this.props)与下一个道具(nextProps)进行比较,以确定是否需要更新,并相应地返回 true 或 false。
介绍内联样式
还有其他复杂的概念可以为你的 React 代码增加强大的功能。但是,你可能会想知道更简单的问题,比如:如何对在 React 中创建的 JSX 元素进行风格化。你可能知道,由于将 class 应用于 JSX 元素的方式与 HTML 中的使用并不完全相同。
如果从样式表导入样式,它就没有太大的不同。使用className
属性将 class 应用于 JSX 元素,并将样式应用于样式表中的 class。另一种选择是使用***内联***样式,这在 ReactJS 开发中非常常见。
你将内联样式应用于 JSX 元素,类似于你在 HTML 中的操作方式,但有一些 JSX 差异。以下是 HTML 中内联样式的示例:
JSX 元素使用style
属性,但是由于 JSX 的传输方式,你不能将值设置为字符串
。相反,你应将其设置为 JavaScript对象
。这里有一个例子:
注意我们使用驼峰式命名的 "fontSize" 属性,这是因为 React 不会接受样式对象中的连字符。React 将在 HTML 中为我们应用正确的属性名称。
在 React 中添加内联样式
在上一次挑战中,你可能已经注意到,除了设置为 JavaScript 对象的style
属性之外,与 HTML 内联样式相比,React 的内联样式还有其他几个语法差异。首先,某些 CSS 样式属性的名称使用驼峰式命名。例如,最后一个挑战用fontSize
而不是font-size
来设置字体的大小。对于 JavaScript 对象属性来说,像font-size
这样的连字符命名是无效的语法,所以 React 使用驼峰式命名。通常,任何连字符的 style 属性在 JSX 中都是使用驼峰式命名的。
除非另有规定,否则所有属性值是长度的(如height
、width
和fontSize
)其单位都假定为px
。例如,如果要使用em
,可以用引号将值和单位括起来,例如{fontSize: "4em"}
。除了默认为px
的长度值之外,所有其他属性值都应该用引号括起来。
在 React Render 方法中使用 JavaScript
在之前的挑战中,你学习了如何使用大括号{ }
将 JavaScript 代码插入到 JSX 代码中,用于访问 props、传递 props、访问 state、在代码中插入注释以及最近学习的定制组件样式等任务。这些都是将 JavaScript 放在 JSX 中的常见用例,但是在 React 组件中使用 JavaScript 代码还有其他方式。
在render
方法中编写 JavaScript,你可以把 JavaScript 直接放在return
语句之前,而***不必***将其插入大括号中。这是因为它还不在 JSX 代码中。当你稍后想在return
语句中的 JSX 代码中使用变量时,可以将变量名放在大括号中。
使用 If/Else 条件进行渲染
使用 JavaScript 控制渲染视图的另一个应用是将渲染的元素绑定到一个条件。当条件为真时,将呈现一个视图,反之,则呈现另一种视图。你可以在 React 组件的render()
方法中使用的标准if/else
语句来实现这一点。
使用 && 获得更简洁的条件
使用三元表达式进行条件渲染
condition ? expressionIfTrue : expressionIfFalse
有条件地从 props 渲染
根据组件状态有条件地更改内联 CSS
使用 Array.map() 动态渲染元素
为同级元素赋予唯一键属性
上一个挑战展示了如何使用map
方法根据用户输入动态渲染多个元素。然而,这个例子中缺少一个重要的部分。创建元素数组时,每个元素都需要一个设置为唯一值的key
属性。React 使用这些键来跟踪哪些项目被添加、更改或删除。这有助于在以任何方式修改列表时提高重新渲染过程的效率。请注意,键只需要在同级元素之间是唯一的,它们不需要在应用程序中是全局唯一的。