【问题标题】:React Native Router flux action.key() doesn't workReact Native Router 通量 action.key() 不起作用
【发布时间】:2018-12-04 07:13:39
【问题描述】:

我正在 React Native 上构建一个项目,我是 React Native 的新手。但不幸的是 Actions.key() 不起作用。这是我的代码详细信息

App.js

import React, { Component } from 'react';
import { AsyncStorage, ActivityIndicator } from 'react-native';
import { Provider } from 'react-redux';
import { createStore, applyMiddleware } from 'redux';
import ReduxThunk from 'redux-thunk';
import { PersistGate } from 'redux-persist/integration/react'
import Spinner from './components/common/Spinner'; 
import reducers from './reducers';
import Router from './Router';
import { persistStore, persistReducer } from 'redux-persist'

class App extends Component {

  render() {
    renderLoading = () =>
{
 <Spinner size="large" />;  
}
    const persistConfig = {
      key: 'root2',
      storage: AsyncStorage  
    }
    const persistedReducer = persistReducer(persistConfig, reducers) 
    const store = createStore(persistedReducer, {}, applyMiddleware(ReduxThunk));
    const persistor = persistStore(store);
    return (

      <Provider store={store}>
      <PersistGate loading={null} persistor={persistor}>
        <Router />
        </PersistGate>
      </Provider>
    );
  }
}

export default App;


LoginForm.js



import React, { Component } from 'react';
import { Text } from 'react-native';
import { connect } from 'react-redux';
import { emailChanged, passwordChanged, loginUser, loginUserSuccess1 } from '../actions';
import { Card, CardSection, Input, Button, Spinner } from './common';
import { Actions } from 'react-native-router-flux';
import NameEnter from './NameEnter';
import Router from '../Router';

class LoginForm extends Component {
  componentDidMount()
  {

    console.log (this.props.userDetails); 
    if(this.props.userDetails != null) 
    {
    if (this.props.userDetails.success !== false) {
      console.log (this.props.userDetails.success);
      this.props.loginUserSuccess1(this.props.userDetails);    

    }   
  }     
    //Actions.screen1();   

  }
  onEmailChange(text) {

    this.props.emailChanged(text);
  }

  onPasswordChange(text) {
    this.props.passwordChanged(text);
  }

  onButtonPress() {
    const { email, password } = this.props;

    this.props.loginUser({ email, password });
  }

  renderButton() {
    // if (this.props.loading) {
    //   return <Spinner size="large" />;
    // }

    return (
      <Button onPress={this.onButtonPress.bind(this)}>
        Login
      </Button>
    );
  }


  render() {

    return (
      <Card>

        <CardSection>
          <Input
            label="Email"
            placeholder="email@gmail.com"
            onChangeText={this.onEmailChange.bind(this)}
            value={this.props.email}
          />
        </CardSection>

        <CardSection>
          <Input
            secureTextEntry
            label="Password"
            placeholder="password"
            onChangeText={this.onPasswordChange.bind(this)}
            value={this.props.password}
          />
        </CardSection>

        <Text style={styles.errorTextStyle}>
          {this.props.error}
        </Text>

        <CardSection>
          {this.renderButton()}
        </CardSection>
      </Card>
    );
  }
}

const styles = {
  errorTextStyle: {
    fontSize: 20,
    alignSelf: 'center',
    color: 'red'
  }
};

const mapStateToProps = ({ auth }) => {
  const { email, password, error, loading , userDetails } = auth;

  return { email, password, error, loading , userDetails };
};

export default connect(mapStateToProps, {
  emailChanged, passwordChanged, loginUser, loginUserSuccess1
})(LoginForm);

AuthActions.js

 import { Actions } from 'react-native-router-flux';
    import axios from 'react-native-axios';


    import {
      EMAIL_CHANGED,
      PASSWORD_CHANGED,
      LOGIN_USER_SUCCESS,
      LOGIN_USER_FAIL,
      LOGIN_USER,
      URL
    } from './types';

    export const emailChanged = (text) => {

      return {
        type: EMAIL_CHANGED,
        payload: text
      };

    };

    export const passwordChanged = (text) => {
      return {
        type: PASSWORD_CHANGED,
        payload: text
      };
    };

    export const loginUser = ({ email, password }) => {
      return (dispatch) => {
        dispatch({ type: LOGIN_USER });

      axios.post(URL + '/hostLogin', {
          email: email,
          password: password
        })
        .then((user) => {
          console.log(user.data);
          loginUserSuccess(dispatch, user);
        })
        .catch((error) => {
          loginUserFail(dispatch);
        });
        // firebase.auth().signInWithEmailAndPassword(email, password)
        //   .then(user => loginUserSuccess(dispatch, user))
        //   .catch((error) => {
        //     console.log(error);

        //     firebase.auth().createUserWithEmailAndPassword(email, password)
        //       .then(user => loginUserSuccess(dispatch, user))
        //       .catch(() => loginUserFail(dispatch));
        //   });
      };
    };

    const loginUserFail = (dispatch) => {
      dispatch({ type: LOGIN_USER_FAIL });
    };

    const loginUserSuccess = (dispatch, user) => {

      dispatch({
        type: LOGIN_USER_SUCCESS,
        payload: user.data
      });

      Actions.main();
    };
    export const loginUserSuccess1 = (user) => {
      console.log(1);
      return {
        type: 'Navigate',
        payload: 'Success'
      };


    };

