React Native 如何从第一个选择器获取值并填充第二个选择器?

0pizxfdo  于 2022-12-27  发布在  React
关注(0)|答案(2)|浏览(131)

我有两个函数,一个是从REST API获取值并填充选取器(这是成功的,因为它工作正常),现在第二个选取器应该从第一个选取器获取值,然后调用另一个REST API,然后从另一个REST API填充,但这是一个已证明的困难。
我如何从第一个选择器中获取值,并使用它来调用另一个REST API,该API将依次填充第二个选择器。

    • PS**这是我想要达到的目标,我选择这样的国家

它显示了相应的银行在该国,但在这里它是不工作的这是我有

我的代码如下所示:

import {
  ImageBackground,
  Modal,
  ScrollView,
  StyleSheet,
  Text,
  TextInput,
  TouchableOpacity,
  View,
} from 'react-native';
import {Picker} from '@react-native-picker/picker';
import React, {useEffect, useState} from 'react';
import {useNavigation} from '@react-navigation/native';
import BackgroundOpacity from './BackgroundOpacity';

const InternationalPayments = () => {
  const navigation = useNavigation();
  const [getBanks, setGetBanks] = useState([]);
  const [getCountry, setGetCountry] = useState([]);
  const [bank_name, setBank_name] = useState('');
  const [country_name, setCountry_name] = useState('');
  const [country_symbol, setCountry_symbol] = useState('');
  const [bank_code, setBank_code] = useState('');
  const [selectedCountry, setSelectedCountry] = useState();
  const [selectedBank, setSelectedBank] = useState();
  const [modalVisible, setModalVisible] = useState(false);

  getBanksByCountry = (symbol) =>{
    fetch(`https://api.flutterwave.com/v3/banks/${symbol}`,{
      method:'GET',
      headers:{
        'Content-type': 'application/json',
        'Authorization': 'Bearer FLWSECK_TEST-72fe360edef17334f4817a17407011bb-X',
      },
    }).then(response = response.json())
      .then(responseJson =>{
        setGetBanks(responseJson.data);
        setBank_name(responseJson.data.name);
        setBank_code(responseJson.data.code);
      })
  }

  getallCountry = async () =>{
    fetch('https://webserver-migospay.onrender.com/api/location/get-country',{ //<=== This one is working fine, gets the countries without issues 
      method:'GET',
      headers:{
        'Content-type': 'application/json'
      },

    }).then(response => response.json())
      .then(responseJson=>{
        setGetCountry(responseJson.data);
        setCountry_name(responseJson.data.country_name);
        setCountry_symbol(responseJson.data.symbol);
        //getBanksByCountry(country_symbol); //<== first place i used it, did not work
      })
  }

  useEffect(()=>{
    getallCountry();
  })

  return (
    <View style={styles.container}>
      <BackgroundOpacity
        display={Platform.OS === 'ios' ? false : modalVisible}
      />
      <View style={styles.space} />
      <ScrollView
        contentContainerStyle={{
          justifyContent: 'space-between',
          alignItems: 'center',
        }}>
        <ImageBackground
          source={{
            uri: 'asset:/logo/bg.JPG',
          }}
          imageStyle={{borderRadius: 6}}
          style={{
            top: -30,
            paddingTop: 95,
            alignSelf: 'center',
            width: 328,
            height: 115,
            borderadius: 9,
            justifyContent: 'center',
            alignSelf: 'center',
            alignItems: 'center',
          }}>
          <View>
            <Text style={styles.accText}>Wallet Balance</Text>
            <Text style={styles.text}> 250,000 </Text>
          </View>
        </ImageBackground>

        <View
          style={{
            borderRadius: 5,
            borderWidth: 1,
            overflow: 'hidden',
            height: 53,
            padding: 0,
            borderColor: '#00BB23',
          }}>
          {
            <Picker
              style={{
                width: 300,
                height: 55,
                borderBottomWidth: 1,
              }}
              itemStyle={{
                fontSize: 25,
                fontFamily: 'Poppins-Medium',
              }}
              
              selectedValue={selectedCountry}
              onValueChange={(value, index) => setSelectedCountry(value)}
              >
              <Picker.Item label="Select Country" />
              {getCountry.map((country, index) => (
                <Picker.Item label={country.country_name} value={country.symbol} key={index} /> //<== country name works fine without problems
              ))}
            </Picker>
          }
        </View>
        
        <View style={styles.space}/>
        <View
          style={{
            borderRadius: 5,
            borderWidth: 1,
            overflow: 'hidden',
            height: 53,
            padding: 0,
            borderColor: '#00BB23',
          }}>
          {
            <Picker
              style={{
                width: 300,
                height: 55,
                borderBottomWidth: 1,
              }}
              itemStyle={{
                fontSize: 25,
                fontFamily: 'Poppins-Medium',
              }}
              selectedValue={selectedBank}
              onValueChange={(value, index) => setSelectedBank(value)}
              >
              <Picker.Item label="Select Bank" />
              {getBanks.map((bank, index) => (
                <Picker.Item label={bank.name} value={bank.code} key={index} /> //<== Does not return bank name here 
              ))}
            </Picker>
          }
        </View>
        
        <View style={styles.space2}/>
        <TextInput
          placeholder="Destination Account"
          onChangeText={creditAccount => this.setState({creditAccount})}
          style={styles.input}
        />

        <TextInput
          placeholder=" Amount"
          onChangeText={amount => this.setState({amount})}
          style={styles.input}
        />

        <TextInput
          placeholder=" Narration"
          onChangeText={description => this.setState({description})}
          style={styles.input}
        />

        <TextInput
          placeholder=" Destination Branch Code"
          onChangeText={description => this.setState({description})}
          style={styles.input}
        />

        <TextInput
          placeholder=" Beneficiary Name"
          onChangeText={description => this.setState({description})}
          style={styles.input}
        />

        <View
          style={{
            borderRadius: 5,
            borderWidth: 1,
            overflow: 'hidden',
            height: 35,
            padding: 0,
            top: 10,
            borderColor: '#00BB23',
          }}>
          {
            <Picker
              style={{
                width: 300,
                height: 53,
                borderBottomWidth: 1,
              }}
              itemStyle={{
                fontSize: 25,
                fontFamily: 'Poppins-Medium',
              }}>
              <Picker.Item label="Currency" value="accNum" />
              <Picker.Item label="NGN" value="NGN" />
            </Picker>
          }
        </View>

        <TouchableOpacity
          onPress={() => {
            setModalVisible(true);
          }}
          style={styles.button}>
          <Text style={styles.loginbtn}> Transfer </Text>
        </TouchableOpacity>
        <Modal
          hasBackdrop={true}
          backdropOpacity={0.2}
          backdropColor="black"
          transparent
          visible={modalVisible}
          onRequestClose={() => setModalVisible(false)}>
          <View style={styles.modal}>
            <Text>Hello From Modal</Text>
            <TouchableOpacity>
              <Text>Modal! Modal!</Text>
            </TouchableOpacity>
          </View>
        </Modal>
      </ScrollView>
    </View>
  );
};

export default InternationalPayments;

const styles = StyleSheet.create({
  container: {
    paddingTop: 40,
    flex: 1,
    flexDirection: 'row',
    justifyContent: 'space-between',
  },

  modal: {
    top: '50%',
    height: '50%',
    backgroundColor: '#fff',
  },
  accText: {
    top: -50,
    paddingTop: 10,
    justifyContent: 'center',
    alignItems: 'center',
    fontFamily: 'Poppins-Medium',
    fontSize: 12,
    color: 'white',
    textAlign: 'center',
  },
  text: {
    top: -50,
    fontSize: 20,
    color: 'white',
    textAlign: 'center',
    fontFamily: 'Poppins-Bold',
  },
  input: {
    top: 10,
    width: 300,
    height: 53,
    margin: 10,
    fontSize: 12,
    borderColor: '#00BB23',
    fontFamily: 'Poppins-Bold',
    borderRadius: 5,
    borderWidth: 1,
    marginBottom: 30,
  },

  button: {
    marginTop: 40,
    width: 150,
    height: 50,
    padding: 10,
    borderRadius: 10,
    backgroundColor: '#00BB23',
    alignItems: 'center',
  },

  Regbutton: {
    width: 150,
    height: 52,
    padding: 10,
    borderRadius: 10,
    backgroundColor: '#ffffff',
    alignItems: 'center',
    borderWidth: 2,
    borderColor: '#030303',
  },

  loginbtn: {
    color: '#ffff',
    fontSize: 15,
    fontFamily: 'Poppins-Medium',
  },

  AccountBalance: {
    fontSize: 13,
    fontWeight: 'bold',
    textAlign: 'left',
  },

  loginbtn2: {
    color: '#030303',
    fontSize: 20,
    fontWeight: 'bold',
  },

  logo: {
    width: 150,
    height: 150,
  },

  space: {
    top: 10,
    width: 10,
    height: 20,
  },

  space2: {
    width: 10,
    height: 10,
  },

  imageStyle: {
    flexDirection: 'row',
    justifyContent: 'center',
    padding: 5,
    margin: 2,
    height: 15,
    width: 15,
    resizeMode: 'stretch',
    marginBottom: 8,
    marginTop: 8,
    alignItems: 'center',
  },
});

