【发布时间】:2023-04-01 19:45:02
【问题描述】:
我遇到了 mobx 的问题。事实上,我有一个简单的聊天室,它使用我自己定义的 WebSocketService。虽然此服务抽象了与我的 API 的交换,但聊天本身处理消息的存储。
main.tsx(入口点)
import React from 'react';
import ReactDOM from 'react-dom';
import {App} from './app';
import {createBrowserHistory} from 'history';
import {createStores} from "app/stores";
import {Provider} from "mobx-react";
import {LoggedUserModel} from "app/models";
import {newUUID} from "app/utils/UUID";
// prepare MobX stores
const history = createBrowserHistory();
const rootStore = createStores(history, new LoggedUserModel(newUUID(), 'User'));
ReactDOM.render(
<Provider {...rootStore}>
<App history={history}/>
</Provider>,
document.getElementById('root')
);
index.tsx(应用)
import * as React from 'react';
import {Router, Route, Switch} from 'react-router';
import { hot } from 'react-hot-loader/root';
import { Chat } from "app/containers/Chat";
// render react DOM
export const App = hot(({history}) => {
return (
<Router history={history}>
<Switch>
<Route path="/" component={Chat}/>
</Switch>
</Router>
);
});
Chat.tsx
import * as React from 'react';
import style from './style.css'
import {RouteComponentProps} from 'react-router';
import ChatChannelMessagesList from "app/components/Chat/ChatChannelMessagesListComponent";
import ChatChannelInput from "app/components/Chat/ChatChannelInputComponent";
import {inject, observer} from "mobx-react";
import {STORE_LOGGED_USER, STORE_MESSAGES} from "app/constants";
import {LoggedUserStore, MessagesStore} from "app/stores";
import {newUUID} from "app/utils/UUID";
import {MessageModel} from "app/models";
import WebSocketService from "app/services/webSocketService";
export interface ChatProps extends RouteComponentProps<any> {
[STORE_LOGGED_USER]: LoggedUserStore;
[STORE_MESSAGES]: MessagesStore;
}
export interface ChatState {
WebSocketService: WebSocketService
}
@inject(STORE_LOGGED_USER, STORE_MESSAGES)
@observer
export class Chat extends React.Component<ChatProps, ChatState> {
constructor(props: ChatProps, context: any) {
super(props, context);
this.state = {
WebSocketService: new WebSocketService(event => {
// add the new message to state
this.onMessage(event)
})
}
}
componentDidMount() {
this.state.WebSocketService.connect(this.props[STORE_LOGGED_USER].getLoggedUser.id)
}
componentWillUnmount() {
this.state.WebSocketService.disconnect(this.props[STORE_LOGGED_USER].getLoggedUser.id)
}
addMessageToScreen(message: string) {
// add the new message to state
this.props[STORE_MESSAGES].addMessage(new MessageModel(newUUID(), message));
console.log(this.getMessages())
}
onMessage(event) {
console.log(event.data);
this.addMessageToScreen(event.data)
}
sendMessage(input: string) {
this.addMessageToScreen(input);
this.state.WebSocketService.message(this.props[STORE_LOGGED_USER].getLoggedUser.id, input)
}
getMessages() {
return this.props[STORE_MESSAGES].getMessages
}
render() {
return (
<div id={"chat"} className={style.container}>
<div className="rox">
<div className="row-offset-11 row-11 row-sm-11 row-md-11 row-lg-11 row-xl-11">
<ChatChannelMessagesList messages={this.getMessages()}/>
</div>
<div className="row-1 row-sm-1 row-md-1 row-lg-1 row-xl-1">
<ChatChannelInput onSendClicked={(input: string) => this.sendMessage(input)}/>
</div>
</div>
</div>
);
}
}
export default Chat
我没有错误,一切运行顺利,但更新不刷新屏幕,我不明白为什么..
messageStore
import { observable, computed, action } from 'mobx';
import { MessageModel } from 'app/models';
export class MessagesStore {
constructor(items: Array<MessageModel>) {
this.Messages = items;
}
@observable public Messages: Array<MessageModel>;
@computed
get getMessages() {
return this.Messages;
}
@action
addMessage = (item: MessageModel): void => {
this.Messages.push(item);
};
@action
setMessages = (items: Array<MessageModel>): void => {
this.Messages = items
};
@action
deleteMessage = (id: string): void => {
this.Messages = this.Messages.filter((Message) => Message.id !== id);
};
}
export default MessagesStore;
我想我已经把所有东西都放好了,请随时询问更多细节并感谢您的帮助!
免责声明:第一次使用 MobX
【问题讨论】:
标签: reactjs typescript mobx