Woongjae Lee
NHN Dooray - Frontend Team
2woongjae@gmail.com
2018.01
~/Project/workshop-201801
➜ npx create-react-app mobx-state-tree-ts-quick-start --scripts-version=react-scripts-ts
~/Project/workshop-201801 took 1m 47s
➜ cd mobx-state-tree-ts-quick-start/
Project/workshop-201801/mobx-state-tree-ts-quick-start is 📦 v0.1.0 via ⬢ v8.9.4
➜ npm i mobx mobx-react mobx-state-tree -D
+ mobx-react@4.3.5
+ mobx-state-tree@1.3.1
+ mobx@3.4.1
added 4 packages in 14.335s
import { types, getRoot, destroy } from 'mobx-state-tree';
const User = types
.model({
name: types.string,
age: types.number
})
.actions(self => ({
remove() {
getRoot(self).removeTodo(self);
},
changeName(name: string) {
self.name = name;
},
plusAge() {
self.age = self.age + 1;
},
minusAge() {
self.age = self.age - 1;
}
}));
export type IUser = typeof User.Type;
const UserStore = types
.model({
users: types.array(User)
})
.views(self => ({
get allUsers() {
return self.users;
}
}));
export type IUserStore = typeof UserStore.Type;
UserStore.actions(self => ({
removeUser(user: IUser) {
destroy(user);
}
}));
export interface UserStoreType extends IUserStore {
addUser: (name: string) => void;
}
export default UserStore;
import * as React from 'react';
import * as ReactDOM from 'react-dom';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
import './index.css';
import UserStore from './models/users';
const store = UserStore.create({
users: [
{
name: 'Mark',
age: 36
}
]
});
ReactDOM.render(<App store={store} />, document.getElementById(
'root'
) as HTMLElement);
registerServiceWorker();
import * as React from 'react';
import './App.css';
import { IUserStore, IUser } from './models/users';
import autobind from 'autobind-decorator';
import { observer } from 'mobx-react';
const logo = require('./logo.svg');
interface AppProps {
store: IUserStore;
}
@observer
class App extends React.Component<AppProps, {}> {
render() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<h1 className="App-title">Welcome to React</h1>
</header>
<p className="App-intro">{JSON.stringify(this.props.store.allUsers)}</p>
<button onClick={this.click}>나이 먹어라</button>
</div>
);
}
@autobind
click() {
(this.props.store.users[0] as IUser).plusAge();
}
}
export default App;
By Woongjae Lee
코드버스킹 워크샵 - React with TypeScript 세번째 (2018년 1월 버전)