在这种情况下我必须做什么?它不返回任何东西给第二个Picker

iaqfqrcu

iaqfqrcu1#

调用useEffect内部的getBanksByCountry函数,并将selectedCountry作为依赖项(因为您希望在每次国家/地区更改时获取银行)

useEffect(()=>{
  getBanksByCountry(selectedCountry.symbol)
},[selectedCountry])
slwdgvem

slwdgvem2#

经过非常激烈的斗争,我让它工作了。所以以下是我所做的
在采摘机上,我正式地把它做成这样,

<Picker
              style={{
                width: 300,
                height: 55,
                borderBottomWidth: 1,
              }}
              itemStyle={{
                fontSize: 25,
                fontFamily: 'Poppins-Medium',
              }}
              selectedValue={selectedCountry}
              onValueChange={(value, index) => [
                setSelectedCountry(value),
                getBanksByCountry(value), //<== I added the function to the picker vis Onchange since that is the function that handles the selection and all.
              ]}>
              <Picker.Item label="Select Country" />
              {getCountry.map((country, index) => (
                <Picker.Item
                  label={country.country_name}
                  value={country.symbol}
                  key={index}
                />
              ))}
            </Picker>

接下来,我将getBanksByCountry(symbol)函数设置为如下所示

getBanksByCountry = async (symbol) => {
    if (symbol === 'GH') {
      fetch('https://api.flutterwave.com/v3/banks/GH', {
        method: 'GET',
        headers: {
          'Content-type': 'application/json',
          'Authorization':
            'Bearer FLWSECK_TEST-72fe360edef17334f4817a17407011bb-X',
        },
      })
        .then(response => response.json())
        .then(async responseJson => {
          setGetBanks(responseJson.data);
          setBank_name(responseJson.data.name);
          setBank_code(responseJson.data.code);
        });

    }  if (symbol === 'UG') {
      fetch('https://api.flutterwave.com/v3/banks/UG', {
        method: 'GET',
        headers: {
          'Content-type': 'application/json',
          'Authorization':
            'Bearer FLWSECK_TEST-72fe360edef17334f4817a17407011bb-X',
        },
      })
        .then(response => response.json())
        .then(async responseJson => {
          setGetBanks(responseJson.data);
          setBank_name(responseJson.data.name);
          setBank_code(responseJson.data.code);
        });
    }
    if (symbol === 'ZA') {
      fetch('https://api.flutterwave.com/v3/banks/ZA', {
        method: 'GET',
        headers: {
          'Content-type': 'application/json',
          'Authorization':
            'Bearer FLWSECK_TEST-72fe360edef17334f4817a17407011bb-X',
        },
      })
        .then(response => response.json())
        .then(async responseJson => {
          setGetBanks(responseJson.data);
          setBank_name(responseJson.data.name);
          setBank_code(responseJson.data.code);
        });

    }  if (symbol === 'TZ') {
      fetch('https://api.flutterwave.com/v3/banks/TZ', {
        method: 'GET',
        headers: {
          'Content-type': 'application/json',
          'Authorization':
            'Bearer FLWSECK_TEST-72fe360edef17334f4817a17407011bb-X',
        },
      })
        .then(response => response.json())
        .then(async responseJson => {
          setGetBanks(responseJson.data);
          setBank_name(responseJson.data.name);
          setBank_code(responseJson.data.code);
        });
    }
    
  };

这反过来又选择了国家,所以我只需要更新我自己的REST API,让它直接与终端服务器通信,它就会给我所需的结果:)希望有一天这会对某人有用:)

相关问题