Выполнение нескольких функций OnPress

Я пытаюсь выполнить функцию и перейти к следующему экрану, используя React-навигацию и создав сообщение Axios.

Я уже пытался объединить обе функции, но, похоже, он не выполняет функцию createOrder.

Если я запускаю функцию createOrder в одиночку, она работает

onPress = {
    () => {
        this.createOrder
        this.props.navigation.navigate('Cart', {
            order : this.state.order
        });
    }
}
 import React from 'react';
  import { 
    View,  
    StyleSheet, 
    Text,
    Image,
    TouchableOpacity
 } from 'react-native';
 //Redux
 import { connect } from 'react-redux';
 import { addItemToCart, removeItem } from '../../actions/ProductActionCreators';
//Products
 import Products from '../../components/products/Products';
 // Api Url
 import ApiUrl from '../../helpers/ApiUrl'
 //UI LIBRARY
 import { Input, Button } from 'react-native-elements';
 import {LinearGradient} from "../../components/LinearGradient";
 import { ButtonGroup } from 'react-native-elements';
 import Icon from "react-native-vector-icons/Ionicons";
 //AXIOS
 import axios from 'axios';

 export  class ProductsListView extends React.Component {
    constructor(props) {
        super(props);
        const { rows } = this.props.navigation.state.params;
        const arrays = Object.values( {rows});
        this.state = {
            arrays,
            filteredProducts: arrays,
            selectedIndex: 2
        };
        this.updateIndex = this.updateIndex.bind(this)
    }

  createOrder () {
    axios.post( ApiUrl + 'api/order/post', {
            code: "4f",
            status: "waiting",
            user_name: "salman", 
            user_id: 1,
            club_id: 1,
        })
    .then(response => {
      this.setState({
                order: response.data,
            });
            console.info('created order',this.state.order)
    })
    .catch(function (error) {
      console.info('error',error);
    })
  }

    updateIndex (selectedIndex) {
        this.setState({selectedIndex})
    }
    filterAll(){

    }
    filterStrong(){
        this.setState({
            arrays: this.state.arrays[0].products.filter(item => item.type == "strong" )
        })
        console.info(this.state.arrays)
    }
    filterNormal(){

    }
      render() {
        const component1 = () => <Icon
        name = "ios-star"
        size = {15}
        color = "gold"
        />
        const component2 = () => <Icon
        name = "ios-beer"
        size = {15}
        color = "gold"
        onPress = {() => this.filterStrong}
        />
        const component3 = () => <Icon
        name = "ios-wine"
        size = {15}
        color = "gold"

        />

        const buttons = [{ element: component1 }, { element: component2 }, { element: component3 }]
        const { selectedIndex } = this.state
        return (
            <View style = {styles.container} >
                <Image 
                    style = {styles.imageCard} 
                    source = {
                            { 
                                uri: 
                                this.state.arrays[0].image
                            }
                        }
                />
                <Text style = {styles.title} >
                    {this.state.arrays[0].name}
                </Text>


                <Products 
                    products = {this.state.arrays[0].products} 
                    addItemToCart = {this.props.addItemToCart} 
                    removeItem = {this.props.removeItem}
                />  
                <View style = {{
                    justifyContent:'center',
                    width: '100%',
                    padding: 50,
                    paddingTop:20,
                    }}>

                        <Button
                            title = "Go to my cart"
                            containerStyle = {{ flex: -1 }}
                            buttonStyle = {styles.signUpButton}
                            linearGradientProps = {{
                            colors: ['#dd016b', '#dd016b'],
                            start: [1, 0],
                            end: [0.2, 0],
                            }}
                            ViewComponent = {LinearGradient}
                            titleStyle = {styles.signUpButtonText}
                            // onPress = {this.createOrder}                                 

                            onPress = {
                                () => {
                                this.createOrder
                                this.props.navigation.navigate('Cart', {order : this.state.order});
                            }
                        }
                    />
                </View>
            </View>
        )
      }
    }
const mapDispatchToProps =  {
    addItemToCart,
    removeItem
}
export default connect(null, mapDispatchToProps) (ProductsListView);

const styles = StyleSheet.create({
    container: {
        flex: 1,
        alignItems: 'center',
        justifyContent: 'center',
        width:'100%',
        backgroundColor: 'black',
    },
    signUpButtonText: {
        // fontFamily: 'bold',
        fontSize: 13,
    },
    signUpButton: {
        width: 250,
        borderRadius: 50,
        height: 45,
    },
    title: {
        color:'white',
        fontSize:32,
        height: 100,
        position: 'relative',
        backgroundColor: '#00000054',
        width: "100%",
        textAlign: 'center',
        paddingTop: 30,

    },
    imageCard:{
        height:100,
        width:'100%',
        position: "absolute",
        top: 0,
        backgroundColor: 'white'
    },
    button: {
        padding: 5,
        borderRadius: 25,
        margin: 5,
        backgroundColor: '#DD016B', 
        color: 'white',
        alignItems: 'center',
        justifyContent: 'center',
    }, 
})

Я пытаюсь перейти к следующему экрану с данными, полученными из моего поста Axios.

возможно, это опечатка в сообщении, а может и нет > в коде this.createOrder отсутствуют скобки >> this.createOrder()

Ji aSH 03.06.2019 17:02
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
1
245
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не вызываете функцию createOrder.

Попробуй это:

<Button
    title = "Go to my cart"
    containerStyle = {{ flex: -1 }}
    buttonStyle = {styles.signUpButton}
    linearGradientProps = {{
        colors: ["#dd016b", "#dd016b"],
        start: [1, 0],
        end: [0.2, 0]
    }}
    ViewComponent = {LinearGradient}
    titleStyle = {styles.signUpButtonText}
    // onPress = {this.createOrder}

    onPress = {this.onGoToMyCartPressed} 
/>;  

И onGoToMyCartPressed будет выглядеть так:

onGoToMyCartPressed = () => {
    this.createOrder(); // <- Call the function
    this.props.navigation.navigate("Cart", { order: this.state.order });
};

И, если вы хотите перейти к после, заказ был создан, тогда пусть ваш createOrder вернет обещание, и вы можете отключить его в onGoToMyCartPressed

Вот так:

createOrder() {
    // Return the promise from here
    return axios.post( ApiUrl + 'api/order/post', {
        code: "4f",
        status: "waiting",
        user_name: "salman", 
        user_id: 1,
        club_id: 1,
    }).then(response => {
        this.setState({
            order: response.data,
        });
        console.info('created order',this.state.order)
    }).catch(function (error) {
        console.info('error',error);
    })
}

И измените onGoToMyCartPressed, чтобы использовать возвращенное обещание.

onGoToMyCartPressed = () => {
    // CHange the page once the order has been craeted
    this.createOrder().then(() => {
        this.props.navigation.navigate("Cart", { order: this.state.order });
    })
};

Спасибо, сработало .then(), похоже на функцию wait/async?

Salman 03.06.2019 19:13

Да, вы можете использовать async/await или .then() при работе с промисами.

Anand Undavia 04.06.2019 06:38

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