@connect
berfungsi dengan baik ketika saya mencoba mengakses toko dalam komponen reaksi. Tetapi bagaimana saya harus mengaksesnya dalam beberapa kode lainnya. Sebagai contoh: katakanlah saya ingin menggunakan token otorisasi untuk membuat contoh aksioma saya yang dapat digunakan secara global di aplikasi saya, apa cara terbaik untuk mencapainya?
Ini milik saya 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
Sekarang saya ingin mengakses titik data dari toko saya, di sini akan terlihat seperti apa jika saya mencoba mengambilnya dalam komponen reaksi menggunakan @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() {...}
}
Adakah wawasan atau pola alur kerja di luar sana?
reactjs
redux
react-redux
Subodh Pareek
sumber
sumber
api
dalamApp
kelas dan setelah mendapatkan token otorisasi yang dapat Anda lakukanapi.defaults.headers.common['Authorization'] = this.props.auth.tokens.authorization_token;
, dan pada saat yang sama Anda dapat menyimpannya di localStorage juga, jadi ketika pengguna me-refresh halaman, Anda dapat memeriksa apakah token ada di localStorage dan jika tidak, Anda dapat mengaturnya., Saya pikir akan lebih baik untuk mengatur token pada modul api segera setelah Anda mendapatkannya.Jawaban:
Ekspor toko dari modul yang Anda panggil
createStore
. Maka Anda yakin itu akan dibuat dan tidak akan mencemari ruang jendela global.MyStore.js
atau
MyClient.js
atau jika Anda menggunakan default
Untuk Berbagai Kasus Penggunaan Toko
Jika Anda membutuhkan beberapa instance toko, ekspor fungsi pabrik. Saya akan merekomendasikan membuatnya
async
(mengembalikan apromise
).Di klien (di
async
blok)sumber
store.getState()
Menemukan solusi. Jadi saya mengimpor toko di util api saya dan berlangganan di sana. Dan dalam fungsi pendengar itu saya menetapkan default global aksioma dengan token yang baru saya ambil.
Seperti inilah
api.js
penampilan baru saya :Mungkin bisa lebih ditingkatkan lagi, karena saat ini sepertinya agak tidak elok. Yang bisa saya lakukan nanti adalah menambahkan middleware ke toko saya dan mengatur token di sana-sini.
sumber
store.js
file Anda ?Anda dapat menggunakan
store
objek yang dikembalikan daricreateStore
fungsi (yang seharusnya sudah digunakan dalam kode Anda dalam inisialisasi aplikasi). Daripada Anda dapat menggunakan objek ini untuk mendapatkan keadaan saat ini denganstore.getState()
metode ataustore.subscribe(listener)
untuk berlangganan pembaruan toko.Anda bahkan dapat menyimpan objek ini ke
window
properti untuk mengaksesnya dari bagian mana pun dari aplikasi jika Anda benar-benar menginginkannya (window.store = store
)Info lebih lanjut dapat ditemukan di dokumentasi Redux .
sumber
store
kewindow
Sepertinya
Middleware
cara untuk pergi.Lihat dokumentasi resmi dan masalah ini di repo mereka
sumber
Seperti @sanchit yang diusulkan middleware adalah solusi yang bagus jika Anda sudah mendefinisikan instance aksioma Anda secara global.
Anda dapat membuat middleware seperti:
Dan gunakan seperti ini:
Ini akan mengatur token pada setiap tindakan tetapi Anda hanya bisa mendengarkan tindakan yang mengubah token misalnya.
sumber
Untuk TypeScript 2.0 akan terlihat seperti ini:
MyStore.ts
MyClient.tsx
sumber
Mungkin agak terlambat tetapi saya pikir cara terbaik adalah menggunakan
axios.interceptors
seperti di bawah ini. Impor url dapat berubah berdasarkan pengaturan proyek Anda.index.js
setupAxios.js
sumber
Melakukannya dengan kait. Saya mengalami masalah yang sama, tetapi saya menggunakan react-redux with hooks. Saya tidak ingin menambahkan kode antarmuka saya (yaitu, komponen reaksi) dengan banyak kode yang didedikasikan untuk mengambil / mengirim informasi dari / ke toko. Sebaliknya, saya ingin fungsi dengan nama generik untuk mengambil dan memperbarui data. Jalan saya adalah menempatkan aplikasi
ke dalam modul bernama
store.js
dan menambahkanexport
sebelumnyaconst
dan menambahkan impor reak-reduks yang biasa di store.js. mengajukan. Kemudian, saya mengimpor keindex.js
tingkat aplikasi, yang kemudian saya impor ke index.js denganimport {store} from "./store.js"
komponen anak biasa kemudian mengakses toko menggunakanuseSelector()
danuseDispatch()
kait.Untuk mengakses toko dalam kode ujung depan non-komponen, saya menggunakan impor analog (yaitu,
import {store} from "../../store.js"
) dan kemudian digunakanstore.getState()
danstore.dispatch({*action goes here*})
untuk menangani pengambilan dan pembaruan (eh, mengirim tindakan ke) toko.sumber
Cara mudah untuk memiliki akses ke token, adalah dengan meletakkan token di LocalStorage atau AsyncStorage dengan React Native.
Di bawah ini adalah contoh dengan proyek React Native
authReducer.js
dan
api.js
Untuk web, Anda bisa menggunakan
Window.localStorage
AsyncStoragesumber