Чтобы увеличить this.state.count, дважды нажмите кнопку onPress - React Native

первый вопрос!

У меня есть файл на Expo - https://snack.expo.io/@pssoor/Y3JhYm

У меня проблема в том, что если вы правильно ответите на вопрос умножения, мне придется снова нажать его, прежде чем аккумулятор заработает. Все остальное работает нормально.

Идея кода состоит в том, чтобы выбрать число из модального окна, которое составляет массив чисел до этого конкретного числа. Затем массив перемешивается. Составляется вопрос (? * Аккумулятор = сумма), на который пользователь отвечает.

Надеюсь, кто-то может помочь!

Спасибо Вот и вся закуска (извиняюсь за беспорядок!)

const arr = []

export default class NumberBonds extends React.Component {

constructor() {
    super()

    this.state = {
        accumulator: '',
        count: 0,
        number: '',
        total: '',
    }
}

// Modal Functions
setModalVisible(visible) {
    this.setState({ modalVisible: !visible })
}

renderArray(val) {
    for (let i = 1; i <= val; i++) { arr.push(i) } let i = 0; let j = 0; let temp = null; for (i = arr.length - 1; i > 0; i -= 1) { j = Math.floor(Math.random() * (i + 1)); temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }

    this.setModalVisible(!this.state.modalVisible)
    this.setState({
        accumulator: arr[this.state.count],
    })
    return arr
}

modalPassValue(value) {
    this.setState({
        total: this.state.total + value
    })
}

// Main Functions

customAlertCorrect() {
    Alert.alert(
        'Correct',
        'Well Done!',
        [
        {
                text: 'Next', 
                onPress: () => {this.setState(prevState => ({count: prevState.count + 1}))}
        }]
        )
}

customAlertDone() {
    Alert.alert('Fantastic', 'All Done!')
}

customAlertWrong() {
    Alert.alert('Not Quite', 'Try Again!')
}

check() {

    // If numbers matching, say correct. Move on. If not matching, say incorrect. Move on. If matching and then no more, STOP
    if (parseInt(this.state.number) + this.state.accumulator === parseInt(this.state.total)) {
        this.setState( {
            number: '',
            accumulator: arr[this.state.count]
        })

        this.customAlertCorrect()

    } else {
        this.customAlertWrong()
        this.setState({
            number: '',
        })
    }
    if (parseInt(this.state.count) === parseInt(this.state.total)) {
        this.customAlertDone()
    }
}


render() {
    return (
        <View style = {styles.container}>
            <View style = {{ marginTop: 100, marginLeft: 100 }}>
                <Modal animationType = "slide" transparent = {false} visible = {this.state.modalVisible}>
                    <View>
                        <View style = {{ marginTop: 50, }}>
                            <Text style = {{ fontSize: 50, fontFamily: 'hobostd', }}>Enter your Number Bond</Text>
                            <Text style = {{ fontSize: 50, backgroundColor: 'pink', height: 200, color: 'white' }}>{this.state.total}</Text>
                        </View>
                    </View>
                    <View style = {{ flex: 1, backgroundColor: 'white', flexDirection: 'row', flexWrap: 'wrap', justifyContent: 'center', alignItems: 'center' }}>
                        <View style = {{ backgroundColor: 'white', flexDirection: 'row', flexWrap: 'wrap', justifyContent: 'flex-start' }}>
                            <TouchableOpacity onPress = {() => this.modalPassValue(1)} style = {styles.buttons}><Text style = {styles.buttonsText}>1</Text></TouchableOpacity>
                            <TouchableOpacity onPress = {() => this.modalPassValue(2)} style = {styles.buttons}><Text style = {styles.buttonsText}>2</Text></TouchableOpacity>
                            <TouchableOpacity onPress = {() => this.modalPassValue(3)} style = {styles.buttons}><Text style = {styles.buttonsText}>3</Text></TouchableOpacity>
                            <TouchableOpacity onPress = {() => this.modalPassValue(4)} style = {styles.buttons}><Text style = {styles.buttonsText}>4</Text></TouchableOpacity>
                            <TouchableOpacity onPress = {() => this.modalPassValue(5)} style = {styles.buttons}><Text style = {styles.buttonsText}>5</Text></TouchableOpacity>
                            <TouchableOpacity onPress = {() => this.modalPassValue(6)} style = {styles.buttons}><Text style = {styles.buttonsText}>6</Text></TouchableOpacity>
                            <TouchableOpacity onPress = {() => this.modalPassValue(7)} style = {styles.buttons}><Text style = {styles.buttonsText}>7</Text></TouchableOpacity>
                            <TouchableOpacity onPress = {() => this.modalPassValue(8)} style = {styles.buttons}><Text style = {styles.buttonsText}>8</Text></TouchableOpacity>
                            <TouchableOpacity onPress = {() => this.modalPassValue(9)} style = {styles.buttons}><Text style = {styles.buttonsText}>9</Text></TouchableOpacity>
                            <TouchableOpacity onPress = {() => this.setState({ total: '' })} style = {styles.buttons}><Text style = {styles.buttonsText}>Del</Text></TouchableOpacity>
                            <TouchableOpacity onPress = {() => this.modalPassValue(0)} style = {styles.buttons}><Text style = {styles.buttonsText}>0</Text></TouchableOpacity>
                            <TouchableOpacity onPress = {() => this.renderArray(this.state.total)} style = {styles.buttons}><Text style = {styles.buttonsText}>Done</Text></TouchableOpacity>

                        </View>
                    </View>
                </Modal>
            </View>

            <View style = {{ marginBottom: 20 }}><Text style = {{ fontSize: 50, textAlign: 'center' }}>Accumulator: {this.state.accumulator}</Text></View>
            <View style = {{ marginBottom: 20, flexDirection: 'row', justifyContent: 'space-around' }}>
                <View style = {{ backgroundColor: 'red', height: 70, width: 100, borderRadius: 20, }}><Text style = {{ fontSize: 50, textAlign: 'center', }}>{this.state.accumulator}</Text></View>
                <Text style = {{ fontSize: 50, textAlign: 'center', height: 50, width: 40, }}>+</Text>
                <View style = {{ backgroundColor: 'yellow', height: 70, width: 100, borderRadius: 20, }}><Text style = {{ fontSize: 50, textAlign: 'center', }}>{this.state.number}</Text></View>
                <Text style = {{ fontSize: 50, textAlign: 'center', height: 50, width: 40, }}>=</Text>
                <View style = {{ backgroundColor: 'orange', height: 70, width: 100, borderRadius: 20, }}><Text style = {{ fontSize: 50, textAlign: 'center', }}>{this.state.total}</Text></View>
            </View>

            <View style = {{ flex: 1, backgroundColor: 'white', flexDirection: 'row', flexWrap: 'wrap', justifyContent: 'center', alignItems: 'center' }}>
                <View style = {{ backgroundColor: 'white', flexDirection: 'row', flexWrap: 'wrap', justifyContent: 'center' }}>
                    <TouchableOpacity onPress = {() => this.setState({ number: this.state.number + 1 })} style = {styles.buttons}><Text style = {styles.buttonsText}>1</Text></TouchableOpacity>
                    <TouchableOpacity onPress = {() => this.setState({ number: this.state.number + 2 })} style = {styles.buttons}><Text style = {styles.buttonsText}>2</Text></TouchableOpacity>
                    <TouchableOpacity onPress = {() => this.setState({ number: this.state.number + 3 })} style = {styles.buttons}><Text style = {styles.buttonsText}>3</Text></TouchableOpacity>
                    <TouchableOpacity onPress = {() => this.setState({ number: this.state.number + 4 })} style = {styles.buttons}><Text style = {styles.buttonsText}>4</Text></TouchableOpacity>
                    <TouchableOpacity onPress = {() => this.setState({ number: this.state.number + 5 })} style = {styles.buttons}><Text style = {styles.buttonsText}>5</Text></TouchableOpacity>
                    <TouchableOpacity onPress = {() => this.setState({ number: this.state.number + 6 })} style = {styles.buttons}><Text style = {styles.buttonsText}>6</Text></TouchableOpacity>
                    <TouchableOpacity onPress = {() => this.setState({ number: this.state.number + 7 })} style = {styles.buttons}><Text style = {styles.buttonsText}>7</Text></TouchableOpacity>
                    <TouchableOpacity onPress = {() => this.setState({ number: this.state.number + 8 })} style = {styles.buttons}><Text style = {styles.buttonsText}>8</Text></TouchableOpacity>
                    <TouchableOpacity onPress = {() => this.setState({ number: this.state.number + 9 })} style = {styles.buttons}><Text style = {styles.buttonsText}>9</Text></TouchableOpacity>
                    <TouchableOpacity onPress = {() => this.setState({ number: '' })} style = {styles.buttons}><Text style = {styles.buttonsText}>Del</Text></TouchableOpacity>
                    <TouchableOpacity onPress = {() => this.setState({ number: this.state.number + 0 })} style = {styles.buttons}><Text style = {styles.buttonsText}>0</Text></TouchableOpacity>
                    <TouchableOpacity onPress = {() => this.check()} style = {styles.buttons}><Text style = {styles.buttonsText}>Check</Text></TouchableOpacity>

                </View>
            </View>
        </View>
    );
  }
}

Кстати, я не мог исправить это с помощью методов setState (или средства обновления). Я пришел к выводу, что проблема в асинхронном характере состояния. Установил mobx и сразу заработало! Задача решена!

Pav Soor 12.11.2018 11:37
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
1
236
0

Другие вопросы по теме