Skip to content

Commit 0ede9b3

Browse files
committed
Refactored how store is passed to component tree
1 parent 30e12fc commit 0ede9b3

File tree

4 files changed

+34
-17
lines changed

4 files changed

+34
-17
lines changed

src/app.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import * as React from 'react';
1717
import * as ReactDOM from 'react-dom';
1818
// components imports
1919
import {Main} from './components/main';
20+
import {AppStore, UserData} from './stores/app-store';
2021

2122
const message = 'React / TypeScript / JSPM - Starter-Kit';
22-
export var appComponent: any = ReactDOM.render(<Main welcomeMessage={message} />, appContainer);
23+
const appStore = new AppStore(new UserData('Piotr', 32));
24+
export var appComponent: any = ReactDOM.render(<Main welcomeMessage={message} appStore={appStore} />, appContainer);

src/components/main.tsx

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,24 @@ import {UserProfile} from './user-profile';
88

99
interface LocalProps extends React.Props<Main> {
1010
welcomeMessage: string;
11+
appStore: AppStore;
1112
}
1213

1314
// App pure component
1415
export class Main extends React.Component<LocalProps, AppStore> {
15-
constructor() {
16-
super();
17-
this.state = new AppStore();
16+
17+
componentDidMount() {
18+
console.log('main mounted!');
1819
}
1920

2021
render() {
21-
const {userData} = this.state;
22-
return (<div className="main-component">
23-
<h2>{this.props.welcomeMessage}</h2>
24-
<UserProfile name={userData.name} age={userData.age} complete={userData.complete} />
25-
</div>
22+
const {userData} = this.props.appStore;
23+
return (
24+
<div className="main-component">
25+
<h2>{this.props.welcomeMessage}</h2>
26+
<UserProfile userData={userData} />
27+
<UserProfile userData={null} />
28+
</div>
2629
);
2730
}
2831
}

src/components/user-profile.tsx

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import './user-profile.css!';
33
// lib imports
44
import * as React from 'react';
5+
import {UserData} from '../stores/app-store';
56

67
enum Texts {
78
Complete,
@@ -18,23 +19,29 @@ function getTranslation(text: Texts) {
1819
}
1920

2021
interface LocalProps extends React.Props<UserProfile> {
21-
name: string;
22-
age: number;
23-
complete: boolean;
22+
userData: UserData;
2423
}
2524

2625
interface LocalState {
2726
complete?: boolean;
2827
}
2928

3029
export class UserProfile extends React.Component<LocalProps, LocalState> {
31-
constructor(props) {
30+
constructor(props: LocalProps) {
3231
super();
3332
this.state = {
34-
complete: props.complete
33+
complete: props.userData ? props.userData.complete : null
3534
};
3635
}
3736

37+
componentDidMount() {
38+
console.log('user-profile mounted!');
39+
}
40+
41+
componentDidUpdate() {
42+
console.log('user-profile updated!');
43+
}
44+
3845
getStatusText = () => {
3946
return (this.state.complete ? getTranslation(Texts.Complete) : getTranslation(Texts.Incomplete));
4047
};
@@ -44,7 +51,12 @@ export class UserProfile extends React.Component<LocalProps, LocalState> {
4451
};
4552

4653
render(): JSX.Element {
47-
const {name, age} = this.props;
54+
if (this.props.userData == null) {
55+
return <div className="user-profile-component">User profile data is empty.</div>;
56+
}
57+
58+
const {name, age} = this.props.userData;
59+
4860
return (
4961
<div className="user-profile-component">
5062
<div>{name} is {age} years old.</div>

src/stores/app-store.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ export class UserData {
1313
export class AppStore {
1414
userData: UserData;
1515

16-
constructor() {
17-
this.userData = new UserData('Piotr', 33);
16+
constructor(initialState?: UserData) {
17+
this.userData = initialState || null;
1818
}
1919

2020
}

0 commit comments

Comments
 (0)