如何隐藏和显示加载微调器 - Activity Indicator react native, managing props and state

how to hide and show loading spinner - Activity Indicator react native, managing props and state

我创建了一个自定义 Activity 指标 class,我想从我使用它的地方控制它的 hide/show。

这是我所做的。

CustomActivityIndicator.js

    import React, { Component } from 'react';
import { ActivityIndicator, View, Text, TouchableOpacity, StyleSheet, Dimensions } from 'react-native';
import colors from '../../../styles/colors';
import { consoleLog } from '../../../utils/globalFunctions';

const { width, height } = Dimensions.get('window');

export default class CustomActivityIndicator extends Component {

    constructor(props){
      super(props);
      this.state = {
        show: this.props.show       
      }
    }

    static getDerivedStateFromProps(nextProps, prevState) {

      let outObj = {};
      consoleLog('Login - nextProps.show - ' + nextProps.show + ' prevState.show - ' + prevState.show);    
      if(nextProps.show !== prevState.show) {
        return {
          show: nextProps.show
        };
    }
  }

    render() {
        consoleLog('CustomActivityIndicator - ' + this.state.show  );
      return (
        <View style={styles.container}>
         <ActivityIndicator
               animating = {this.state.show}
               color = {colors.primaryColor}
               size = "large"/>
      </View>
      );
    }
  }

const styles = StyleSheet.create ({
   container: {
      position: 'absolute',
      top: 0,
      left: 0,
      right: 0,
      bottom: 0,
      justifyContent: 'center',
      alignItems: 'center'
   }
})

我在Login中使用这只是为了演示

我最初在 Login 中将 show 状态设置为 false,当我单击 Login 按钮时,我想显示 ActivityIndicator

你能指导我哪里做错了吗?

Login.js

 class Login extends React.Component {

  constructor(props) {
    super(props);
    this.state = {
      show: false
   };
  }


  loginEndpointDecider = () => {
    this.setState({show: true})  ;
  }

 render() {
    return (            
      <ScrollView style={styles.mainContainer}>    
        <CustomActivityIndicator show={this.state.show}/>         
        <TouchableOpacity title='Transactions'
          style = {{ height: 60, backgroundColor: '#673fb4', marginTop: 20, alignItems: 'center', justifyContent: 'center' }}
          onPress={() => {          
            this.loginEndpointDecider();
          }}>
          <CommonText style={{ color: 'white'}}>
            {strings.signInLower}
          </CommonText>
        </TouchableOpacity>            
      </ScrollView>
    );
  }
}

谢谢 R

如何用花括号包裹 ActivityIndi​​cator 和 show 的状态值,如下所示:

{this.state.show && <CustomActivityIndicator />}

我认为在那种情况下您真的不需要表演道具。

与其将所有道具都放在实际组件本身中,不如在 "React mindset" 中更好的方法是能够有条件地呈现灵活的组件。这意味着在 Login.js 文件中,您可以使用状态在 render 方法中显示某些内容。

class Login extends React.Component {



constructor(props) {
    super(props);
    this.state = {
      show: false
   };
  }


  loginEndpointDecider = () => {
    this.setState({show: true})  ;
  }

 render() {
    return (            
      <ScrollView style={styles.mainContainer}>    
        {this.state.show ? <CustomActivityIndicator/> : "not shown"}       
        <TouchableOpacity title='Transactions'
          style = {{ height: 60, backgroundColor: '#673fb4', marginTop: 20, alignItems: 'center', justifyContent: 'center' }}
          onPress={() => {          
            this.loginEndpointDecider();
          }}>
          <CommonText style={{ color: 'white'}}>
            {strings.signInLower}
          </CommonText>
        </TouchableOpacity>            
      </ScrollView>
    );
  }
}

对于 if 语句,{this.state.show ? <CustomActivityIndicator/> : "not shown"} 是 shorthand。