карта не является функцией функции и выбора в реагировать родной - PullRequest
0 голосов
/ 04 марта 2020

У меня проблема с картой моего массива о курьезах. так что, как вы видите, есть массив curriences со строками. Я использую Picker, чтобы выбрать что-то между ними, и у меня есть функция, которая включена в onValueChange prop в Picker, а затем возникает моя проблема с выбором предмета из Picker.

Сначала я могу выбрать любой предмет из палитры, но когда я хочу выбрать снова, у меня есть только один выбранный предмет в списке:

there is 1st step

, затем я выбрал например евро. Когда я хочу выбрать элемент снова, у меня есть только это:

there is 2nd step

Также, когда я меняю первый элемент выбора - он изменяется также во втором элементе выбора ... не знаю почему.

здесь также добавляется целый код:

import React, {Component} from 'react';
import {View, Text, TextInput, Picker} from 'react-native';
class CurrencyCashScreen extends React.Component {
  state = {
    currencies: ['USD', 'AUD', 'SGD', 'PHP', 'EUR'],
    base: 'PLN',
    amount: '',
    convertTo: 'EUR',
    result: '',
    date: '',
  };

  handleSelect = (itemValue, itemIndex) => {
    this.setState(
      {
        ...this.state,
        currencies: [itemValue],
        result: null,
      },
      this.calculate,
    );
  };

  handleInput = text => {
    this.setState(
      {
        ...this.state,
        amount: text,
        result: null,
        date: null,
      },
      this.calculate,
    );
  };

  calculate = () => {
    const amount = this.state.amount;
    if (amount === isNaN) {
      return;
    } else {
      fetch(`https://api.exchangeratesapi.io/latest?base=${this.state.base}`)
        .then(res => res.json())
        .then(data => {
          const date = data.date;
          const result = (data.rates[this.state.convertTo] * amount).toFixed(4);
          this.setState({
            ...this.state,
            result,
            date,
          });
        });
    }
  };

  handleSwap = e => {
    const base = this.state.base;
    const convertTo = this.state.convertTo;
    e.preventDefault();
    this.setState(
      {
        ...this.state,
        convertTo: base,
        base: convertTo,
        result: null,
      },
      this.calculate,
    );
  };
  render() {
    const {currencies, base, amount, convertTo, result} = this.state;
    return (
      <View>
        <Text>
          {amount} {base} is equevalent to
        </Text>
        <Text>
          {amount === '' ? '0' : result === null ? 'Calculating...' : result}{' '}
          {convertTo}
        </Text>
        <View>
          <View>
            <View>
              <TextInput
                keyboardType="numeric"
                value={amount}
                onChangeText={this.handleInput}
              />
              <Picker
                selectedValue={base}
                value={base}
                onValueChange={this.handleSelect}>
                {currencies.map((currency, index) => (
                  <Picker.Item label={currency} value={currency}>
                    {currency}
                  </Picker.Item>
                ))}
              </Picker>
            </View>
            <View>
              <TextInput
                editable={false}
                value={
                  amount === ''
                    ? '0'
                    : result === null
                    ? 'Calculating...'
                    : result
                }
              />
              <Picker
                selectedValue={convertTo}
                value={convertTo}
                onValueChange={this.handleSelect}>
                {currencies.map(currency => (
                  <Picker.Item label={currency} value={currency}>
                    {currency}
                  </Picker.Item>
                ))}
              </Picker>
            </View>
          </View>
          <View>
            <Text onClick={this.handleSwap}>CLICK ME</Text>
          </View>
        </View>
      </View>
    );
  }
}

export default CurrencyCashScreen;

Пожалуйста, помогите.

Ответы [ 3 ]

0 голосов
/ 04 марта 2020

Скорее всего currencies не является массивом. Вот что я порекомендовал:

  • Убедитесь, что вы должным образом деструктурировали свое состояние ранее в функции рендеринга, например const { currencies } = state; Любые опечатки здесь могут вызвать ошибку.
  • Убедитесь, что currencies установлено с нормальным значением по умолчанию. Если currencies не определено при первом монтировании компонента, вы получите эту ошибку.
  • Используйте console.log или отладчик для просмотра значения currencies. Если при вызове метода currencies.map это не массив (включая undefined), вы получите эту ошибку.
0 голосов
/ 05 марта 2020

См. Пример ниже

вам нужны две отдельные функции

import React, {Component} from 'react';
import {View, Text, TextInput, Picker} from 'react-native';

class CurrencyCashScreen extends Component {
 state = {
    currencies: ['USD', 'AUD', 'SGD', 'PHP', 'EUR'],
    base: 'PLN',
    convertTo: 'EUR',
    amount: '',
    result: '',
    date: '',
  };

 handleSelectPicker1 = itemValue => {
    this.setState(
      {
      base:itemValue
      },
    );
  };

  handleSelectPicker2 = itemValue => {
    this.setState(
      {
        convertTo:itemValue
      },
    );
  };

render() {
    const {currencies, base, amount, convertTo, result,pickerValue1,pickerValue2} =     this.state;
    console.log('this.state',pickerValue1,pickerValue2)
    return (
      <View style={{flex:1}}>
              <Picker
                selectedValue={base}
                //value={base}
                onValueChange={this.handleSelectPicker1}>
                {currencies.map((currency, index) => (
                  <Picker.Item label={currency} value={currency}/>
                ))}
              </Picker>

              <Picker
                selectedValue={convertTo}
                //value={convertTo}
                onValueChange={
                this.handleSelectPicker2
                }>
                {currencies.map(currency => (
                  <Picker.Item label={currency} value={currency}/>
                ))}
              </Picker>
          </View>
    );
  }

}

export default CurrencyCashScreen;

надеюсь, это поможет вам. Измените это согласно вашему требованию. Не стесняйтесь сомнений.

0 голосов
/ 04 марта 2020

Технически .map() требует выполнения массива для переменной.

Полагаю, itemValue - это не массив, который вы передаете handleSelect. Вот почему у вас есть эта ошибка. Я думаю, что если вы измените код для обработки currencies как массива, он должен работать.

handleSelect = itemValue => {
   this.setState(
      {
        ...this.state,
        currencies: [itemValue],
        result: null,
      },
      this.calculate,
   );
};

Надеюсь, это поможет!

...