-
Notifications
You must be signed in to change notification settings - Fork 49
/
Copy pathpp_state.js
71 lines (62 loc) · 1.62 KB
/
pp_state.js
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
import React from 'react'
import ReactDOM from 'react-dom'
import { IIHOC as DebuggerHOC, stringify } from './ii_debug'
// Props Proxy and state abstraction demonstration
function PPHOC(WrappedComponent) {
return class PP extends React.Component {
constructor(props) {
super(props)
this.state = { fields: {} }
}
getField(fieldName) {
if (!this.state.fields[fieldName]) {
this.state.fields[fieldName] = {
value: '',
onChange: event => {
this.state.fields[fieldName].value = event.target.value
this.forceUpdate()
}
}
}
return {
value: this.state.fields[fieldName].value,
onChange: this.state.fields[fieldName].onChange
}
}
render() {
const props = Object.assign({}, this.props, {
fields: this.getField.bind(this),
})
return (
<div>
<h2>
PP HOC
</h2>
<p>Im a Props Proxy HOC that abstracts controlled inputs</p>
<WrappedComponent {...props}/>
</div>
)
}
}
}
class Example extends React.Component {
render() {
return (
<div>
<h2>
Wrapped Component
</h2>
<p>
Props
</p>
<pre>{stringify(this.props)}</pre>
<form>
<label>Automatically controlled input!</label>
<input type="email" {...this.props.fields('email')}/>
</form>
</div>
)
}
}
const EnhancedExample = DebuggerHOC(PPHOC(Example))
ReactDOM.render(<EnhancedExample date={(new Date).toISOString()}/>, document.getElementById('root'))