Skip to content

Commit

Permalink
Refactor with-context-api example to use functional components (verce…
Browse files Browse the repository at this point in the history
  • Loading branch information
HaNdTriX authored and Timer committed Oct 18, 2019
1 parent 2874a3e commit fd0ba93
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 100 deletions.
6 changes: 3 additions & 3 deletions examples/with-context-api/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ This example shows how to use react context api in our app.

It provides an example of using `pages/_app.js` to include the context api provider and then shows how both the `pages/index.js` and `pages/about.js` can both share the same data using the context api consumer.

The `pages/index.js` shows how to, from the home page, increment and decrement the context data by 1 (a hard code value in the context provider itself).
We start of by creating two contexts. One that actually never changes (`CounterDispatchContext`) and one that changes more often (`CounterStateContext`).

The `pages/about.js` shows how to, from the about page, how to pass an increment value from the about page into the context provider itself.
The `pages/index.js` shows how to, from the home page, increment and decrement the context data by 1 (a hard code value in the context provider itself).

\*_Based on WesBos example_.
The `pages/about.js` shows how to pass an increment value from the about page into the context provider itself.
31 changes: 31 additions & 0 deletions examples/with-context-api/components/Counter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import React, { useReducer, useContext } from 'react'

const CounterStateContext = React.createContext()
const CounterDispatchContext = React.createContext()

const reducer = (state, action) => {
switch (action.type) {
case 'INCREASE':
return state + 1
case 'DECREASE':
return state - 1
case 'INCREASE_BY':
return state + action.payload
default:
throw new Error(`Unkown action: ${action.type}`)
}
}

export const CounterProvider = ({ children }) => {
const [state, dispatch] = useReducer(reducer, 0)
return (
<CounterDispatchContext.Provider value={dispatch}>
<CounterStateContext.Provider value={state}>
{children}
</CounterStateContext.Provider>
</CounterDispatchContext.Provider>
)
}

export const useCount = () => useContext(CounterStateContext)
export const useDispatchCount = () => useContext(CounterDispatchContext)
40 changes: 0 additions & 40 deletions examples/with-context-api/components/CounterProvider.js

This file was deleted.

4 changes: 1 addition & 3 deletions examples/with-context-api/pages/_app.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
import App from 'next/app'
/* First we import our provider */
import CounterProvider from '../components/CounterProvider'
import { CounterProvider } from '../components/Counter'

class MyApp extends App {
render () {
const { Component, pageProps } = this.props
return (
/* Then we wrap our components with the provider */
<CounterProvider>
<Component {...pageProps} />
</CounterProvider>
Expand Down
61 changes: 31 additions & 30 deletions examples/with-context-api/pages/about.js
Original file line number Diff line number Diff line change
@@ -1,33 +1,34 @@
import React, { Component } from 'react'
/* First we import the consumer */
import { CounterConsumer } from '../components/CounterProvider'
import React from 'react'
import Link from 'next/link'
import { useCount, useDispatchCount } from '../components/Counter'

export default class about extends Component {
render () {
return (
/* Then we use our context through render props */
<CounterConsumer>
{({ count, increase, increaseBy }) => (
<div>
<h1>ABOUT</h1>
<p>Counter: {count}</p>
<button onClick={increase}>Increase</button>
<button
onClick={() => {
increaseBy(15)
}}
>
Increase By 15
</button>
<p>
<Link href='/'>
<a>Home</a>
</Link>
</p>
</div>
)}
</CounterConsumer>
)
}
const AboutPage = () => {
const count = useCount()
const dispatch = useDispatchCount()

const handleIncrease = event =>
dispatch({
type: 'INCREASE'
})
const handleIncrease15 = event =>
dispatch({
type: 'INCREASE_BY',
payload: 15
})

return (
<>
<h1>ABOUT</h1>
<p>Counter: {count}</p>
<button onClick={handleIncrease}>Increase</button>
<button onClick={handleIncrease15}>Increase By 15</button>
<p>
<Link href='/'>
<a>Home</a>
</Link>
</p>
</>
)
}

export default AboutPage
54 changes: 30 additions & 24 deletions examples/with-context-api/pages/index.js
Original file line number Diff line number Diff line change
@@ -1,27 +1,33 @@
import React, { Component } from 'react'
import React from 'react'
import Link from 'next/link'
/* First we import the consumer */
import { CounterConsumer } from '../components/CounterProvider'
import { useCount, useDispatchCount } from '../components/Counter'

export default class index extends Component {
render () {
return (
/* Then we use our context through render props */
<CounterConsumer>
{({ count, increase, decrease }) => (
<div>
<h1>HOME</h1>
<p>Counter: {count}</p>
<button onClick={increase}>Increase</button>
<button onClick={decrease}>Decrease</button>
<p>
<Link href='/about'>
<a>About</a>
</Link>
</p>
</div>
)}
</CounterConsumer>
)
}
const IndexPage = () => {
const count = useCount()
const dispatch = useDispatchCount()

const handleIncrease = event =>
dispatch({
type: 'INCREASE'
})
const handleDecrease = event =>
dispatch({
type: 'DECREASE'
})

return (
<>
<h1>HOME</h1>
<p>Counter: {count}</p>
<button onClick={handleIncrease}>Increase</button>
<button onClick={handleDecrease}>Decrease</button>
<p>
<Link href='/about'>
<a>About</a>
</Link>
</p>
</>
)
}

export default IndexPage

0 comments on commit fd0ba93

Please sign in to comment.