forked from vasanthk/react-bits
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path01.class-organization.jsx
139 lines (115 loc) · 2.83 KB
/
01.class-organization.jsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/**
* The class definition for can be organized as follows:
*
* class definition
* constructor
* event-handlers
* component life-cycle events
* getters
* setters
* defaultProps
* propTypes
*
* @Reference:
* https://github.com/planningcenter/react-patterns#component-organization
*/
class Car extends React.Component {
constructor(props) {
super(props);
this.state = {running: false};
this.handleClick = () => {
this.setState({running: !this.state.running});
};
}
componentWillMount() {
// add event listeners (Flux Store, WebSocket, document, etc.)
}
componentDidMount() {
// React.findDOMNode()
}
componentWillUnmount() {
// remove event listeners (WebSocket, document, etc.)
}
get engineStatus() {
return (this.state.running) ? "is running" : "is off";
}
render() {
return (
<div onClick={this.handleClick}>
{this.props.make} {this.engineStatus}
</div>
);
}
}
Car.defaultProps = {
make: 'Toyota'
};
Car.propTypes = {
make: React.PropTypes.string
};
/**
* Initializing state - You can do it without the constructor too.
*/
class ProfileContainer extends Component {
state = {activeProfile: true};
render() {
return (
<div>
Is Profile Active: {this.state.activeProfile}
</div>
);
}
}
/**
* propTypes and defaultProps
*
* propTypes and defaultProps can be declared as static properties.
* They should be immediately visible to other devs reading the file an declared higher up in the file, since they serve as documentation.
*/
class ProfileContainer extends Component {
state = {activeProfile: false};
static propTypes = {
model: React.PropTypes.object.isRequired,
title: React.PropTypes.string
};
static defaultProps = {
model: {
id: 0
},
title: 'Your Name'
};
render() {
return (
<div>
Is Profile Active: {this.state.activeProfile}
</div>
);
}
}
/**
* Class methods (using arrow functions)
* With class components, when you pass methods to subcomponents, you have to ensure that they have the right `this` when they’re called.
* This is usually achieved by passing this.handleSubmit.bind(this) to the subcomponent.
* However using arrow functions does not create its own this context, so this has its original meaning from the enclosing context.
*/
class ProfileContainer extends Component {
state = {activeProfile: false};
handleSubmit = (e) => {
e.preventDefault();
this.props.model.save()
};
handleNameChange = (e) => {
this.props.model.changeName(e.target.value)
};
handleExpand = (e) => {
e.preventDefault();
this.setState({activeProfile: !this.state.activeProfile})
};
render() {
return (
<div>
Is Profile Active: {this.state.activeProfile}
</div>
);
}
}