Redux + React + FireBase:更新时如何使用状态

IT技术 javascript reactjs firebase firebase-realtime-database redux
2021-05-15 15:28:18

你好男孩和女孩:)

我从 Firebase && Redux 开始,我在公式中的回调on函数遇到了一些问题firebase.database().ref()

function getAll() {

    const uid = JSON.parse(localStorage.getItem('user'))
        .uid;


    const dbRef = firebase.database()
        .ref().child('events');

    const userRef = dbRef.child(uid);

    let answer = [];

    userRef.on('value', snap => {
        let rx = snap.val();
        for (let item in snap.val()) {
            answer.push(rx[ item ]);
        }
    });

    return Promise.resolve({
        events: answer
    });
}

我在做什么?

我在调用此服务的一些操作(触发器)之前创建了此方法,并且必须在结果与store.

这是预期的结果。但是,...

我的真实情况是什么?

  • 该方法及时触发,好新:-)但是
  • callback(因为它是)触发一些秒后(11.5s),而redux本身,非常快的单元,火灾和使react呈现在同一时间。简而言之,在 firebase 回调返回一个值之前,组件被渲染了很多次。

在最后,我需要渲染,重新加载页面,更改到应用程序的另一个路由,以便可以将保存的更改应用于渲染。

因为我是从reduxfirebase开始的,所以我不确定100%(但只是70%)确定这些推论,但它们是我在这种情况下可以找到的更好的。

那是什么情况?

我现在渴望任何帮助,感谢您为我提供的任何帮助:)

1个回答

嗨,伙计,我今年 1 月开始使用 Firebase 做了一个完整的项目,我知道寻找信息的困难。

您的问题的答案是您需要使用传奇。

https://github.com/redux-saga/redux-saga

Sagas 是一种同步 API 调用的方法,因此它们会在您的 reducer 分派动作之前被调用,并使控制同步 API 调用成为可能。

例如,

function* addAnswer{
    const user = yield call(Api.addAnswer, action.payload.userId); 
    yield put({type: "REQUEST_USER_ANSWER_SUCCEEDED", user: user});
}

Sagas 将在继续之前等待调用以 yield 结束。然后将此函数绑定到一个动作。

function* mySaga() {
    yield takeEvery("REQUEST_USER_ANSWER", fetchUser);
}

然后您将 redux-saga 中间件添加到您的商店

const sagaMiddleware = createSagaMiddleware() // mount it on the Store const store = createStore( reducer, applyMiddleware(sagaMiddleware) )

基本上,这里发生的事情是每次你回答你想要绑定到传奇动作 REQUEST_USER_ANSWER 时,如果成功触发 REQUEST_USER_ANSWER_SUCCEEDED 你希望你的减速器也被绑定。这样你就知道只有在 API 调用完成并成功时才会触发减速器。

人们要么在他们的项目中使用 Saga 或 Thunk,它们提供相同的工作,但您绝对需要其中之一。