Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download
Views: 50993
1
rclass = React.createClass
2
rtypes = React.PropTypes
3
4
log = (s...) -> console.log(s...)
5
6
uniqueId = (s) -> "#{s}#{Math.random()}"
7
8
# Chapter 6
9
AnswerRadioInput = rclass
10
propTypes:
11
id : rtypes.string
12
name : rtypes.string.isRequired
13
label : rtypes.string.isRequired
14
value : rtypes.string.isRequired
15
checked : rtypes.bool
16
onChanged : rtypes.func.isRequired
17
18
getDefaultProps: ->
19
id : null
20
checked : false
21
22
componentWillReceiveProps: (nextProps) ->
23
if nextProps.checked?
24
@setState(checked:nextProps.checked)
25
26
getInitialState: ->
27
id = if @props.id then @props.id else uniqueId("radio-")
28
checked : !!@props.checked
29
id : id
30
name : id
31
32
handleChanged: (e) ->
33
checked = e.target.checked
34
#log("AnswerRadioInput(name='#{@props.label}').handleChanged ", checked)
35
@setState(checked : checked)
36
if checked
37
@props.onChanged(@props.value)
38
39
render: ->
40
<div className="radio">
41
<label htmlFor={@props.id}>
42
<input type="radio"
43
name = {@props.name}
44
id = {@props.id}
45
value = {@props.value}
46
checked = {@state.checked}
47
onChange = {@handleChanged}
48
/>
49
&nbsp;&nbsp;
50
{@props.label}
51
</label>
52
</div>
53
54
AnswerMultipleChoiceQuestion = rclass
55
propTypes:
56
value : rtypes.string
57
choices : rtypes.array.isRequired
58
onCompleted : rtypes.func.isRequired
59
60
getInitialState: ->
61
id : uniqueId('multiple-choices-')
62
value : @props.value
63
64
handleChanged: (value) ->
65
log("AnswerMultipleChoiceQuestion.handleChanged ", value)
66
@setState(value:value)
67
@props.onCompleted(value)
68
69
renderChoices: ->
70
for choice, i in @props.choices
71
<AnswerRadioInput
72
id = {"choice-#{i}"}
73
key = {"choice-#{i}"}
74
name = {@state.id}
75
label = {choice}
76
value = {choice}
77
checked = {@state.value == choice}
78
onChanged = {@handleChanged}
79
/>
80
81
render: ->
82
<div className="form-group">
83
<Timer />
84
<label className="survey-item-label" htmlFor={@state.id}>
85
{@props.label}
86
</label>
87
<div className="survey-item-content">
88
{@renderChoices()}
89
</div>
90
</div>
91
92
NeatComponent = rclass
93
render: ->
94
<div className="neat-component">
95
{<h1>Showing this title</h1> if @props.showTitle}
96
<hr />
97
{<p key={n}>This line has been printed {n} times</p> for n in [1..5]}
98
</div>
99
NeatComponent2 = rclass
100
title: ->
101
if @props.showTitle
102
<h1>Showing this title</h1>
103
else
104
<h2>Instead, just a subtitle</h2>
105
106
loop0: ->
107
for n in [1..10]
108
<div key={n}>Line {n}</div>
109
110
loop: ->
111
(<div key={n}>Line {n}</div> for n in [1..3])
112
113
render: ->
114
<div className="neat-component">
115
<NeatComponent />
116
{@title()}
117
<hr />
118
{@loop()}
119
</div>
120
121
# Chapter 7
122
123
Timer = rclass
124
getInitialState: ->
125
secondsElapsed : 0
126
127
tick: () ->
128
@setState(secondsElapsed : @state.secondsElapsed + 1)
129
130
componentDidMount: ->
131
@interval = setInterval(@tick, 1000)
132
133
componentWillUnmount: ->
134
clearInterval(@interval)
135
136
render: ->
137
<div> Seconds Elapsed: {@state.secondsElapsed} </div>
138
139
IntervalMixin =
140
setInterval : (cb, interval) ->
141
token = setInterval(cb, interval)
142
@__intervals.push(token)
143
return token
144
145
componentDidMount: ->
146
@__intervals = []
147
148
componentWillUnmount: ->
149
(clearInterval(token) for token in @__intervals)
150
151
Since2014 = rclass
152
mixins : [IntervalMixin]
153
154
componentDidMount: ->
155
@setInterval(@forceUpdate.bind(@), 1000)
156
157
render: ->
158
from = Number(new Date(2014,0,1))
159
to = Date.now()
160
return <div>Seconds since 2014: {Math.round((to-from)/1000)}</div>
161
162
# Chapter 8
163
164
DoodleArea = rclass
165
render : ->
166
<div>
167
Describe your doodle: <RichText />
168
<canvas ref="mainCanvas" width="200" height="100" style={border:'1px solid #000000'} />
169
</div>
170
171
componentDidMount: ->
172
canvasNode = @refs.mainCanvas.getDOMNode()
173
ctx = canvasNode.getContext("2d")
174
ctx.fillStyle = "#0000ff"
175
ctx.fillRect(0,0,150,75)
176
177
RichText = rclass
178
render : ->
179
<div ref="editableDiv" contentEditable="true"
180
width="200" height="100"
181
style={border:'1px solid #000000'}
182
onKeyUp={@handleKeyUp} >
183
{window.localStorage.doodle}</div>
184
185
handleKeyUp: ->
186
editor = @refs.editableDiv.getDOMNode()
187
html = editor.innerHTML
188
window.localStorage.doodle = html
189
console.log(html)
190
191
192
# Chapter 9
193
# uncontrolled
194
MyForm = rclass
195
submitHandler : (event) ->
196
event.preventDefault()
197
helloTo = @refs.helloTo.getDOMNode().value
198
log(helloTo)
199
200
render: ->
201
<form onSubmit={@submitHandler}>
202
<input ref="helloTo"
203
type="text"
204
defaultValue="Hello World!" />
205
<br />
206
<button type="submit">Speak</button>
207
</form>
208
209
# controlled
210
MyForm2 = rclass
211
getInitialState: ->
212
helloTo: 'Hello world!'
213
handleChange: (event) ->
214
@setState(helloTo:event.target.value.toUpperCase())
215
submitHandler: (event) ->
216
event.preventDefault()
217
log(@state.helloTo)
218
render: ->
219
<form onSubmit={@submitHandler}>
220
<input type="text"
221
value={@state.helloTo}
222
onChange={@handleChange} />
223
<br />
224
({@state.helloTo.length} characters)
225
<button type='submit'>Speak</button>
226
</form>
227
228
# ch 12
229
NumberComponent = rclass
230
render : ->
231
<div>{@props.number}</div>
232
233
num = Math.random()
234
# server side
235
console.log(React.renderToString(<NumberComponent number={num}/>))
236
# pass to client side
237
#React.render(<NumberComponent number={num} />, document.getElementById('example'))
238
239
done = (event) ->
240
console.log("done", event)
241
242
the_choices = ['First', 'Next', 'Last', 'Final Option']
243
page = ->
244
<div>
245
<MyForm />
246
<MyForm2 />
247
<DoodleArea />
248
<Since2014 />
249
<h1>React Testbed</h1>
250
<Timer />
251
<hr />
252
<AnswerMultipleChoiceQuestion
253
choices={the_choices} onCompleted=done />
254
</div>
255
256
console.log(React.renderToString(page()))
257
console.log(React.renderToStaticMarkup(page()))
258
259
React.render page(), document.getElementById('example')
260
261
262