我正在学习Redux的概念。 根据我的理解,减速器不应该改变状态,它们会返回一个应用了突变的新状态。他们也不应该(或者甚至不能)发出其他行动。
鉴于这些限制,您可以使用动作创建者,中间件或React组件(如果使用Redux和React)来调用业务逻辑。所以,我想要做的就是使用Firebase,我所遇到的墙,以及我的问题如下:
最后我最终关注了@ampersand的建议。我为Firebase应用程序的所有监听器制作了一个模块。我在Firebase模块中导入了一个dispatcher.js
文件,该文件由调度程序函数组成,如下所示:
import store from '../store';
import * as actions from './index';
export function addUserMessage(text) {
store.dispatch(actions.addUserMessage(text));
}
export function addResponseMessage(messageObj) {
store.dispatch(actions.addResponseMessage(messageObj));
}
我不理解的是如何从外部模块调度操作。现在我明确了这些概念。
答案 0 :(得分:1)
我对Firebase不熟悉,但我认为中间件很可能就是答案。
您可以编写一个可以访问Firebase实例的简单中间件,并将这些消息发送到Redux商店。
// firebase-middleware.js
export default function createFireBaseMiddleware (firebaseInstance) {
return store => dispatch => {
fireBaseinstance.on(message => {
dispatch({
type: 'FIREBASE_MESSAGE',
payload: message,
})
})
return action => {
if (action.type === 'TALK_BACK_TO_FIREBASE' {
firebaseInstance.postMessage(action)
}
// Let the action continue down the path of middleware to the store
return dispatch(action)
}
}
}
// createStore.js
export default createStore(
reducer,
applyMiddleware(createFireBaseMiddleware(myfirebaseInstance)
)
答案 1 :(得分:1)
要了解@ chautelly的响应,通常react / redux中的服务只是模块 - 在独立模块中创建firebase实例,从中导出适当的对象,并在需要时导入。
<强> database.js 强>
import firebase from 'firebase';
firebase.initializeApp({
apiKey: 'api key',
authDomain: 'db_name.firebaseio.com',
databaseURL: 'https://db_name.firebaseio.com/'
});
const database = firebase.database();
export default database;