Class Component VS Function Component

315 阅读2分钟

什么是Function Component ?

Function Component就是以Function的形式创建的React组件

export const WelcomeScreen = () => {
  return (
    <Box>
      Hello world!
    </Box>
  );
};

也就是,一个返回了JSX的Function就可以当做是react组件,这种形式的组件就是Function Component。

什么是class component

export class WelcomeScreen extends Component {
  render() {
    return (
      <Box>
        <Text>You clicked {this.state.count} times</Text>
        <Button onPress={this.log}>Click me</Button>
      </Box>
    );
  }
}

什么是Hooks ?

它可以让你在不编写class的情况下使用state以及其他的React特性。

export const WelcomeScreen = () => {
  const [count, setCount] = React.useState(0);

  return (
    <Box safeAreaY flex={1}>
      <Text>You clicked {count} times</Text>
      <Button onPress={() => setCount(count + 1)}>Click me</Button>
    </Box>
  );
};

useState返回的结果是数组,第一项是值,第二项是赋值函数。

举个例子:先赋值再setTimeout打印

1、我们可以将useState和setTimeout结合使用

2、创建一个按钮,点击后让计时器自增,但是延迟三秒在打印出来

export const WelcomeScreen = () => {
  const [count, setCount] = React.useState(0);

  const log = () => {
    setCount(count + 1);
    setTimeout(() => {
      console.log(count);
    }, 3000);
  };

  return (
    <Box safeAreaY flex={1}>
      <Text>You clicked {count} times</Text>
      <Button onPress={log}>Click me</Button>
    </Box>
  );
};

那输出的结果会是

0
1
2

使用class component再实现一次

export class ChatScreen extends Component {
  state = { count: 0 };

  log = () => {
    this.setState({
      count: this.state.count + 1,
    });
    setTimeout(() => {
      console.log(this.state.count);
    }, 3000);
  };

  render() {
    return (
      <Box>
        <Text>You clicked {this.state.count} times</Text>
        <Button onPress={this.log}>Click me</Button>
      </Box>
    );
  }
}

它输出的结果则是

3
3
3

为什么会打印不同的结果 Class component:

  • 首先state是Immutable的,setState后一定会生成一个全新的state引用
  • 但class component通过this.state方式读取state,这就导致了每行代码都会拿到最新的state引用,所以打印出来的结果都是3 3 3

Function component:

  • useState产生的数据也是Immutable,通过setCount原来的值就会形成一个新的引用在下次渲染时使用
  • 但是由于没有使用this去读取,所以每次打印的都是当时渲染闭包环境的数据,虽然最新的值改变了但是在旧的渲染里状态依然是旧值

总结:

  1. function 组件与 class 组件最大的不同是 function 组件能够捕获渲染的值,而 class 组件因为 react 中 this 是可变的,所以总是能获取最新的 props。

2.function component属于无状态组件,这些组件不管理状态也没有任何副作用,但是可以使用react hook使function组件加入状态。

3.react官方更推荐使用function component