【问题标题】:Accessing redux store inside functions访问函数内部的 redux 存储
【发布时间】:2016-12-23 12:07:54
【问题描述】:

我希望从 .js 文件中公开一个函数,在该函数中我希望能够访问存储中的变量。

代码片段:-

import { connect } from 'react-redux';

function log(logMessage) {
    const {environment} = this.props;
    console.debug('environment' + environment + logMessage ); 
    ....
}

function mapStateToProps(state) {
    return {
        environment : state.authReducer.environment
    };
}

export default function connect(mapStateToProps)(log);

我有很多组件,通过connect附加类,我可以通过connect()附加函数吗?

【问题讨论】:

    标签: reactjs redux react-redux


    【解决方案1】:

    访问 store 的正确位置是通过容器,connect 用于将容器连接到组件,您不能将随机函数连接到它。

    有一个 logger middleware 用于你可能不想看的 redux,它可以实现你想要实现的目标。

    要使用它,只需将它作为中间件传递给您的商店:

    import createLogger from 'redux-logger';
    
    const store = createStore(
      reducer,
      applyMiddleware(logger)
    );
    

    调试 redux 应用更合适的方法是使用React Dev Tools,如果你使用 Chrome,我建议你使用React Dev Tools Extension。只需install it 并将其用作中间件

    let store = createStore(reducer, window.devToolsExtension && window.devToolsExtension());
    

    有了它,您可以随时查看商店的整个状态,查看被触发的操作以及它们如何影响商店,甚至可以通过撤消操作来回退您的应用程序。

    【讨论】:

    • 嗨,Marco,是的,我正在使用 redux 记录器将操作/状态记录到 redux-storage。那不会达到目的。我想要实现的是对商店进行简单的功能访问,以便我可以在减速器中使用值。其中一种方法是直接将 store 导入 JS(反模式)。有没有办法将函数绑定到redux的connect()函数
    • @user2178209 不清楚您要实现什么,为什么需要在reducer 中使用存储值?当一个动作被触发时,reduce 已经获得了状态。
    • 我的意思是,我想从函数内部的存储(reducer)中访问值,并且该函数需要公开,以供各种组件使用。
    • Redux 不是这样工作的,来自 store 的值仅由容器传递给组件。
    • 还有那个容器,可以是函数还是必须是组件
    【解决方案2】:

    是的。您可以通过如下方式连接函数;

      const mapDispatchToProps = (dispatch) => {
         return {
           testFunction: (param1) => dispatch(testFunction(param1)),
           testFunction1: () => dispatch(testFunction1())
        };
     };
    
     export default function connect(mapStateToProps, mapDispatchToProps)(log);
    

    【讨论】:

    • JagKum,上面代码中的log()函数在哪里。比如我会把属于日志的代码放在哪里。
    【解决方案3】:

    编辑 1

    Some_File.js

    import store from './redux/store.js';
    
    function aFunction(){
       var newState =store.getState();
       console.log('state changed');
    }
    
    store.subscribe(aFunction)
    

    我假设你已经按照 redux 的预期创建了 store 和 reducer。

    ~~~~~~~~~~~~~~~

    原始答案开始

    这是一种 hack,我不知道你在做什么,所以我不能说你应该或不应该这样做,但你可以这样做。我已经复制粘贴了您的一些代码并进行了一些修改。

    Class XYZ extends React.Component{
         componentWillReceiveProps(props){
           //in your case this.props.storeCopy is redux state.
          //this function will be called every time state changes
         }
    
         render(){
            return null;
         }
    }
    
    
    
    function mapStateToProps(state) {
        return {
            storeCopy : state
        };
    }
    
    export default function connect(mapStateToProps)(XYZ);
    

    将此组件放在顶部某处,可能就在provider 内,每当状态更改时,此组件的componentWillReceiveProps 将被调用。

    【讨论】:

    • Praveen,这可能无法解决问题。这是在 react 中使用 redux 的标准方式。我正在寻找的是,而不是 XYZ 组件,将 xyz 作为一个函数,它将可以通过道具访问存储,并返回一些东西。 Marco cmets 是有道理的。
    • 据我了解,您正在寻找一个每次 redux-store 更改时都会调用的函数?而且我认为您的计划是然后将该 fn 导入组件并在 redux-store->Fn->Component 时更改组件。如果没有,那么至少在您的问题中编写一些伪代码,以便我们能够理解您正在尝试做什么并建议您如何做。谢谢。
    • Praveen,简而言之,一行问题陈述是“访问函数内部的 redux 存储”,即如何访问非反应组件的普通函数内部的 redux 存储
    • user2178209 我根据您的评论编辑了答案
    • 为了更详细地描述问题,我尝试的是捕获前端(SPA)中的用户操作,并将其报告给 splunk(大数据)进行业务分析。下面是如何实现的,在 action creator 中添加日志信息(当用户点击和 reducer 完成工作时),编写日志中间件,绑定到 redux,中间件使用 HEC 令牌调用 splunk-logging。 (基本上 90% 抽象的解决方案,极少的代码,复用代码来拯救环境)
    【解决方案4】:

    如果你有一个纯函数式组件,那么你可以像这样直接访问 redux 状态:

    import store from './redux/store';
    
    function getStoreDetails() {
       console.log(store.getState());
    }
    

    【讨论】:

      【解决方案5】:

      redux state 可以通过以下格式在函数中作为 prop 访问。

      1:

      import { connect } from 'react-redux';
      
      // log accepts logMessage as a prop
      function log(props) {
          const { environment, logMessage } = props;
          console.debug('environment' + environment + logMessage ); 
          ....
      }
      
      function mapStateToProps(state) {
          return {
              environment : state.authReducer.environment
          };
      }
      
      export default connect(mapStateToProps)(log);
      

      如何使用日志功能?

      log({ logMessage: "Error message" });
      

      2:

      // import redux store 
      import { store } from './Store';
      
      function log(logMessage) {
          const currentState = store.getState();
          const environment = currentState.authReducer.environment;
          console.debug('environment' + environment + logMessage); 
          ....
      }
      

      【讨论】:

      • connect 仅适用于反应组件(类或功能性组件)。它不适用于简单的功能
      猜你喜欢
      • 2017-10-12
      • 2023-02-11
      • 1970-01-01
      • 2019-11-10
      • 1970-01-01
      • 2019-02-11
      • 1970-01-01
      • 2018-04-07
      • 2016-12-25
      相关资源
      最近更新 更多