web-dev-qa-db-fra.com

Est-il possible de connecter une classe non composante au magasin redux?

J'utilise donc un passe-partout react-redux doté d'un assistant ApiClient. Cela ressemble à ceci:

export default class ApiClient {
  constructor(req) {
    /* eslint-disable no-return-assign */
    methods.forEach((method) =>
      this[method] = (path, withCredentials, { params, data } = {}) => new Promise((resolve, reject) => {

        const request = superagent[method](formatUrl(path))

        if (withCredentials) {
          console.log('first of all, its true')
          console.log(this)
        }

        if (params) {
          request.query(params)
        }

        if (__SERVER__ && req.get('cookie')) {
          request.set('cookie', req.get('cookie'))
        }

        if (data) {
          request.send(data)
        }

        request.end((err, { body } = {}) => {

          return err ? reject(body || err) : resolve(body)

        })
      }))
    /* eslint-enable no-return-assign */
  }
  /*
   * There's a V8 bug where, when using Babel, exporting classes with only
   * constructors sometimes fails. Until it's patched, this is a solution to
   * "ApiClient is not defined" from issue #14.
   * https://github.com/erikras/react-redux-universal-hot-example/issues/14
   *
   * Relevant Babel bug (but they claim it's V8): https://phabricator.babeljs.io/T2455
   *
   * Remove it at your own risk.
   */
  empty() {}
}

Je veux le connecter à mon authentification afin de pouvoir ajouter des en-têtes aux points de terminaison protégés, comme ceci:

@connect(state => ({ jwt: state.auth.jwt }))
export default class ApiClient {
  ...

Cependant, lorsque je fais cela, j'obtiens l'erreur: Cannot read property 'store' of undefined. Que se passe t-il ici? Pourquoi ne puis-je pas connecter une classe régulière au magasin redux?

pdate: voici ma fonction de connexion, qui utilise l'assistant ApiClient:

export function loginAndGetFullInto(email, password) {
  return dispatch => {
    return dispatch(login(email, password))
    .then(() => {
      return dispatch(loadUserWithAuth())
    })
  }
}

J'ai besoin d'un moyen de passer soit le magasin, soit le jwt, dans la fonction loadUserWithAuth ...

15
j_d

La fonction connect ne fonctionnera pas avec autre chose que React composants. Ce que vous pouvez faire est de passer votre instance de magasin à votre classe et d'appeler store.dispatch, store.getState, et store.subscribe directement.

Gardez à l'esprit que si vous vous abonnez, vous devez également avoir des fonctionnalités pour vous désabonner, sinon votre magasin contiendra une référence à votre instance de classe pour toujours, créant une fuite de mémoire.

20
Jim Bolla