未验证 提交 22638769 编写于 作者: H Hugo Morosini 提交者: GitHub

added "with-route-as-modal" example (#11473)

* added "with-route-as-modal" exemple

extra space missing in style.css

oops

linted

* Use Link and removed unrequired imports
Co-authored-by: NLuis Alvarez <luis@zeit.co>
上级 f2315ffc
# with-route-as-modal
On many popular social media, opening a post will update the URL but won't trigger a navigation and will instead display the content inside a modal. This behavior ensure the user won't lose the current UI context (scroll position). The URL still reflect the post's actual page location and any refresh will bring the user there. This behavior ensure great UX without neglecting SEO.
This example show how to conditionally display a modal based on a route.
## Deploy your own
Deploy the example using [ZEIT Now](https://zeit.co/now):
[![Deploy with ZEIT Now](https://zeit.co/button)](https://zeit.co/import/project?template=https://github.com/zeit/next.js/tree/canary/examples/with-route-as-modal)
## How to use
### Using `create-next-app`
Execute [`create-next-app`](https://github.com/zeit/next.js/tree/canary/packages/create-next-app) with [npm](https://docs.npmjs.com/cli/init) or [Yarn](https://yarnpkg.com/lang/en/docs/cli/create/) to bootstrap the example:
```bash
npx create-next-app --example with-route-as-modal with-route-as-modal-app
# or
yarn create next-app --example with-route-as-modal with-route-as-modal-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-route-as-modal
cd with-route-as-modal
```
Install it and run:
```bash
npm install
npm run dev
# or
yarn
yarn dev
```
Deploy it to the cloud with [ZEIT Now](https://zeit.co/import?filter=next.js&utm_source=github&utm_medium=readme&utm_campaign=next-example) ([Documentation](https://nextjs.org/docs/deployment)).
const Post = ({ id }) => {
return <div className="post">{`I am the post ${id}`}</div>
}
export default Post
import Link from 'next/link'
const PostCard = ({ id }) => {
return (
<Link href={`/?postId=${id}`} as={`/post/${id}`}>
<a className="postCard">{id}</a>
</Link>
)
}
export default PostCard
{
"name": "with-route-as-modal",
"version": "1.0.0",
"scripts": {
"dev": "next",
"build": "next build",
"start": "next start"
},
"dependencies": {
"next": "latest",
"react": "16.13.1",
"react-dom": "16.13.1",
"react-modal": "3.11.2"
},
"license": "ISC"
}
import '../style.css'
function MyApp({ Component, pageProps }) {
return <Component {...pageProps} />
}
export default MyApp
import { useRouter } from 'next/router'
import Modal from 'react-modal'
import Post from '../components/Post'
import PostCard from '../components/PostCard'
Modal.setAppElement('#__next')
const posts = [1, 2, 3, 4, 5, 6, 7, 8, 9]
const Index = () => {
const router = useRouter()
return (
<>
<Modal
isOpen={!!router.query.postId}
onRequestClose={() => router.push('/')}
contentLabel="Post modal"
>
<Post id={router.query.postId} />
</Modal>
<div className="postCardGrid">
{posts.map((id, index) => (
<PostCard key={index} id={id} />
))}
</div>
</>
)
}
export default Index
import { useRouter } from 'next/router'
import Post from '../../components/Post'
const PostPage = () => {
const router = useRouter()
const { postId } = router.query
return <Post id={postId} />
}
export default PostPage
body {
margin: 0;
}
#__next {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.postCardGrid {
display: inline-grid;
grid-template-columns: repeat(3, 1fr);
grid-gap: 10px;
grid-auto-rows: minmax(100px, auto);
}
.postCard {
width: 150px;
height: 150px;
background-color: lightblue;
display: flex;
justify-content: center;
align-items: center;
border: black solid 1px;
}
.post {
width: 100%;
height: 100%;
background-color: darkcyan;
font-size: 18px;
display: flex;
align-items: center;
justify-content: center;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册