Skip to content

复习 React 基础知识

ReactNative 的基础是 React,因此要想学习 RN,首先需要对 React 有所了解。

这里简单复习一下 React 中的几个核心概念:

components 组件#

在现代前端开发中,离不开组件化开发。将一个页面上的元素拆解成一个个组件,能够极大程度的复用代码。

image-20220603093839647

在现在流行的三大框架中,无论是 Angular、Vue 还是 React,都支持组件化开发。其中在 React 中,支持两种书写组件的方式。

函数式组件#

在函数式组件中,一个函数就是一个组件,在函数中会返回一段 JSX。早期的函数式组件又被称之为无状态组件,但是自从 Hook 出来后,函数式组件也能够维持自身的状态。

import React from 'react'
import { Text } from 'react-native'
export default function Cat() {
return <Text>Hello, I am your cat!</Text>
}

Class 组件#

Class 类组件,一个组件就是一个 Class 类,这个类需要继承 Component 类,并且在该类中需要提供一个 render 方法,在 render 方法中返回一段 JSX

早期的 Class 类组件被称之为有状态组件,但是随着 Hook 的推出,函数组件也能维护自身的组件状态,因此现在 Class 类组件相比函数组件使用的频率有所降低,因为相比类,前端开发人员更加熟悉函数,并且避开了烦人的 this

import React, { Component } from 'react'
import { Text } from 'react-native'
export default class Cat extends Component {
render() {
return <Text>Hello, I am your cat!</Text>
}
}

JSX#

上面提到,无论是函数组件还是 Class 类组件,都需要返回一段 JSX

JSXReact 中提供的一种特殊的语法,本质上就是使用 JS 对象来描述 DOM 结构。在 React 中提供了 React.createElement 方法来创建虚拟 DOM 对象,从而对 DOM 结构进行描述。

React.createElement(type, [props], [...children])

参数说明:

例如:

const h1 = React.createElement('h1', null, '欢迎学习 React')
const p = React.createElement(
'p',
null,
'在 React 中推荐使用 JSX 来描述用户界面。'
)
const li1 = React.createElement(
'li',
null,
'JSX 执行更快,因为它在编译为 JavaScript 代码后进行了优化。'
)
const li2 = React.createElement(
'li',
null,
'它是类型安全的,在编译过程中就能发现错误。'
)
const li3 = React.createElement('li', null, '使用 JSX 编写模板更加简单快速。')
const ul = React.createElement('ul', null, li1, li2, li3)
const ele2 = React.createElement('div', null, h1, p, ul)

但是显然如果要开发者通过这种方式来描述页面,会分分钟劝退开发者。因此 JSX 应运而生,JSX 本质上就是 React.createElement 方法的一种语法糖,通过 JSX,开发者可以通过类似于 HTML 的语法来描述页面。

const ele1 = (
<div>
<h1>欢迎学习 React</h1>
<p>在 React 中推荐使用 JSX 来描述用户界面。</p>
<ul>
<li>JSX 执行更快,因为它在编译为 JavaScript 代码后进行了优化。</li>
<li>它是类型安全的,在编译过程中就能发现错误。</li>
<li>使用 JSX 编写模板更加简单快速。</li>
</ul>
</div>
)

JSX 具有如下的特点:

  1. 可以在 JSX 中使用 JavaScript 表达式。表达式写在花括号 { } 中。
  2. JSX 中不能使用语句,只能使用表达式。例如不能使用 if else 语句,但可以使用 conditional(三元运算)表达式来替代。
  3. 如果我们在 JSX 中要给标签设置 class,不能够像 HTML 中那样直接书写 class,因为 JSX 实际上是 JS 对象,所以 class 需要替换为 className
  4. 花括号 { } 中可以是数组,数组的每一项为一段 JSX,之后在渲染的时候会自动展开数组中的每一段 JSX
  5. JSX 中如果要书写注释,需要写在 {/* 注释内容... */}

当然,上面所列举的 JSX 示例是在开发 PC 网页时的例子。在 RN 中使用 JSX 可没有什么 div、p 这些标签,使用的都是 RN 所提供的内置组件。

例如:

import React from 'react'
import { Text } from 'react-native'
export default function Cat() {
const name = 'Maru'
return <Text>Hello, I am {name}!</Text>
}

props 属性#

props 是组件对外的接口,在组件内部可以通过 props 拿到外部传给组件的参数。

如果是使用的函数的方式来创建的组件,那么使用 props 对象来传递参数显得非常的简单,就像函数传参一样使用即可。

例如:

import React from 'react'
import { Text, View } from 'react-native'
function Cat(props) {
return (
<View>
<Text>Hello, I am {props.name}!</Text>
</View>
)
}
export default function Cafe() {
return (
<View>
<Cat name="Maru" />
<Cat name="Jellylorum" />
<Cat name="Spot" />
</View>
)
}

如果是 Class 类组件,则需要在 constructor 中将 propssuper 函数传递给父组件。然后在 JSX 中通过 this.props 来获取传入的数据。

例如:

class Welcome extends React.Component {
constructor(props) {
super(props)
}
render() {
return (
<View>
<Text>Hello, I am {props.name}!</Text>
</View>
)
}
}

state 状态#

state 为组件自身的数据状态。早期只有 Class 类组件能够维护组件状态,例如:

import React, { Component } from 'react'
import { Button, Text, View } from 'react-native'
export class Cat extends Component {
// Cat 组件自身的状态
state = { isHungry: true }
render(props) {
return (
<View>
<Text>
I am {this.props.name}, and I am{' '}
{this.state.isHungry ? ' hungry' : ' full'}!
</Text>
<Button
onPress={() => {
this.setState({ isHungry: false })
}}
disabled={!this.state.isHungry}
title={
this.state.isHungry ? 'Pour me some milk, please!' : 'Thank you!'
}
/>
</View>
)
}
}
export default class Cafe extends Component {
render() {
return (
<>
<Cat name="Munkustrap" />
<Cat name="Spot" />
</>
)
}
}

后来 React 加入了 Hook 特性后,函数式组件也能够维护一组 state 了。

import React, { useState } from 'react'
import { Button, Text, View } from 'react-native'
function Cat(props) {
const [isHungry, setIsHungry] = useState(true)
return (
<View>
<Text>
I am {props.name}, and I am {isHungry ? 'hungry' : 'full'}!
</Text>
<Button
onPress={() => {
setIsHungry(false)
}}
disabled={!isHungry}
title={isHungry ? 'Pour me some milk, please!' : 'Thank you!'}
/>
</View>
)
}
export default function Cafe() {
return (
<>
<Cat name="Munkustrap" />
<Cat name="Spot" />
</>
)
}

当然,上面的内容我们只是列举了一些 React 中的核心知识,以助于帮你快速的回顾一下 React 中的重要知识,这并不意味着你不需要掌握 React 相关内容。

如果你对 React 还不了解,建议你先暂停这里的学习,然后先学习了 React 相关知识后在回来继续学习 RN