Предупреждение о причине повторного использования компонента: не удается обновить компонент из тела функции другого компонента

#reactjs #react-native

#reactjs #react-native

Вопрос:

Итак, я пытаюсь использовать повторно используемый компонент. Вот сценарий Button.js

 import React, {Component} from 'react';
import {TouchableOpacity, Text} from 'react-native';
import styles from '../components/styles';

class MyButton extends React.Component {
  constructor(props) {
    super(props);
    this.onPress = this.props.onPress;
    this.title = this.props.title;
  }
  render() {
    return (
      <TouchableOpacity
        onPress={this.onPress}
        style={styles.appButtonContainer_login}>
        <Text style={styles.appButtonText}>{this.title}</Text>
      </TouchableOpacity>
    );
  }
}

export default MyButton;
  

вот мой app.js

 const App = () => {
  setInterval(() => RNBootSplash.hide(), 1000);
  return <MainStackNavigator />;
};

export default App;
  

мой MainStackNavigator

 const Stack = createStackNavigator();
function MainStackNavigator() {
  return (
    <NavigationContainer>
      <Stack.Navigator>
        <Stack.Screen
          name="Home"
          options={{headerShown: false}}
          component={WelcomeScreen}
        />
        <Stack.Screen
          name="Login"
          options={{headerTitleAlign: 'center', headerLeft: null}}
          component={LoginScreen}
        />
        <Stack.Screen
          name="Register"
          options={{headerTitleAlign: 'center', headerLeft: null}}
          component={RegisterScreen}
        />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

export default MainStackNavigator;
  

и вот мой WelcomeScreen

 export default function WelcomeScreen({navigation}) {
  const handle_navigation = (name) => {
    navigation.navigate(name);
  };

  return (
    <View style={styles.container}>
      <View style={styles.header}>
        <Image
          style={styles.header_image}
          source={require('../assets/bootsplash_logo.png')}
        />
        <Text style={styles.headline}>Welcome</Text>
        <Text style={styles.subtitle}>Ini lagi belajar react native</Text>
      </View>

      <View style={styles.button_container}>
        <MyButton onPress={handle_navigation('Login')} title="Login" />
        <MyButton onPress={handle_navigation('Register')} title="Register" />
      </View>
    </View>
  );
}
  

когда я запускаю его, я получаю это сообщение об ошибке

Предупреждение: не удается обновить компонент из тела функции другого компонента.

когда я удаляю MyButton из WelcomeScreen , ошибки нет. Поэтому я думаю, что это одна из причин ошибки. Как я могу это исправить?

Ответ №1:

Для onPress поддержки MyButton / TouchableOpacity требуется передать ему функциональную переменную. Однако вы передаете результат вызова функции handle_navigation , который является недействительным.

Простое исправление — изменить handle_navigation , чтобы он возвращал функцию:

 const handle_navigation = (name) => {
  return () => navigation.navigate(name);
};
  

Вы также можете передать функцию со стрелкой непосредственно в onPress prop, что, по-моему, немного понятнее:

 <View style={styles.button_container}>
  <MyButton onPress={() => handle_navigation('Login')} title="Login" />
  <MyButton onPress={() => handle_navigation('Register')} title="Register" />
</View>
  

Ответ №2:

Вам нужно использовать функциональный компонент, а не компонент класса в MyButton, например

 import React, {Component} from 'react';
import {TouchableOpacity, Text} from 'react-native';
import styles from '../components/styles';

const MyButton = props => {
  return (
    <TouchableOpacity
      onPress={props.onPress}
      style={styles.appButtonContainer_login}
    >
      <Text style={styles.appButtonText}>{props.title}</Text>
    </TouchableOpacity>
  );
}

export default MyButton;
  

Может быть, это вам поможет.

и на экране приветствия

 <MyButton onPress={() => handle_navigation('Login')} title="Login" />
<MyButton onPress={() => handle_navigation('Register')} title="Register" />