2017-10-22 12 views
0

私は最初のプロジェクトとしてReact Nativeの簡単な電卓を構築しています。私はすべてが機能している。しかし、最後に数値なしの等号ボタンを押すと、「予期しないスクリプト終了」というエラーが発生しました。そこで、評価の前に最後の入力を確認する検証関数を追加しました。しかし、私はまだエラーメッセージが表示されます。ボタンプレスでスクリプトが予期せず終了する

最後の文字が数字でないときにログを試しても、それでもエラーが表示されます。私はそれが何であるか把握できません。何かご意見は? Googleの検索とStackOverflowのロットが私のために空になりました。コードとエラーは以下のとおりです。

ボタンのマイコード。

import React, { Component } from 'react'; 
import { Text, TouchableOpacity } from 'react-native'; 
import { connect } from 'react-redux'; 
import * as actions from '../actions'; 

class Button extends Component { 
    // Validate last character is number before evaluating expression 
    validateInput(data) { 
    let rawData = this.props.rawData; 
    let lastChar = rawData.substr(rawData.length - 1); 
    lastChar !== isNaN ? this.props.newResult(eval(rawData)) : console.log(lastChar); 
    } 

    handleLongPress(data) { 
    data === 'DEL' ? this.props.clearAll() : console.log('Not delete'); 
    } 

    handleOnPress(data) { 
    switch (data) { 
     case '=': 
     this.validateInput(data); 
     break; 
     case 'DEL': 
     this.props.removeInput(); 
     break; 
     default: 
     this.props.addInput(data); 
    } 
    } 

    render() { 
    let { value, parentStyles, childStyles, text, onLongPress } = this.props 
    return (
     <TouchableOpacity 
     onPress={() => this.handleOnPress(value)} 
     onLongPress={() => this.handleLongPress(value)} 
     style={parentStyles}> 
     <Text 
      style={childStyles} 
      >{text} 
     </Text> 
     </TouchableOpacity> 
    ); 
    } 
} 

const mapStateToProps = ({ rawData }) => ({ 
    rawData, 
}) 

export default connect(mapStateToProps, actions)(Button); 

エラーメッセージ:

Unexpected end of script 

validateInput 
    hashAssetFiles:100008:53 
handleOnPress 
    hashAssetFiles:100020:29 
onPress 
    hashAssetFiles:100045:40 
touchableHandlePress 
    hashAssetFiles:40117:45 
_performSideEffectsForTransition 
    hashAssetFiles:39731:34 
_receiveSignal 
    hashAssetFiles:39668:44 
touchableHandleResponderRelease 
    hashAssetFiles:39557:24 
invokeGuardedCallback 
    hashAssetFiles:35129:19 
invokeGuardedCallbackAndCatchFirstError 
    hashAssetFiles:35151:64 
executeDispatch 
    hashAssetFiles:35180:128 
executeDispatchesInOrder 
    hashAssetFiles:35188:48 
executeDispatchesAndRelease 
    hashAssetFiles:35254:58 
forEachAccumulated 
    hashAssetFiles:35248:37 
processEventQueue 
    hashAssetFiles:35323:143 
runEventQueueInBatch 
    hashAssetFiles:35612:79 
handleTopLevel 
    hashAssetFiles:35617:29 
<unknown> 
    hashAssetFiles:35749:51 
perform 
    hashAssetFiles:36164:99 
batchedUpdatesWithControlledComponents 
    hashAssetFiles:35697:30 
_receiveRootNodeIDEvent 
    hashAssetFiles:35748:46 
receiveTouches 
    hashAssetFiles:35763:173 
__callFunction 
    hashAssetFiles:6616:47 
<unknown> 
    hashAssetFiles:6432:29 
__guard 
    hashAssetFiles:6587:11 
callFunctionReturnFlushedQueue 
    hashAssetFiles:6431:20 

答えて

0

誰でも似たような経験しなければならない私は最終的に問題を考え出しました。基本的には脳力が弱い瞬間だった。 rawDataは文字列です。最後の文字が数字であるかどうかを評価することは、いつもひどく終わるだろう。代わりに、最後の文字が演算子を含む配列内にあるかどうかを確認することにしました。ここに私が行った変更があります。

// Validate last character is number before evaluating expression 
    validateInput(data) { 
    const operators = ['*', '/', '+', '-', '%'] 
    let rawData = this.props.rawData; 
    let lastChar = rawData.substr(rawData.length - 1); 
    if (operators.includes(lastChar)) { 
     return null; 
    } else { 
     this.props.newResult(eval(rawData)); 
    } 
    } 
関連する問題