AuthReducer.js

import {
  EMAIL_CHANGED,
  PASSWORD_CHANGED,
  LOGIN_USER_SUCCESS,
  LOGIN_USER_FAIL,
  LOGIN_USER
} from '../actions/types';
import { Actions } from 'react-native-router-flux';

const INITIAL_STATE = {
  email: '',
  password: '',
   userDetails: null,
  error: '',
  loading: false
};

export default (state = INITIAL_STATE, action) => {
  switch (action.type) {
    case EMAIL_CHANGED:
      return { ...state, email: action.payload };
    case PASSWORD_CHANGED:
      return { ...state, password: action.payload };
    case LOGIN_USER:
      return { ...state, loading: true, error: '' };
    case LOGIN_USER_SUCCESS:
    console.log(action.payload );
      return { ...state, userDetails: action.payload }; 
    case LOGIN_USER_FAIL:
      return { ...state, error: 'Authentication Failed.', password: '', loading: false };
      case 'Navigate':
      console.log(2);
      Actions.main();  
       default: 
      return state;
  }
}; 

这是 Router.js

import React from 'react';
import { Scene, Router, Actions } from 'react-native-router-flux';
import LoginForm from './components/LoginForm';
import NameEnter from './components/NameEnter';


const RouterComponent = () => {
  return (
    <Router>
    <Scene key="root" hideNavBar>
      <Scene key="auth" >
        <Scene key="login" component={LoginForm} title="Please Login" />
      </Scene>
      <Scene key="main">
        <Scene key="screen1" component={NameEnter} title="Please Enter Your Name " />
      </Scene>
      </Scene>
    </Router> 
  );
};

export default RouterComponent;

现在在 Authreducer.js 中,我使用 Actions.main() 导航到 main 。但这行不通。是不是路由器设置有问题。请帮忙

【问题讨论】:

    标签: android reactjs react-native react-redux react-router


    【解决方案1】:

    它不起作用,因为您将 react 本机命令与 redux 混合使用。我注意到的是,redux 总是在 react native 库等加载之前先加载,所以它不起作用,你必须将它们分开才能使它们工作。

    您可以通过返回 true 将它们分开(也可以从 redux 文件 switch 语句中删除 Actions.main()),您将从另一个文件(该文件将是反应原生组件)中读取此响应,您可以在其中使用 Actions.main( ) 然后它就会工作。

    【讨论】:

    • 实际上它也不能从任何 react Native 组件中工作
    • 您是否在 console.log 中获得 2,其他 Actions.something() 正在工作?尝试在路由器中更改这种语法:&lt;Router&gt; &lt;Stack key="root"&gt; &lt;Scene key="login" component={Login} title="Login"/&gt; &lt;Scene key="register" component={Register} title="Register"/&gt; &lt;Scene key="home" component={Home}/&gt; &lt;/Stack&gt; &lt;/Router&gt; 如果您创建此示例的 github 存储库,我可以更好地理解它
    • 是的,我在控制台日志中得到 2
    • Actions.something() 绝对应该在组件上工作,你犯了一些错误我无法弄清楚,除非我知道你在组件中使用 Actions.main() 的整个代码
    【解决方案2】:

    来自redux documentations

    “给定相同的参数,它 [reducers] 应该计算下一个状态并返回它。没有意外。没有副作用。没有 API 调用。没有突变。只是一个计算。”

    Reducer 应该始终保持纯净。这是一个在reducer 中执行路由 转换的反模式。

    除此之外:我在 react native 0.57.0react-native-router-flux v4 上遇到了同样的问题,即基于 React Navigation v2.x。除了 .key() 之外的所有方法都有效,所以我不得不降级回 rnrf 4.0.0-beta.32。这似乎不是一个错误,更有可能是由依赖版本不匹配引起的(例如 react & react-native)。我将深入研究这个问题,并希望找到一种使用新版本的方法。

    【讨论】:

    • 那么我是 npm 的新手,降级的 npm 命令是什么
    • npm install react-native-router-flux@4.0.0-beta.32 --save
    • 是的,我这样做仍然无法正常工作,我正在切换以响应本机导航
    猜你喜欢
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    相关资源
    最近更新 更多