-
Notifications
You must be signed in to change notification settings - Fork 27.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add with-context-api example #5154
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
[![Deploy to now](https://deploy.now.sh/static/button.svg)](https://deploy.now.sh/?repo=https://github.com/zeit/next.js/tree/master/examples/with-context-api) | ||
|
||
# Hello World example | ||
|
||
## How to use | ||
|
||
### Using `create-next-app` | ||
|
||
Execute [`create-next-app`](https://github.com/segmentio/create-next-app) with [Yarn](https://yarnpkg.com/lang/en/docs/cli/create/) or [npx](https://github.com/zkat/npx#readme) to bootstrap the example: | ||
|
||
```bash | ||
npx create-next-app --example with-context-api with-context-api-app | ||
# or | ||
yarn create next-app --example with-context-api with-context-api-app | ||
``` | ||
|
||
### Download manually | ||
|
||
Download the example: | ||
|
||
```bash | ||
curl https://codeload.github.com/zeit/next.js/tar.gz/canary | tar -xz --strip=2 next.js-canary/examples/with-context-api | ||
cd with-context-api | ||
``` | ||
|
||
Install it and run: | ||
|
||
```bash | ||
npm install | ||
npm run dev | ||
# or | ||
yarn | ||
yarn dev | ||
``` | ||
|
||
Deploy it to the cloud with [now](https://zeit.co/now) ([download](https://zeit.co/download)) | ||
|
||
```bash | ||
now | ||
``` | ||
|
||
## The idea behind the example | ||
|
||
This example shows how to use react context api in our app. Based on WesBos example. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
import React, { Component } from 'react' | ||
|
||
/* First we will make a new context */ | ||
const CounterContext = React.createContext() | ||
|
||
/* Then create a provider Component */ | ||
class CounterProvider extends Component { | ||
state = { | ||
count: 0 | ||
} | ||
|
||
increase = () => { | ||
this.setState({ | ||
count: this.state.count + 1 | ||
}) | ||
} | ||
|
||
decrease = () => { | ||
this.setState({ | ||
count: this.state.count - 1 | ||
}) | ||
} | ||
|
||
render () { | ||
return ( | ||
<CounterContext.Provider | ||
value={{ | ||
count: this.state.count, | ||
increase: this.increase, | ||
decrease: this.decrease | ||
}} | ||
> | ||
{this.props.children} | ||
</CounterContext.Provider> | ||
) | ||
} | ||
} | ||
|
||
/* then make a consumer which will surface it */ | ||
const CounterConsumer = CounterContext.Consumer | ||
|
||
export default CounterProvider | ||
export { CounterConsumer } |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
{ | ||
"name": "with-context-api", | ||
"version": "1.0.0", | ||
"scripts": { | ||
"dev": "next", | ||
"build": "next build", | ||
"start": "next start" | ||
}, | ||
"dependencies": { | ||
"next": "latest", | ||
"react": "^16.0.0", | ||
"react-dom": "^16.0.0" | ||
}, | ||
"license": "ISC" | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
import App, { Container } from 'next/app' | ||
/* First we import our provider */ | ||
import NoteProvider from '../components/CounterProvider' | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @wesbos example used There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. YEs - sorry I ripped this out of another app :) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes. it should be CounterProvider. I based on @wesbos example and forget to change that import |
||
|
||
class MyApp extends App { | ||
render () { | ||
const { Component, pageProps } = this.props | ||
return ( | ||
<Container> | ||
{/* Then we wrap our components with the provider */} | ||
<NoteProvider> | ||
<Component {...pageProps} /> | ||
</NoteProvider> | ||
</Container> | ||
) | ||
} | ||
} | ||
|
||
export default MyApp |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
import React, { Component } from 'react' | ||
/* First we import the consumer */ | ||
import { CounterConsumer } from '../components/CounterProvider' | ||
|
||
export default class index extends Component { | ||
render () { | ||
return ( | ||
/* Then we use our context through render props */ | ||
<CounterConsumer> | ||
{({ count, increase, decrease }) => ( | ||
<div> | ||
<p>Counter: {count}</p> | ||
<button onClick={increase}>Increase</button> | ||
<button onClick={decrease}>Decrease</button> | ||
</div> | ||
)} | ||
</CounterConsumer> | ||
) | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's use canary here, as it doesn't work on 6.x
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That should be
"next": "7.0.0-canary.16"
?Sorry, my first PR 😄
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"next": "^7.0.0-canary.16",
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You should be good with
yarn add next@canary
👍