diff --git a/examples/server-render/components/nav.js b/examples/server-render/components/nav.js new file mode 100644 index 000000000..03cacf11f --- /dev/null +++ b/examples/server-render/components/nav.js @@ -0,0 +1,11 @@ +export default function Nav() { + return (<> + +
+ ) +} diff --git a/examples/server-render/components/pokemon.js b/examples/server-render/components/pokemon.js new file mode 100644 index 000000000..3e69c42a8 --- /dev/null +++ b/examples/server-render/components/pokemon.js @@ -0,0 +1,20 @@ +export default function Pokemon({ item, revalidate }) { + if (!item || !item.name) return (
loading...
); + return ( +
+

{item.name}

+
+
+ +
+

height: {item.height}

+

weight: {item.weight}

+

abilities: {item.abilities.map(({ ability }) => ability.name).join(', ')}

+ {revalidate + ?

+ : <> + } +
+
+ ) +} diff --git a/examples/server-render/package.json b/examples/server-render/package.json index 0cce25b3a..2d238cbf1 100644 --- a/examples/server-render/package.json +++ b/examples/server-render/package.json @@ -4,11 +4,12 @@ "main": "index.js", "license": "MIT", "dependencies": { + "idx": "2.5.6", "isomorphic-unfetch": "3.0.0", "next": "9.1.1", "react": "16.11.0", "react-dom": "16.11.0", - "swr": "latest" + "swr": "0.1.16" }, "scripts": { "dev": "next", diff --git a/examples/server-render/pages/[pokemon].js b/examples/server-render/pages/[pokemon].js deleted file mode 100644 index 84a1bfc7e..000000000 --- a/examples/server-render/pages/[pokemon].js +++ /dev/null @@ -1,42 +0,0 @@ -import Link from 'next/link' -import fetcher from '../libs/fetcher' - -import useSWR from 'swr' - -const getURL = pokemon => `https://pokeapi.co/api/v2/pokemon/${pokemon}` - -export default function Pokemon({ pokemon, initialData }) { - const { data } = useSWR(getURL(pokemon), fetcher, { initialData }) - - return ( -
-

{pokemon}

- {data ? ( -
-
- -
-

height: {data.height}

-

weight: {data.weight}

- -
- ) : ( - 'loading...' - )} -
-
- - Back - -
- ) -} - -Pokemon.getInitialProps = async ({ query }) => { - const data = await fetcher(getURL(query.pokemon)) - return { initialData: data, pokemon: query.pokemon } -} diff --git a/examples/server-render/pages/demo.js b/examples/server-render/pages/demo.js new file mode 100644 index 000000000..27461cfe5 --- /dev/null +++ b/examples/server-render/pages/demo.js @@ -0,0 +1,42 @@ +import React from 'react'; +import Link from 'next/link' +import fetcher from '../libs/fetcher' +import Nav from '../components/nav' +import Pokemon from '../components/pokemon' + +import useSWR from 'swr' + +const api = { + list: () => 'https://pokeapi.co/api/v2/pokemon/', + item: (pokemon) => `https://pokeapi.co/api/v2/pokemon/${pokemon}`, +} + +export default function Home(props) { + const { data: list } = useSWR(api.list(), fetcher, { initialData: props.list }) + const [selected, setSelected] = React.useState(list.results[0].name); + const { data: item, revalidate } = useSWR(() => api.item(selected), fetcher, { initialData: props.item }) + + return ( +
+
+ ) +} + +Home.getInitialProps = async () => { + const list = await fetcher(api.list()) + const item = await fetcher(api.item(list.results[0].name)) + return { list, item } +} diff --git a/examples/server-render/pages/index.js b/examples/server-render/pages/index.js index 3896d1899..db7551016 100644 --- a/examples/server-render/pages/index.js +++ b/examples/server-render/pages/index.js @@ -1,32 +1,11 @@ +import React from 'react'; import Link from 'next/link' -import fetcher from '../libs/fetcher' - -import useSWR from 'swr' - -const URL = 'https://pokeapi.co/api/v2/pokemon/' - -export default function Home({ initialData }) { - const { data } = useSWR(URL, fetcher, { initialData }) +import Nav from '../components/nav' +export default function Home(props) { return ( -
-

Trending Projects

-
- {data && data.results - ? data.results.map(pokemon => ( -

- - {pokemon.name} - -

- )) - : 'loading...'} -
+
+
) } - -Home.getInitialProps = async () => { - const data = await fetcher(URL) - return { initialData: data } -} diff --git a/examples/server-render/pages/workaround.js b/examples/server-render/pages/workaround.js new file mode 100644 index 000000000..5665d08df --- /dev/null +++ b/examples/server-render/pages/workaround.js @@ -0,0 +1,67 @@ +import React from 'react'; +import Link from 'next/link' +import fetcher from '../libs/fetcher' +import Nav from '../components/nav' +import Pokemon from '../components/pokemon' + +import useSWR from 'swr' + +const useFixedSWR = (key, fetcher, {initialData, ...config} = {}) => { + const initial = React.useRef(initialData); + React.useEffect(() => { + if(key){ + initial.current = undefined; + } + }, [key]); + return useSWR(key, fetcher, {...config, initialData: initial.current}); +} + +const api = { + list: () => 'https://pokeapi.co/api/v2/pokemon/', + item: (pokemon) => `https://pokeapi.co/api/v2/pokemon/${pokemon}`, +} + +export default function Home(props) { + const { data: list } = useFixedSWR(api.list(), fetcher, { initialData: props.list }) + const [selected, setSelected] = React.useState(list.results[0].name); + const { data: item } = useFixedSWR(api.item(selected), fetcher, { initialData: props.item }) + + return ( +
+
+ ) +} + +Home.getInitialProps = async () => { + const list = await fetcher(api.list()) + const item = await fetcher(api.item(list.results[0].name)) + return { list, item } +}