React Native: Действия должны быть простыми объектами. Используйте настраиваемое ПО промежуточного слоя для асинхронных операций

Я знаю, что это обычная проблема, и меня спрашивали много раз, но я прошел через все решения, но это не сработало.

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

Вот код, который я прилагаю.

Login.js (Просмотр)

import React, { Component } from 'react';
import { connect } from 'react-redux';
import { ScrollView, Text, TextInput, View, Button,StyleSheet,TouchableOpacity } from 'react-native';
import {loginRequest} from './../redux/actions/auth';
import {bindActionCreators} from 'redux';

class Login extends Component {
    constructor (props) {
        super(props);
        this.state = {
            username: '',
            password: ''
        };
    }

    userLogin (e) {
        this.props.actions.loginRequest(this.state.username, this.state.password);
    }

    render () {
        return (
            <ScrollView style = {{padding: 20,backgroundColor:'#ccc'}}>
                <View style = {styles.container}>

                    <View style = {{marginLeft:15}}>
                        <Text>Email</Text>
                    </View>

                    <TextInput 
                        style = {styles.input}
                        underlineColorAndroid = "transparent"
                        placeholder = "Enter username"
                        placeholderTextColor = "#9a73ef"
                        autoCapitalize = "none"
                        onChangeText = {(text) => this.setState({ username: text })}/>

                    <View style = {{marginLeft:15}}>
                        <Text>Password</Text>
                    </View>

                    <TextInput 
                        style = {styles.input}
                        underlineColorAndroid = "transparent"
                        placeholder = "Enter Password > 6 letters"
                        placeholderTextColor = "#9a73ef"
                        autoCapitalize = "none"
                        onChangeText = {(text) => this.setState({ password: text })}/>

                    <TouchableOpacity
                        style = {styles.submitButton}
                        onPress = {(e) => this.userLogin(e)}>
                        <Text style = {styles.submitButtonText}> Submit </Text>
                    </TouchableOpacity>

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

 const mapStateToProps = (state, ownProps) => {
     return {
         isLoggedIn: state.auth.isLoggedIn
     };
 }

function mapDispatchToProps(dispatch){
    return {
        actions : bindActionCreators({
            loginRequest
        },dispatch)
    };
}

export default connect(mapStateToProps, mapDispatchToProps)(Login);

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

export function loginRequest(username,password) {
    alert("TEst"); // this alert comes
    return function (dispatch) {
        alert(`........Tracker......`); // execution doesn't reach here ,this alert doesn't com 
        if (username == 'admin' && password == 'admin'){
            alert(`Login Success......`);
            dispatch({
                type : 'LOGIN_SUCCESS',
                msg  : 'Logged in successfully.'
            });
            resolve(true);
        } else {
            alert(`Login Failed......`);
            dispatch({
                type : 'LOGIN_FAIL',
                msg  : 'Please make sure you have entered valid credentials.'
            })
            reject(false);
        }
    };
}

Это мой authReducer.js

export default function reducer(state = {},action){
    if (action.type == 'LOGIN_SUCCESS'){
        alert('login success');
        return Object.assign({},state,{
            isLoggedIn:true
        })

    } else if (action.type == 'LOGIN_FAIL'){
        alert('login failed');
        return Object.assign({},state,{
            isLoggedIn:false
        })

    } else {
        return state;
    }
}

И точка входа

import React, { Component } from 'react';
import {
  Platform,
  StyleSheet,
  Text,
  View
} from 'react-native';
import {Provider} from 'react-redux';
import store from './redux';
import Application from './pages/Application';

export default class App extends Component{
  render() {
    return (
      <Provider store = {store}>
        <Application />
      </Provider>
    );
  }
}

Я не нашел решения, может ли кто-нибудь помочь?

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

Ответы 1

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

Поскольку вы возвращаете функцию из своих действий, вам необходимо использовать промежуточное программное обеспечение для обработки возвращаемых функций вместо объектов.

Я поклонник редукционный преобразователь, но существует множество других промежуточных программ redux для этой цели.

Вам нужно будет обновить свой магазин и настроить его для использования промежуточного программного обеспечения следующим образом:

import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import rootReducer from  './reducers';

export default(initialState) => {
    return createStore(rootReducer, initialState, applyMiddleware(thunk));
}

то я получаю сообщение об ошибке: store.getState не является функцией. (В 'store getState ()', 'store.getState' не определено)

ravi 09.04.2018 15:22

Я предполагаю, что в вашем файле store.js есть ошибка, поэтому он не может правильно экспортировать. Возможно, ваши редукторы не настроены так же, как у меня, поэтому замените import rootReducer from './reducers'; на те, которые у вас настроены. Вы также правильно установили redux-thunk? Либо с npm, либо с пряжей?

Stretch0 09.04.2018 15:26

привет, спасибо, я только что установил redux-thunk, и у меня точно такие же редукторы настройки, потому что я экспортирую rootReducer из файла редуктора после объединения редуктора auth. (сейчас у меня только один редуктор)

ravi 09.04.2018 15:30

Значит, он по-прежнему выдает ту же ошибку или работает после того, как вы установили redux-thunk?

Stretch0 09.04.2018 15:36

после установки redux-thunk и настройки хранилища, как показано выше, я получаю ошибку, указанную в первом комментарии

ravi 10.04.2018 07:02
var initialState = {}; let store = createStore(rootReducer,initialState,applyMiddleware(thunk))‌​; export default store; хорошо, теперь он работает после того, как я изменил ваш код вот так.
ravi 10.04.2018 07:11

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