简体   繁体   中英

Access Redux store in JavaScript function

Is it possible to map redux state to a regular javascript function rather than a React component?

If not, is there another way for connecting redux state to a function? (obviously without explicitly passing it in as a param)

I have tried connecting to a function, but it breaks (I don't have an exact error message. the server just hits an uncaughtException). Since React components can be pure functions, does connect() only work with a class ComponentName extends Component (and the likes)?

The reason I want to do such a thing:

I have an redux action generator, and I want the generator to skip doing an API call if it finds the action's result already in the redux state, but I don't want to have to check state explicitly from every container for every single api call. Does this make sense?

Thanks for any ideas.

connect() comes with react-redux package which is React bindings for Redux. But if you want to interact with Redux state with usual JavaScript you don't need either connect() or react-redux for that. You can directly interact with Redux store with its API .

As an example, if you want to listen to actions you can use subscribe() method as follows and use getState() method to access the state .

let unsubscribe = store.subscribe(function(){
  const state = store.getState();
})

I'm not much clear what you are trying to achieve, but I hope this will help.

Edit:

You can create your store in one file and export it.

store.js

import { createStore } from 'redux'
import reducers from "./reducers";

const store = createStore(reducers)

export default store;

Now you can import store from any other file and use it.

import store from "./store";

Suppose you have an action. Just add some marker - and the reducer will detect whether skip that or not:

Action:
{
  type: 'SOMETYPE',
  paylod: data,
  shouldSkip: true
}

Reducer:
export default function ( state = {}, action ) {
  if(action.shouldSkip)
    return state
  switch ( action.type ) {
    case "OTHER_TYPE":
      return action.payload;
    default:
      return state;
  }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM