简体   繁体   English

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

[英]How can I Get value from first picker and populate second picker?

i have 2 functions one is to get the value from a REST api and populate a picker (This is a success, as it works fine) now the second picker is supposed to get value from the first picker and then call another REST api and then populate from another REST api, but this one is a proven difficulty.我有两个函数,一个是从 REST api 获取值并填充一个选择器(这是成功的,因为它工作正常)现在第二个选择器应该从第一个选择器获取值然后调用另一个 REST api 然后从另一个 REST api 填充,但这个已被证明是困难的。

How can i get the value from the first picker and use it to call another REST api which would inturn populate the second picker.我怎样才能从第一个选择器中获取值并使用它来调用另一个 REST api,这将反过来填充第二个选择器。

PS here is what i am trying to achieve, i select the country like this PS这是我想要达到的目标,我选择这样的国家

截图-1671955057.png

and it shows the corresponding banks in the country, but here it is not working this is what i have它显示了该国相应的银行,但在这里不起作用,这就是我所拥有的

截图-1671955072.png

My code is looking thus:我的代码是这样看的:

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',
  },
});

What must I do in this case?在这种情况下我必须做什么? its not returning anything to the second Picker它没有返回任何东西给第二个选择器

call getBanksByCountry function inside useEffect with selectedCountry as dependency (since you want to fetch the banks each time the country changes)selectedCountry作为依赖调用getBanksByCountry中的useEffect函数(因为你想在每次国家发生变化时获取银行)

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

After very intense struggle, i got it to work.经过非常激烈的斗争,我开始工作了。 So here is what i Did所以这就是我所做的

On the picker, i formally made it like so在选择器上,我正式是这样的

<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>

Next i made the getBanksByCountry(symbol) function to look like this接下来我使 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);
        });
    }
    
  };

Which in turn selects the country, so i just need to update my own REST api and have it communicate directly with the end servers and it gives me the required results:) Hopefully this would be useful for someone someday:)依次选择国家/地区,所以我只需要更新我自己的 REST api 并让它直接与终端服务器通信,它会为我提供所需的结果:) 希望有一天这对某人有用:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在 React Native 中隐藏 Picker 的第一个 Picker Item? - How can i hide first Picker Item of Picker in React Native? React Native:我如何获取 Picker 的值并将其添加到 Flatlist - React Native: how can i Get value of Picker and add it to Flatlist 如何根据选择器的当前值使用 react-native-picker 在页面上显示内容? - How can I use react-native-picker to display content on the page depending on the current value of the picker? 如何从 React Native Picker 获取值和标签名称? - How to get value and label name from React Native Picker? 如何让我的Picker在React Native中垂直对齐? - How can I get my Picker to vertically align in React Native? 如何从 react-native 中的 Picker onValueChange 获取 label - How can I get label from Picker onValueChange in react-native React Native - 从水平选择器中获取价值 - React Native - get value from horizontal picker 如何获取选择器标签和值并传递给函数 - How to get picker label and value and pass to a function 映射选择器项目时如何使用 Picker 更改选择器值? - How to make change on picker value with Picker when the picker items are mapped? 在 REACT NATIVE 中使用 EXPO 渲染组件后,如何根据来自选择器的值设置 state? - How can i set the state from a value coming from a picker rigth after the component render in REACT NATIVE with EXPO?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM