@connect
funciona muy bien cuando intento acceder a la tienda dentro de un componente de reacción. Pero, ¿cómo debo acceder a él en algún otro bit de código? Por ejemplo: digamos que quiero usar un token de autorización para crear mi instancia de axios que pueda usarse globalmente en mi aplicación, ¿cuál sería la mejor manera de lograrlo?
Este es mi api.js
// tooling modules
import axios from 'axios'
// configuration
const api = axios.create()
api.defaults.baseURL = 'http://localhost:5001/api/v1'
api.defaults.headers.common['Authorization'] = 'AUTH_TOKEN' // need the token here
api.defaults.headers.post['Content-Type'] = 'application/json'
export default api
Ahora quiero acceder a un punto de datos desde mi tienda, así es como se vería si estuviera tratando de recuperarlo dentro de un componente de reacción usando @connect
// connect to store
@connect((store) => {
return {
auth: store.auth
}
})
export default class App extends Component {
componentWillMount() {
// this is how I would get it in my react component
console.log(this.props.auth.tokens.authorization_token)
}
render() {...}
}
¿Alguna idea o patrones de flujo de trabajo por ahí?
reactjs
redux
react-redux
Subodh Pareek
fuente
fuente
api
enApp
clase y después de obtener el token de autorización que puede hacerapi.defaults.headers.common['Authorization'] = this.props.auth.tokens.authorization_token;
, y al mismo tiempo también puede almacenarlo en localStorage, por lo que cuando el usuario actualice la página, puede verificar si el token existe en localStorage y si sí, puedes configurarlo. Creo que será mejor configurar el token en el módulo api tan pronto como lo obtengas.Respuestas:
Exporte la tienda desde el módulo al que llamó
createStore
. Entonces tiene la seguridad de que se creará y no contaminará el espacio de la ventana global.MyStore.js
o
MyClient.js
o si usaste por defecto
Para casos de uso de múltiples tiendas
Si necesita varias instancias de una tienda, exporte una función de fábrica. Recomendaría hacerlo
async
(devolviendo apromise
).En el cliente (en un
async
bloque)fuente
store.getState()
Encontró una solución. Así que importo la tienda en mi API y me suscribo allí. Y en esa función de escucha configuré los valores predeterminados globales de los axios con mi token recién obtenido.
Así es
api.js
como se ve mi nuevo :Tal vez se pueda mejorar aún más, porque actualmente parece un poco poco elegante. Lo que podría hacer más tarde es agregar un middleware a mi tienda y configurar el token allí mismo.
fuente
store.js
ve tu archivo?Puede usar el
store
objeto que se devuelve de lacreateStore
función (que ya debería usarse en su código en la inicialización de la aplicación). Entonces puede usar este objeto para obtener el estado actual con elstore.getState()
método ostore.subscribe(listener)
suscribirse para almacenar actualizaciones.Incluso puede guardar este objeto en la
window
propiedad para acceder a él desde cualquier parte de la aplicación si realmente lo desea (window.store = store
)Se puede encontrar más información en la documentación de Redux .
fuente
store
alwindow
Parece que
Middleware
es el camino a seguir.Consulte la documentación oficial y este problema en su repositorio
fuente
Como @sanchit, el middleware propuesto es una buena solución si ya está definiendo su instancia de axios a nivel mundial.
Puede crear un middleware como:
Y úsalo así:
Establecerá el token en cada acción, pero solo puede escuchar acciones que cambien el token, por ejemplo.
fuente
Para TypeScript 2.0 se vería así:
MyStore.ts
MyClient.tsx
fuente
Puede ser un poco tarde, pero creo que la mejor manera es usar
axios.interceptors
continuación. Las URL de importación pueden cambiar según la configuración de su proyecto.index.js
setupAxios.js
fuente
Haciéndolo con ganchos. Me encontré con un problema similar, pero estaba usando react-redux con ganchos. No quería acumular mi código de interfaz (es decir, componentes de reacción) con un montón de código dedicado a recuperar / enviar información desde / hacia la tienda. Más bien, quería funciones con nombres genéricos para recuperar y actualizar los datos. Mi camino era poner la aplicación de
en un módulo llamado
store.js
y agregandoexport
antesconst
y agregando las importaciones habituales de react-redux en store.js. expediente. Luego, importé aindex.js
nivel de aplicación, que luego importé a index.js con losimport {store} from "./store.js"
componentes secundarios habituales y luego accedí a la tienda usando eluseSelector()
useDispatch()
ganchos y .Para acceder a la tienda en código front-end que no es componente, utilicé la importación análoga (es decir,
import {store} from "../../store.js"
) y luego uséstore.getState()
ystore.dispatch({*action goes here*})
manejé la recuperación y actualización (er, enviando acciones a) la tienda.fuente
Una manera fácil de tener acceso al token es colocar el token en LocalStorage o AsyncStorage con React Native.
Debajo de un ejemplo con un proyecto React Native
authReducer.js
y
api.js
Para la web, puede usar en
Window.localStorage
lugar de AsyncStoragefuente