Я пытаюсь использовать Reflux в своем приложении ReactJs.
У меня возникла проблема, когда компонент, прослушивающий хранилище данных, выполняет обратный вызов для пустого экземпляра компонента, а не для фактического компонента, который был создан.
При вызове действия toggleUserBar вызывается хранилище данных и выполняется триггер. В компоненте Боковая панель вызывается обратный вызов, но состояние компонента пустое:
Uncaught TypeError: не удается прочитать свойство «sd» неопределенного
Любая идея, что я делаю неправильно?
actions.tsx
var Reflux = require('reflux');
var RQ = {};
RQ.actions = Reflux.createActions([
"toggleUserBar"
]);
window.RQ = RQ;
store.tsx
RQ.store = Reflux.createStore({
listenables: [RQ.actions],
init: function() {},
onToggleUserBar: function() {
this.trigger();
}
});
сайдбар.tsx
import * as React from "react";
import * as ReactDOM from "react-dom";
const LeftNav = require('material-ui/lib/left-nav');
const Menu = require('material-ui/lib/menu/menu')
interface ISidebarProps extends React.Props<any> {
}
interface ISidebarState extends React.Props<any> {
shown: Boolean;
sd: any;
}
export class Sidebar extends React.Component<ISidebarProps, ISidebarState> {
unsubscribe: any;
constructor(props: ISidebarProps) {
super(props);
this.state = { shown: true, sd: null };
};
componentDidMount() {
this.unsubscribe = RQ.store.listen(function() {
this.state.sd.setState({ open: true });
});
};
componentWillUnmount() {
this.unsubscribe();
};
render() {
let menuItems = [
{ route: 'get-started', text: 'Get Started' },
{ route: 'customization', text: 'Customization' },
{ route: 'components', text: 'Components' }
];
return (
<LeftNav ref={(c) => this.state.sd = c} docked={false} openRight={true} menuItems={menuItems} />
);
};
}
Компонент боковой панели отображается в другом компоненте:
<ComSidebar ref={(c) => sdref = c} />
Если я вручную вызываю sdref.state.sd.open = true, все работает нормально.