我尝试将 React.createContext Api 注入 Thunk withExtraArgument 但不明白
I try to inject React.createContext Api into Thunk withExtraArgument but don't understand something
我是 React 学习的新手,现在我有了这个 Redux Thunk,我需要将这个 firebase
上下文注入。
FirebaseContext
上下文:
(它还创建了一个 withFirebase
,我将其与 Rect.Componets 一起使用。)
import React from 'react';
const FirebaseContext = React.createContext(null);
export const withFirebase = Component => props => (
<FirebaseContext.Consumer>{firebase => <Component {...props} firebase={firebase} />}</FirebaseContext.Consumer>
);
export default FirebaseContext;
这是 FirebaseContext.Provider 的分配方式:
import Firebase, { FirebaseContext } from './firebase';
import store from './redux/store';
ReactDOM.render(
<FirebaseContext.Provider value={new Firebase()}>
<Provider store={store}>
<App />
</Provider>
</FirebaseContext.Provider>,
document.getElementById('root'),
);
然后创建 Redux 存储,我将它注入到标准程序中:
thunk.withExtraArgument(FirebaseContext),
这是我的 Redux Thunk,当 运行 调用 Thunk 时,FirebaseContext
必须是 value={new Firebase()}
value
但不知道如何为此,我搜索了几个小时,还尝试使用 withFirebase
来包裹 Thunk,但 Thunk 不喜欢那样!
function doSomeWork() {
return (dispatch, FirebaseContext) => {
function work() {
const firebase = FirebaseContext; // HERE IS THE PROBLEM
const userRef = firebase.userDoc(firebase.auth.currentUser.uid);
dispatch(doSomeWorkStart());
.....
}
return work;
};
}
如何将 new Firebase()
的“值”传递到我的 Thunk 中?
编辑:
选项 1:
我认为与其尝试将 FirebaseContext 传递给你的 thunk,不如传递 Firebase 对象本身。您不能在 thunk 内部使用上下文,因此您需要将上下文值作为参数从组件传递给您的 thunk,或者在配置商店时简单地提供它。
import Firebase, { FirebaseContext } from './firebase';
import reducer from './redux/reducer';
const firebase = new Firebase();
const store = createStore(
reducer,
applyMiddleware(thunk.withExtraArgument(firebase)),
);
ReactDOM.render(
<FirebaseContext.Provider value={firebase}>
<Provider store={store}>
<App />
</Provider>
</FirebaseContext.Provider>,
document.getElementById('root')
);
此外,您还需要更正您的 thunk 中参数的顺序。 Redux-thunk 将按 dispatch, getState, firebase
的顺序调用您的函数。即使您没有使用 getState
,您也不能忽略它。它仍将作为参数传递给您的 thunk。
function doSomeWork() {
return (dispatch, getState, firebase) => {
function work() {
const userRef = firebase.userDoc(firebase.auth.currentUser.uid);
dispatch(doSomeWorkStart());
}
return work;
};
}
选项 2:
如前所述,另一种选择是访问组件内部的上下文,并将其作为参数传递给动作创建者。
function doSomeWork(firebase) {
return (dispatch, getState) => {
function work() {
const userRef = firebase.userDoc(firebase.auth.currentUser.uid);
dispatch(doSomeWorkStart());
}
return work;
};
}
function MyComponent(props) {
const dispatch = useDispatch();
const firebase = useContext(FirebaseContext);
useEffect(() => {
dispatch(doSomwWork(firebase))
},[])
return <></>;
}
不过,我认为第一个选项是你最好的选择。
我是 React 学习的新手,现在我有了这个 Redux Thunk,我需要将这个 firebase
上下文注入。
FirebaseContext
上下文:
(它还创建了一个 withFirebase
,我将其与 Rect.Componets 一起使用。)
import React from 'react';
const FirebaseContext = React.createContext(null);
export const withFirebase = Component => props => (
<FirebaseContext.Consumer>{firebase => <Component {...props} firebase={firebase} />}</FirebaseContext.Consumer>
);
export default FirebaseContext;
这是 FirebaseContext.Provider 的分配方式:
import Firebase, { FirebaseContext } from './firebase';
import store from './redux/store';
ReactDOM.render(
<FirebaseContext.Provider value={new Firebase()}>
<Provider store={store}>
<App />
</Provider>
</FirebaseContext.Provider>,
document.getElementById('root'),
);
然后创建 Redux 存储,我将它注入到标准程序中:
thunk.withExtraArgument(FirebaseContext),
这是我的 Redux Thunk,当 运行 调用 Thunk 时,FirebaseContext
必须是 value={new Firebase()}
value
但不知道如何为此,我搜索了几个小时,还尝试使用 withFirebase
来包裹 Thunk,但 Thunk 不喜欢那样!
function doSomeWork() {
return (dispatch, FirebaseContext) => {
function work() {
const firebase = FirebaseContext; // HERE IS THE PROBLEM
const userRef = firebase.userDoc(firebase.auth.currentUser.uid);
dispatch(doSomeWorkStart());
.....
}
return work;
};
}
如何将 new Firebase()
的“值”传递到我的 Thunk 中?
编辑:
选项 1:
我认为与其尝试将 FirebaseContext 传递给你的 thunk,不如传递 Firebase 对象本身。您不能在 thunk 内部使用上下文,因此您需要将上下文值作为参数从组件传递给您的 thunk,或者在配置商店时简单地提供它。
import Firebase, { FirebaseContext } from './firebase';
import reducer from './redux/reducer';
const firebase = new Firebase();
const store = createStore(
reducer,
applyMiddleware(thunk.withExtraArgument(firebase)),
);
ReactDOM.render(
<FirebaseContext.Provider value={firebase}>
<Provider store={store}>
<App />
</Provider>
</FirebaseContext.Provider>,
document.getElementById('root')
);
此外,您还需要更正您的 thunk 中参数的顺序。 Redux-thunk 将按 dispatch, getState, firebase
的顺序调用您的函数。即使您没有使用 getState
,您也不能忽略它。它仍将作为参数传递给您的 thunk。
function doSomeWork() {
return (dispatch, getState, firebase) => {
function work() {
const userRef = firebase.userDoc(firebase.auth.currentUser.uid);
dispatch(doSomeWorkStart());
}
return work;
};
}
选项 2:
如前所述,另一种选择是访问组件内部的上下文,并将其作为参数传递给动作创建者。
function doSomeWork(firebase) {
return (dispatch, getState) => {
function work() {
const userRef = firebase.userDoc(firebase.auth.currentUser.uid);
dispatch(doSomeWorkStart());
}
return work;
};
}
function MyComponent(props) {
const dispatch = useDispatch();
const firebase = useContext(FirebaseContext);
useEffect(() => {
dispatch(doSomwWork(firebase))
},[])
return <></>;
}
不过,我认为第一个选项是你最好的选择。