react-native:使用asState / await和setState

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了react-native:使用asState / await和setState相关的知识,希望对你有一定的参考价值。

我有这个简单的代码。

export default class ProductDetail extends Component {

  constructor(props) {
    super(props);
    this.state = { test: null,id:this.props.navigation.state.params.productId };
    console.log(1);
  }

  componentWillMount() {
    console.log(2);
    this.getProductRequest(this.state.id);
    console.log(3);
  }

  async getProductRequest(id) {
    try {
      let api_token = await AsyncStorage.getItem('apiToken')
      let response = await fetch('...')
      let json = await response.json();
      this.setState({test: json});

    } catch(error) {
      //
    }

  }

  render() {
    console.log(4);
    console.log(this.state.test);
    return (
      <View><Text>test</Text></View>
    );
  }
}

现在,我在调试器中检查了它:

我期待这个结果:

1

2

3

4

{data:{...},状态:“成功”,...}

但我明白了:

1

2

3

4

空值

4

{data:{...},状态:“成功”,...}

我认为这意味着render()运行两次!

我该如何处理这个错误?

答案

我认为这意味着render()运行两次!

它确实:在您的异步结果可用之前,然后再次使用它并使用setState。这是正常的和预期的。

您无法阻止第一个渲染等待异步操作完成。你的选择是:

  1. 如果组件还没有数据,请正确呈现组件。要么,
  2. 如果您不希望在异步操作完成之前渲染组件,请将该操作移至父组件,并仅在数据可用时呈现此组件,并将数据作为props传递给此组件。
另一答案

只是为了补充T.J Crowder的答案,我喜欢做的一件事是如果还没有收到数据,则返回ActivityIndicator

import {
    View,
    Text,
    ActivityIndicator
} from 'react-native';

export default class ProductDetail extends Component {
    ... your code ...

    render() {
        if (!this.state.test) {
            return <ActivityIndicator size='large' color='black' />
        }

        console.log(4);
        console.log(this.state.test);
        return (
          <View><Text>test</Text></View>
        );
    }
}

以上是关于react-native:使用asState / await和setState的主要内容,如果未能解决你的问题,请参考以下文章

使用 react-native run-android 运行时出现 React-Native 错误

React-native:如何在 React-native 中使用(和翻译)带有 jsx 的 typescript .tsx 文件?

使用 react-native router-flux 时,BackHandler 在 react-native 侧面菜单中不起作用

使用 Formik 的 React-Native 选择器

使用带有样式组件的动画(react-native)

使用 react-native 克隆本机 android 警报屏幕