В реактивном, избыточном проекте Firebase у меня есть компонент-ящик, который подписывается на прослушиватель onSnapshot
, когда компонент монтируется, и при отключении он вызывает ссылку на снимок. этот компонент выглядит следующим образом:
import { onAccountChange } from '../actions/Agenda';
import {dispatch} from 'redux';
class DrawerContentComponent extends React.Component {
constructor (props) {
super(props);
}
componentDidMount(){
this.unsubscribeAccount = firebase.firestore().collection('users').doc(this.props.authUser.uid).onSnapshot((doc) => {
dispatch({type: types.LOAD_ACCOUNT, payload: doc.data()})
});
}
componentWillUnmount() {
this.unsubscribeAccount();
}
< ...rest of component... >
EDIT:
const mapStateToProps = ({ account, auth, inbox, agenda }) => {
const { role, profileImg, legalName, username, rating, phoneNumber } = account;
const { conversations } = inbox;
const { authUser } = auth;
const { events } = agenda;
return {
role,
profileImg,
legalName,
username,
rating,
phoneNumber,
authUser,
conversations,
events
};
};
const mapDispatchToProps = { logoutUser, onProfileChange, onAccountChange, getConversations, getAgenda };
export default connect(mapStateToProps, mapDispatchToProps)(DrawerContentComponent);
}
Редактировать: onAccountChange()
:
export const onAccountChange = (uid) => {
return (dispatch) => {
firebase.firestore().collection('users').doc(uid).onSnapshot((doc) => {
dispatch({ type: types.LOAD_ACCOUNT, payload: doc.data() });
});
};
};
Приведенные выше функции работают по мере необходимости, поскольку мне не удалось отписаться от действия, которое ранее был помещен во внешний каталог для действий.
Проблема: я хочу иметь возможность реализовать это, каким-то образом используя функцию, которая уже создана в файле действий (getAgenda()
), без необходимости переписывать код в компоненте, потому что в настоящее время я делаю это просто иметь возможность отписаться от слушателя на unmount, только так, как я думал, чтобы это работало.
в идеале, id хотел бы сделать что-то вроде этого:
componentDidMount() {
this.unsubscribeAgenda = this.props.getAgenda();
}
componentWillUnmount() {
this.unsubscribeAgenda();
}
Но вышеприведенное приводит к: TypeError: 'dispatch is not a function'
, если я удалю dispatch
импорт, ошибка будет ReferenceError: Cant find variable: dispatch
Мне, очевидно, нужно отправить изменения для onSnapshot
слушателя
Какие существуют стратегии для этого?