2017-12-03 14 views
1

DollarViewコンポーネントに小道具を送信したいのですが、不明な理由で失敗します。この問題をテストするために、私は(私はDollarViewコンポーネントでのコード行を使用:Alert.alert(this.props.dollarValue.toString());)DollarViewコンポーネントのdollarValueの小道具を表示するアラートを使用しますが、アプリの更新で、全アプリが停止し、私はこのエラーを取得する:React Nativeの子コンポーネントに小道具を送信できません

TypeError: undefined is not an object (evaluating '_this.props.dollarValue.toString')

これは私のコードです:

export default class App extends Component { 

    constructor(props) { 
    super(props); 
    this.updateDollar = this.updateDollar.bind(this); 
    this.state = { 
     value: 0, 
     date: 0, 
     isReady: 'need to update' 
    }; 
    } 

    componentWillMount() { 
    var savedData = (async function init() { 
     var value = await AsyncStorage.getItem('value'); 
     if (!value) { 
     value = 0; 
     } else { 
     value = parseInt(value); 
     } 
     var date = Date.parse(await AsyncStorage.getItem('date')); 
     return [value, date]; 
    }()); 
    this.setState({ 
     value: savedData[0], 
     date: savedData[1] 
    }); 
    } 

    updateDollar() { 
    this.setState({ 
     isReady: false 
    }); 
    axios.get('https://digiarz.com/webservice/api/') 
     .then(async (response) => { 
     var dollarRate = response.data.BTC.rates.USD.rate; 
     var tomanRate = response.data.BTC.rates.TMN.rate; 
     var dollar = Math.round(tomanRate/dollarRate) * 10; 
     var newDate = new Date(); 
     await AsyncStorage.setItem('value', dollar.toString()); 
     await AsyncStorage.setItem('date', newDate.toString()); 
     this.setState({ 
      value: dollar, 
      date: newDate, 
      isReady: true 
     }); 
     }) 
     .catch((error) => { 
     Alert.alert('خطا', 'خطا در دسترسی به اطلاعات. لطفا اتصال اینترنت خود را بررسی نمایید.'); 
     this.setState({ 
      isReady: 'failed' 
     }); 
     }); 
    } 

    render() { 
    var {value, date, isReady} = this.state; 
    return (
     <View style={styles.container}> 
     <DollarView isReady={isReady} dollarValue={value} date={date} /> 
     <DollarCalculator onUpdate={this.updateDollar} dollarValue={value} /> 
     </View> 
    ); 
    } 
} 

そしてDollarViewコンポーネント:

class DollarView extends Component { 

     constructor(props) { 
      super(props); 
      this.state = { 
       dollarValue: 0, 
       value: 0, 
       date: 0, 
       isReady: true 
      }; 
     } 

     componentWillReceiveProps(nextProps) { 
      var {dollarValue, value, date, isReady} = nextProps; 
      this.setState({ 
       dollarValue: dollarValue, 
       value: value, 
       date: date, 
       isReady: isReady 
      }); 
     } 

     render() { 
      var {dollarValue, date, isReady} = this.state; 
      if (isReady == 'failed') { 
       var indicator = <Text style={styles.failed}>{dollarValue}</Text>; 
      } else if (isReady) { 
       var indicator = <Text style={styles.success}>{dollarValue}</Text>; 
      } else { 
       var indicator = <ActivityIndicator size={75} color="#0000ff" />; 
      } 
      return (
       <View> 
        {indicator} 
       </View> 
      ); 
     } 
    } 

同じことをhappe DollarCalculatorコンポーネントもnsです。

+0

を? – yedidyak

+0

私はそれをコンストラクタを除いてほぼどこにでも置こうとしました。 –

答えて

0

コード内のasyncawaitのペアが意図したとおりに機能しませんでした。

saveDataは約束ですので、saveData[0]は定義されていません。そのため、エラーが発生しました。

あなたは代わりにこれを行うことができます:あなたがそのアラートを置けばいい

async componentWillMount() { 
    var value = await AsyncStorage.getItem('value'); 
    if (!value) { 
    value = 0; 
    } else { 
    value = parseInt(value); 
    } 
    var date = Date.parse(await AsyncStorage.getItem('date')); 
    this.setState({ 
    value, 
    date, 
    }); 
} 
+0

それは働いた。ありがとう。 –

+0

あなたは大歓迎です!喜んで助けた – Val

関連する問題