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

Я пытаюсь разработать приложение, основанное на реакции. У меня большой опыт работы с Java и PHP, но что-то меня смущает в React-Native. По сути, я пытаюсь получить рабочую СТРАНИЦУ входа (только для практических упражнений), но я борюсь, когда пытаюсь передать значение из значения дочернего компонента (например, ввод пароля) в функцию родительского компонента (LoginForm). Вот конкретный код: [Ввод пароля]

import * as React from 'react';
import { View } from 'react-native';
import { HelperText, TextInput } from 'react-native-paper';

class PasswordInput extends React.Component {
    constructor(props){
        super(props);
        this.state  = {
            password:''
        };
    }
    getPassword() {
        return this.state.password;
    }

    login(){
        alert(this.state.password)
    }

    OnChangesValue(e){
        console.info(e.nativeEvent.text);
        this.setState({
            userName :e.nativeEvent.text,
        })
    }

    changePassword(e){
        console.info(e.nativeEvent.text);
        this.setState({
            password :e.nativeEvent.text,
        })
    }

    hasErrors(text){
        let result=true;
        if (text.length>10 || text.length==0){
            result=false;
        }
        return result;
    };

    render() {
        return (
            <View>
                <TextInput
                    ref = "pass"
                    name = "password"
                    onChange = {this.changePassword.bind(this)}
                    secureTextEntry = {true}
                    label = "Password"
                    left = {<TextInput.Icon name = "lock" onPress = {() => {
                    }}/>}
                />
                <HelperText type = "error" visible = {this.hasErrors(this.state.password)}>
                    Password too short!
                </HelperText>
            </View>
        );
    }
}

export default PasswordInput;

а вот компонент LoginForm:

import * as React from 'react';
import { Component, createRef } from "react";
import {View, StyleSheet} from 'react-native';
import {Button, Card, Title} from 'react-native-paper';
import EmailInput from './login_components/email_input';
import PasswordInput from './login_components/password_input';
import {useRef} from 'react/cjs/react.production.min';

class LoginForm extends React.Component {

  passwordInput = createRef();

  submitForm(){
      alert(this.passwordInput['password'].value);
  }

  render() {
      return (
          <Card style = {styles.detailRowContainer}>
              <Card.Title
                  title = "Signup!"
                  subtitle = "Inserisci i tuoi dati per eseguire il login"
              />
              <EmailInput/>
              <PasswordInput ref = {this.passwordInput}/>
              <Card.Actions>
                  <Button mode = "contained" type = "submit" style = {styles.loginButtonSection} onPress = {() => this.submitForm()}>
                      LOGIN
                  </Button>
              </Card.Actions>
          </Card>
      );
  }
}

const styles = StyleSheet.create({
    loginButtonSection: {
        width: '100%',
        height: '30%',
        justifyContent: 'center',
        alignItems: 'center'
    },
    detailRowContainer: {
        flex:1,
        flexDirection:'row',
        alignItems:'center',
        justifyContent:'center'
    },
});
export default LoginForm;

Моя цель (на данный момент) — понять, как получить значение PasswordInput в моем компоненте LoginForm, чтобы напечатать пароль в предупреждении (функция submitForm()).

Умерло ли Create-React-App?
Умерло ли Create-React-App?
В этом документальном фильме React.dev мы исследуем, мертв ли Create React App (CRA) и какое будущее ждет этот популярный фреймворк React.
Освоение React Native: Пошаговое руководство для начинающих
Освоение React Native: Пошаговое руководство для начинающих
React Native - это популярный фреймворк с открытым исходным кодом, используемый для разработки мобильных приложений. Он был разработан компанией...
В чем разница между react native и react ?
В чем разница между react native и react ?
React и React Native - два популярных фреймворка для создания пользовательских интерфейсов, но они предназначены для разных платформ. React - это...
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
Хуки React: что это такое и как их использовать
Хуки React: что это такое и как их использовать
Хуки React - это мощная функция библиотеки React, которая позволяет разработчикам использовать состояние и другие возможности React без написания...
0
0
674
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Возможно, было бы проще пойти в противоположном направлении и создать повторно используемый компонент, которому даются реквизиты для изменения его внешнего вида и функциональности:

Целевая страница:

// importing Input.tsx from folder: components
import Input from '../components/Input';

export default function LandingScreen() {
  // Hooks for email and password
  const [email, set_email] = useState<string>('');
  const [password, set_password] = useState<string>('');

return(
       <View>
            <Input
              placeholder = "Email"
              onChangeText = {(text) => set_email(text)}
              keyboardType = "email-address"
            />
            <Input
              placeholder = "Password"
              onChangeText = {(text) => set_password(text)}
              secureTextEntry = {true}
              keyboardType = "default"
            />
       </View>
)

и вот пример компонента ввода: (поэтому вместо передачи информации от дочернего элемента к родительскому у нас теперь есть многоразовый компонент, который принимает несколько реквизитов, определенных в его интерфейсе)

импортированный файл Input.tsx находится в папке: компоненты

import React, { FC } from 'react';
import { View, StyleSheet, useWindowDimensions } from 'react-native';
import { TextInput } from 'react-native-gesture-handler';

interface Props {
  placeholder: string;
  onChangeText: (text: string) => void;
  secureTextEntry?: boolean;
  keyboardType: any;
}

const Input: FC<Props> = (props) => {
  const { width } = useWindowDimensions();
  return (
    <View style = {styles.container}>
      <TextInput
        style = {[styles.input, { width: width * 0.8 }]}
        autoCapitalize = {'none'}
        placeholder = {props.placeholder}
        secureTextEntry = {props.secureTextEntry}
        onChangeText = {props.onChangeText}
        keyboardType = {props.keyboardType}
        placeholderTextColor = {'black'}
      />
    </View>
  );
};

export default Input;

const styles = StyleSheet.create({
  container: {
    alignSelf: 'center',
    backgroundColor: '#e3e3e3',
    borderRadius: 5,
    marginVertical: 10,
  },
  input: {
    padding: 15,
  },
});

отличный способ начать работу с экраном входа — это «formik» и «yup», которые позволяют быстро создавать поля ввода и проверять на стороне клиента с помощью крючков.

Другие вопросы по теме