【问题标题】:How to get the global state in an action creator in react-native and Redux?如何在 react-native 和 Redux 的动作创建者中获取全局状态?
【发布时间】:2017-03-04 08:04:02
【问题描述】:

我已经使用带有 rails 后端的 JWT 成功登录了我的用户。并使用 Redux 和 Redux-thunk 将 user 对象存储在我的 react-native 应用程序的全局存储中。

但是,我现在需要在我的其他操作中访问state.user.authentication_token,我需要在其中执行后端fetch 请求以获取具有适当标头的数据具有授权令牌。

这是我的 AssetList.js 组件:

import React, { Component } from 'react';
import { View, Text } from 'react-native';
import { connect } from 'react-redux';
import { fetchAssets } from '../actions';

class AssetsList extends Component {
  componentWillMount() {
    this.props.fetchAssets();
  }

  render() {
    return (
      <View>
        <Text>Asset name...</Text>
        <Text>Asset name...</Text>
        <Text>Asset name...</Text>
        <Text>Asset name...</Text>
        <Text>Asset name...</Text>
        <Text>Asset name...</Text>
      </View>
    );
  }
}

export default connect(null, { fetchAssets })(AssetsList);

这是我的动作文件,它调度动作:

/*global fetch:false*/
import { API_ENDPOINT } from './api';

export const fetchAssets = () => {
  return (dispatch) => {
    fetch(`${API_ENDPOINT}/assets`, {
      headers: {
        Accept: 'application/json',
        'Content-Type': 'application/json',
        'X-User-Token': 'ztUUQuxsnFKhYf8JMLKY', // I need access the user state here 
        'X-User-Email': 'somecoolemail@gmail.com' // AND HERE...
      }
    }).then(response => {
      dispatch({
        type: 'FETCH_SUCCESSFUL'
      });
      response.json().then(data => {
        console.log(data);
      }).catch(data => {
        console.log(data);
      });
    }).catch(error => {
      console.log(error);
    });
  };
};

我需要从状态访问用户对象,并将X-User-TokenX-User-Emailfetch 请求中的标头替换为用户对象存储在状态中的标头。但是,我无法在操作文件中访问我的状态。

我在这里缺少什么?如何全局访问其他文件中的状态?

【问题讨论】:

    标签: javascript reactjs react-native redux react-redux


    【解决方案1】:

    我有一段时间没有使用 redux,但这对于 thunk 来说听起来很完美。

    EDIT 1 - 重读您的问题,看来您已经是了。所以只需传入第二个参数,这将是函数getState

    export const fetchAssets = () => {
      return (dispatch, getState) => {
        const { user } = getState();
        // user.token == token
    
        // .. rest
      };
    }
    

    https://github.com/gaearon/redux-thunk http://redux.js.org/docs/advanced/AsyncActions.html

    编辑 2

    不是针对你的问题,我会在这里做一个很大的假设,但你的令牌实际上是状态的一部分 - 我的意思是应该是吗?除非应用程序对其进行更改,否则它需要成为您商店的一部分。不要落入认为一切都必须在 redux 存储中的常见陷阱。

    【讨论】:

    • 您先生...是我今天的英雄。 :) 关于您的编辑 2:如果我不将我的令牌保持在该状态,那么我将它保存在哪里?我应该把所有重要的位都保存在全局状态吗?还是我在这里遗漏了什么?
    • 不用担心 - 如果我的回答的主要部分有帮助,请随时接受它,以便未来的读者可以看到结果。关于edit2 - 它非常主观且依赖于应用程序,但配置项(不会更改)通常可以简单地作为普通的旧javascript对象导入。例如,如果您使用 laravel,它会将请求伪造令牌存储在 a head 元标记中 - 所以我构造了一个简单的 js 对象,读取所有配置项,然后将其导出,以便任何模块都可以导入和使用配置项
    • 有趣的是,我可以访问我的身份验证的其他状态部分,例如我的用户名和密码,但是,令牌未定义......哦,调试模式开启。
    • 如果您在阅读令牌时遇到困难,请随时链接到另一个问题
    • @Chris 关于edit2 - 我还将用户信息存储在不应该存储在那里的redux状态。现在我要把它改成简单的 js 对象。谢谢。
    猜你喜欢
    • 2021-11-23
    • 2018-09-02
    • 2016-06-10
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多