Skip to content

Commit 96fff4f

Browse files
committed
Some refactor
1 parent 33b7590 commit 96fff4f

File tree

5 files changed

+50
-24
lines changed

5 files changed

+50
-24
lines changed

src/ClassComponent.js

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,34 @@
11
import React from 'react'
22

3-
export default class Counter extends React.Component {
4-
constructor (props) {
5-
super(props)
6-
this.state = { counter: 0 }
3+
export function withIncrement (Component) {
4+
return class extends React.Component {
5+
constructor (props) {
6+
super(props)
7+
this.state = { counter: 0 }
8+
this.incrementCounter = this.incrementCounter.bind(this)
9+
}
10+
11+
incrementCounter () {
12+
this.setState(state => ({ counter: state.counter + 1 }))
13+
}
14+
15+
render () {
16+
return (
17+
<Component counter={this.state.counter} increment={this.incrementCounter} />
18+
)
19+
}
720
}
21+
}
822

23+
export default class Counter extends React.Component {
924
componentDidMount () {
10-
document.title = `Class ${this.state.counter}`
25+
document.title = `Class ${this.props.counter}`
1126

12-
this.interval = setInterval(() => {
13-
this.setState(state => ({ counter: state.counter + 1 }))
14-
}, 2000)
27+
this.interval = setInterval(this.props.increment, 2000)
1528
}
1629

1730
componentDidUpdate () {
18-
document.title = `Class ${this.state.counter}`
31+
document.title = `Class ${this.props.counter}`
1932
}
2033

2134
componentWillUnmount () {
@@ -26,8 +39,8 @@ export default class Counter extends React.Component {
2639
return (
2740
<div>
2841
<h2>Class component</h2>
29-
<p>{this.state.counter}</p>
30-
<button onClick={() => this.setState(state => ({ counter: state.counter + 1 }))}>Increment class component</button>
42+
<p>{this.props.counter}</p>
43+
<button onClick={this.props.increment}>Increment class component</button>
3144
</div>
3245
)
3346
}

src/FunctionalComponent.js

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
1-
import React, { useState, useEffect } from 'react'
1+
import React, { useEffect } from 'react'
2+
import { useIncremental } from './useIncremental'
3+
import { useTitle } from './useTitle'
24

3-
export default function (props) {
4-
const [counter, setCounter] = useState(0)
5+
export default function () {
6+
const [counter, incrementCounter] = useIncremental(0)
7+
useTitle(`Functional ${counter}`)
58

69
useEffect(() => {
7-
document.title = `Functional ${counter}`
8-
})
9-
10-
useEffect(() => {
11-
const interval = setInterval(() => {
12-
setCounter(counter => counter + 1)
13-
}, 2500)
10+
const interval = setInterval(incrementCounter, 2500)
1411

1512
return () => clearInterval(interval)
1613
})
@@ -19,7 +16,7 @@ export default function (props) {
1916
<div>
2017
<h2>Functional component</h2>
2118
<p>{counter}</p>
22-
<button onClick={() => setCounter(counter => counter + 1)}>Increment Functional</button>
19+
<button onClick={incrementCounter}>Increment Functional</button>
2320
</div>
2421
)
2522
}

src/index.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import React from 'react'
22
import ReactDOM from 'react-dom'
3-
import ClassComponent from './ClassComponent'
3+
import ClassComponent, { withIncrement } from './ClassComponent'
44
import FunctionalComponent from './FunctionalComponent'
55

6+
const IncrementalComponent = withIncrement(ClassComponent)
7+
68
function App () {
79
return (
810
<>
9-
<ClassComponent />
11+
<IncrementalComponent />
1012
<FunctionalComponent />
1113
</>
1214
)

src/useIncremental.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { useState } from 'react'
2+
3+
export function useIncremental (initialValue) {
4+
const [counter, setCounter] = useState(initialValue)
5+
6+
return [counter, () => setCounter(counter => counter + 1)]
7+
}

src/useTitle.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { useEffect } from 'react'
2+
3+
export function useTitle (title) {
4+
useEffect(() => {
5+
document.title = title
6+
}, [title])
7+
}

0 commit comments

Comments
 (0)