Я начал изучать React Native 4-5 дней назад, и теперь я создаю экран входа в React Native. Но столкнувшись с этой проблемой, я пытаюсь понять это, но, к сожалению, не смог. Ребята, пожалуйста, помогите мне? Прилагаю сюда свой код и скриншот.
App.js
import React, { Component} from 'react';
import { StyleSheet, Text, View } from 'react-native';
import Login from './src/screens/Login';
export default class App extends Component {
render() {
return (
<Login />
);
}
}
Вот код экрана входа в систему
Login.js
import React, { Component} from 'react';
import { StyleSheet, TextInput, View, Image, StatusBar, Dimensions } from 'react-native';
import { LinearGradient } from 'expo';
import EStyleSheet from 'react-native-extended-stylesheet';
import { Button } from '../components/Button';
import { Ionicons } from '@expo/vector-icons';
const {width: WIDTH} = Dimensions.get('window')
EStyleSheet.build();
export default class Login extends Component {
render() {
return (
<LinearGradient
colors = {['#38E870', '#2BB256']}
style = {styles.container}>
<StatusBar barStyle = "light-content" />
<View style = {styles.logocontainer}>
<Image source = {require('../images/Devastic.png/')} />
</View>
<View style = {styles.formContainer}>
<View style = {styles.inputcontainer}>
<Ionicons name = "ios-person-outline" size = {36} color = "#747475"
style = {styles.inputemail}/>
<TextInput
placeholder = {'Enter Your Email'}
underlineColorAndroid = {'transparent'}
placeholderTextColor = "#dfe6e9"
style = {styles.input}
/>
<Ionicons name = "ios-unlock-outline" size = {34} color = "#747475"
style = {styles.inputpass}/>
<TextInput
placeholder = {'Enter Your Password'}
secureTextEntry = {true}
underlineColorAndroid = {'transparent'}
placeholderTextColor = "#dfe6e9"
style = {styles.input}
/>
<Button
text = "Log In"
onPress = {() => console.info ("Pressed")}
/>
</View>
</View>
</LinearGradient>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
},
logocontainer: {
paddingTop: 50,
},
formContainer: {
backgroundColor: '#FFF',
marginTop: 180,
width: 360,
height: 340,
borderRadius: 10,
shadowColor: '#000',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.6,
shadowRadius: 6,
elevation: 8,
},
inputcontainer: {
marginTop: 30,
},
inputemail: {
position: 'absolute',
left: 18,
top: 13,
},
inputpass: {
position: 'absolute',
left: 18,
top: 77,
},
input: {
width: WIDTH -50 ,
height: 44,
padding: 10,
paddingLeft: 40,
marginVertical: 10,
marginHorizontal: 10,
borderWidth: 1,
borderRadius: 20,
borderColor: 'black',
marginBottom: 10,
}
});
вот код файла Button.js
import React from 'react';
import { View, TouchableHighlight, TouchableNativeFeedback, Text, Platform } from 'react-native';
import EStyleSheet from 'react-native-extended-stylesheet';
const styles = EStyleSheet.create({
$buttonColor: '#38E870',
$buttonTextColor: '#ffffff',
$buttonUnderlayColor: '#2BB256',
button: {
backgroundColor: '$buttonColor',
paddingVertical: 10,
paddingHorizontal: 30,
marginHorizontal: 12,
borderRadius: 40,
marginTop: 20,
},
text: {
color: '$buttonTextColor',
fontSize: 18,
textAlign: 'center',
fontWeight: 'bold',
},
});
export const Button = ({ text, onPress }) => {
if (Platform.OS === 'ios') {
return (
<TouchableHighlight
onPress = {onPress}
style = {styles.button}
underlayColor = {styles.$buttonUnderlayColor}
>
<Text style = {styles.text}>{text}</Text>
</TouchableHighlight>
);
}
return (
<TouchableNativeFeedback
onPress = {onPress}
background = {TouchableNativeFeedback.Ripple(styles.$buttonUnderlayColor)}
>
<View style = {styles.button}>
<Text style = {styles.text}>{text}</Text>
</View>
</TouchableNativeFeedback>
);
};
Да я вижу! Но в системе не работает. Можете попробовать в своей IDE?
файл находится в вашей системе, как я могу попробовать его на своей, вы убедитесь, что путь правильный?
Нашел проблему. На самом деле это было в том, что я не экспортирую должным образом в button.js. Поэтому я удалил экспорт из const и вставил внизу кнопку экспорта по умолчанию; И это сработало ?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я думаю, проблема в том, как вы экспортировали компонент Button.
export foo;
import {foo} from 'blah';
export default foo;
import foo from 'blah';
решение твоей проблемы
Замените это
export const Button = ({ text, onPress }) =>
с этим
export default const Button = ({ text, onPress }) =>
для более подробной информации проверьте это более детально
Спасибо! Это тоже сработало !! :-)
Если этот ответ решит проблему. будет лучше, если вы примете ответ.
Нет, это не сработало, когда я попробовал, выдает ту же ошибку, поэтому что делать по умолчанию для экспорта? Кнопка const Button = ({text, onPress}) = И это сработало ?
В вашем файле Login.js вы импортируете Button как объект.
Измените следующим образом:
Из
import { Button } from '../components/Button';
К
import Button from '../components/Button';
Для получения дополнительной информации, пожалуйста, посмотрите: Неперехваченная ошибка: инвариантное нарушение: недопустимый тип элемента: ожидается строка (для встроенных компонентов) или класс / функция, но получено: объект
Надеюсь, это поможет!
Сделал то же самое, что и вы, по-прежнему сталкиваетесь с той же ошибкой :-(
Это была моя проблема. Спасибо!
ваш код здесь работает нормально, snake.expo.io/ryZBZCMPQ проверьте оператор импорта кнопки в вашем Login.js, правильный ли путь?