Как передать состояние от дочернего к родительскому в функциональном компоненте React Native?

Я создал компонент выбора, чтобы получать данные из API и отображать их (ProductNames) в списке выбора, чтобы выбрать один из них. Затем я могу получить значение элемента средства выбора в виде идентификатора продукта. После этого я использую этот дочерний компонент в родительском компоненте, который указывает форму для отправки. Теперь я вижу средство выбора в родительском компоненте (форме) и могу выбрать один из них.

Моя основная цель - открыть поле ввода через сборщик. Итак, теперь мне нужно передать item.value (как состояние selectedValue) родительскому компоненту для отправки. Как я могу передать это дочернее состояние родительскому состоянию?

это мой дочерний компонент:

import React, {useEffect, useState} from 'react';
import {View, StyleSheet} from 'react-native';
import {Picker} from '@react-native-picker/picker';
import AsyncStorage from '@react-native-community/async-storage';


const ProductPicker = () => {
    const [selectedValue, setSelectedValue] = useState('');
    const [productDetails, setproductDetails] = useState([]);
console.info('selected value', selectedValue);
    useEffect(() => {
        getProductList();
    }, []);

    const getProductList = async () => {
        const token = await AsyncStorage.getItem('userToken');
        

        fetch('http://10.0.2.2:3000/customer/get-all-products', {

            method: 'post',
            headers: {
                'Content-Type': 'application/json',
                'Authentication': `Bearer ${token}`,
            },
        })
            .then((response) => response.json())
            .then((json) => setproductDetails(json.data))
            .catch((error) => console.error(error));

    };

    return (
        <View style = {styles.container}>
            <Picker
                selectedValue = {selectedValue}
                style = {{height: 40, width: 150}}
                onValueChange = {(itemValue, itemIndex) => {
                    setSelectedValue(itemValue);
                }}
            >

     

                {productDetails.map((item, index) => {
                    return (
                        <Picker.Item label = {item.productName} value = {item.productID} key = {index}/>);
                })}

            </Picker>

        </View>
    );
};

const styles = StyleSheet.create({
    container: {
        flex: 1,
        paddingTop: 40,
        alignItems: 'center',
    },
});

export default ProductPicker;

а это мой родительский компонент:

import * as React from 'react';
import {Button, View, Text, ScrollView, StyleSheet, Alert} from 'react-native';
import {Appbar} from 'react-native-paper';
import {TextInput, HelperText} from 'react-native-paper';
import {useEffect, useState} from 'react';
import AsyncStorage from '@react-native-community/async-storage';
import ProductPicker from './ProductPicker';


const ComplaintSubmission = ({navigation}) => {

    const [productID , setproductID] = useState('');
    const [description , setdescription] = useState('');
    const [token, setToken] = useState('');
    


    const saveToken = async () => {
        const token = await AsyncStorage.getItem('userToken');
        console.info('token from storage', token);
        setToken(token);
    }

    useEffect(() => {
        saveToken();
        fetch("http://10.0.2.2:3000/customer/lodge-complaint", {

            method: "post",
            headers: {
                'Content-Type': 'application/json',
                'Authentication': `Bearer ${token}`
            },
            body: JSON.stringify({

                description : description,
            })

        })

    }, []);


    const openAlert = () => {
        Alert.alert(
            "Complaint Successfully Submitted",
            "We review it as soon as possible. Thank you for reaching for us!",
            [{
                text: "OK",
                onPress : () => navigation.navigate("DashboardDrawer" ),

            }]


        );
    }

  return (
    <ScrollView>
      <Appbar.Header>
        <Appbar.BackAction onPress = {() => navigation.goBack()} />
        <Appbar.Content title = "Submit Complaint" />
        <Appbar.Action icon = "magnify" onPress = {() => navigation.openDrawer()} />
      </Appbar.Header>
      <Text>Plese Fill the following</Text>
      <View>
         

       <ProductPicker />

        <HelperText type = "info">
          Make sure select the correct Product
        </HelperText>
      </View>

      <TextInput
        style = {styles.PIDstyle}
        label = "Description"
        onChangeText = {(description) => setdescription(description)}
      />
      <View style = {{flex: 1, alignItems: 'center', justifyContent: 'center'}}>
        <Text>This is submittion</Text>
        <Button onPress = {() => openAlert()} title = "Submit Complaint" />
      </View>
    </ScrollView>
  );
};
export default ComplaintSubmission;
const styles = StyleSheet.create({
  PIDstyle: {
    marginTop: 30,
    marginLeft: 10,
    marginRight: 10,
  },
});
Умерло ли 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
1
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы не хотите передавать состояние от ребенка к родителю, вы хотите передать его от родителя к ребенку. Вам нужно поднять состояние на ComplaintSubmission и использовать реквизиты для управления ProductPicker.

В ComplaintSubmission вызовите ProductPicker с текущим productId и обратным вызовом для его обновления.

<ProductPicker productID = {productID} setproductID = {setproductID} />

Теперь у ProductPicker есть этот реквизит. Он должен использовать их вместо локального состояния selectedValue, которое теперь вы можете удалить.

const ProductPicker = ({productID, setproductID}) => {
<Picker
    selectedValue = {productID}
    style = {{height: 40, width: 150}}
    onValueChange = {(itemValue, itemIndex) => {
        setproductID(itemValue);
    }}
>

Большое спасибо Линде Пасте. Это действительно полезно. Ценю твой ответ!

Sanduni Fernando 04.04.2021 04:25

Можете ли вы подтвердить, что они не сомневаются в методе выборки. у меня это не работает. Я также добавил productId. но не прошел успешно.

Sanduni Fernando 04.04.2021 06:11

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