如何使用 immutable.js 和 redux-actions 在 react native 中从 firestore 获取数据?
How to fetch data from firestore with immutable.js and redux-actions in react native?
我是 React Native 的初学者。如果您给我任何建议,那将很有帮助,我将不胜感激。
我正在尝试使用 react-native
、immutable.js
、react-redux
、redux-actions
从 firestore
获取数据,此代码也遵循 ducks structure
.
问题是我无法从 firestore
获取任何数据,因为来自 firestore
的数据是在 reducer 执行后出现的。
甚至,我不确定是否可以将 firestore
获取方法作为 createAction
的第二个参数。
这是我的代码。
shared/index.js
import firebase from 'firebase/app';
import 'firebase/firestore'
import 'firebase/storage'
const config = {
apiKey: "...",
authDomain: "...",
databaseURL: "...",
projectId: "...",
storageBucket: "...",
messagingSenderId: "..."
};
firebase.initializeApp(config);
const db = firebase.firestore();
const storage = firebase.storage();
export const getCategoryNames = () => {
return db.collection('categories').get();
}
store/modules/categoryImgList
import {createAction, handleActions} from 'redux-actions';
import { Map, List } from 'immutable';
// firestore
import * as db from '../../shared';
// Action types
const GET_NAME = 'categoryImgList/GET_NAME';
// action creator
export const getName = createAction(GET_NAME, () => {
db.getCategoryNames().then(data => {
const arr = [];
data.forEach(doc => {
console.log(doc.data().name);
arr.push(doc.data().name);
});
console.log('arr');
console.log(arr);
})
}); // none
const initialState = Map({
name: List()
});
// Reducer
export default handleActions({
[GET_NAME]: (state, { payload: name }) => {
console.log(state);
console.log({name});
const item = Map({ name });
return state.update('name', name => name.push(item));
}
}, initialState);
非常感谢!
我自己解决了这个问题。
我意识到我需要 redux-thunk
来获取异步数据。
我安装了 redux-thunk
并更改了一些代码如下。
import {handleActions} from 'redux-actions';
// firestore
import * as db from '../../shared';
// Action types
const GET_CATEGORY_NAME_PENDING = 'categoryImgList/GET_CATEGORY_NAME_PENDING';
const GET_CATEGORY_NAME_SUCCESS = 'categoryImgList/GET_CATEGORY_NAME_SUCCESS';
const GET_CATEGORY_NAME_FAILURE = 'categoryImgList/GET_CATEGORY_NAME_FAILURE';
// action creator
export const getName = () => async (dispatch) => {
dispatch({type: GET_CATEGORY_NAME_PENDING});
try {
const response = await db.getCategoryNames();
const arr = [];
response.docs.forEach(res => {
arr.push(res.id);
});
console.log(arr);
dispatch({type: GET_CATEGORY_NAME_SUCCESS, payload: arr});
return arr;
} catch (e) {
console.log(e);
dispatch({type: GET_CATEGORY_NAME_FAILURE, payload: e});
}
}
const initialState = {
fetching: false,
error: false,
name: []
};
// Reducer
export default handleActions({
[GET_CATEGORY_NAME_PENDING]: (state) => ({ ...state, fetching: true, error: false }),
[GET_CATEGORY_NAME_SUCCESS]: (state, action) => ({ ...state, fetching: false, name: action.payload }),
[GET_CATEGORY_NAME_FAILURE]: (state) => ({ ...state, fetching: false, error: true })
}, initialState);
我是 React Native 的初学者。如果您给我任何建议,那将很有帮助,我将不胜感激。
我正在尝试使用 react-native
、immutable.js
、react-redux
、redux-actions
从 firestore
获取数据,此代码也遵循 ducks structure
.
问题是我无法从 firestore
获取任何数据,因为来自 firestore
的数据是在 reducer 执行后出现的。
甚至,我不确定是否可以将 firestore
获取方法作为 createAction
的第二个参数。
这是我的代码。
shared/index.js
import firebase from 'firebase/app';
import 'firebase/firestore'
import 'firebase/storage'
const config = {
apiKey: "...",
authDomain: "...",
databaseURL: "...",
projectId: "...",
storageBucket: "...",
messagingSenderId: "..."
};
firebase.initializeApp(config);
const db = firebase.firestore();
const storage = firebase.storage();
export const getCategoryNames = () => {
return db.collection('categories').get();
}
store/modules/categoryImgList
import {createAction, handleActions} from 'redux-actions';
import { Map, List } from 'immutable';
// firestore
import * as db from '../../shared';
// Action types
const GET_NAME = 'categoryImgList/GET_NAME';
// action creator
export const getName = createAction(GET_NAME, () => {
db.getCategoryNames().then(data => {
const arr = [];
data.forEach(doc => {
console.log(doc.data().name);
arr.push(doc.data().name);
});
console.log('arr');
console.log(arr);
})
}); // none
const initialState = Map({
name: List()
});
// Reducer
export default handleActions({
[GET_NAME]: (state, { payload: name }) => {
console.log(state);
console.log({name});
const item = Map({ name });
return state.update('name', name => name.push(item));
}
}, initialState);
非常感谢!
我自己解决了这个问题。
我意识到我需要 redux-thunk
来获取异步数据。
我安装了 redux-thunk
并更改了一些代码如下。
import {handleActions} from 'redux-actions';
// firestore
import * as db from '../../shared';
// Action types
const GET_CATEGORY_NAME_PENDING = 'categoryImgList/GET_CATEGORY_NAME_PENDING';
const GET_CATEGORY_NAME_SUCCESS = 'categoryImgList/GET_CATEGORY_NAME_SUCCESS';
const GET_CATEGORY_NAME_FAILURE = 'categoryImgList/GET_CATEGORY_NAME_FAILURE';
// action creator
export const getName = () => async (dispatch) => {
dispatch({type: GET_CATEGORY_NAME_PENDING});
try {
const response = await db.getCategoryNames();
const arr = [];
response.docs.forEach(res => {
arr.push(res.id);
});
console.log(arr);
dispatch({type: GET_CATEGORY_NAME_SUCCESS, payload: arr});
return arr;
} catch (e) {
console.log(e);
dispatch({type: GET_CATEGORY_NAME_FAILURE, payload: e});
}
}
const initialState = {
fetching: false,
error: false,
name: []
};
// Reducer
export default handleActions({
[GET_CATEGORY_NAME_PENDING]: (state) => ({ ...state, fetching: true, error: false }),
[GET_CATEGORY_NAME_SUCCESS]: (state, action) => ({ ...state, fetching: false, name: action.payload }),
[GET_CATEGORY_NAME_FAILURE]: (state) => ({ ...state, fetching: false, error: true })
}, initialState);