- Notifications
You must be signed in to change notification settings - Fork6
effector/nextjs-legacy
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Note: we recommend using
@effector/next
package.
A HOCs that brings Effector and Next.js together
npm install effector-next
or yarn
yarn add effector-next
effector-next requireseffector
,effector-react
to be installed
effector/babel-plugin is necessary if you do not want to manually name the units
To load the initial state on the server, you must attach
withFork
wrapper to your_document
componentpages/_document.jsx
importDocumentfrom"next/document";import{withFork}from"effector-next";constenhance=withFork({debug:false});exportdefaultenhance(Document);
To get the initial state on the client and drop it into the application, you must attach
withHydrate
wrapper to your_app
componentpages/_app.jsx
import{withHydrate}from"effector-next";importAppfrom"next/app";constenhance=withHydrate();exportdefaultenhance(App);
To bind events/stores on the server to the scope, add aliases from
effector-react
toeffector-react/ssr
innext.config.js
next.config.js
const{ withEffectorReactAliases}=require("effector-next/tools");constenhance=withEffectorReactAliases();module.exports=enhance({});
Replace imports from
"effector"
to"effector-next"
- import { createEvent, forward } from "effector"+ import { createEvent, forward } from "effector-next"
Connect the
effector/babel-plugin
.babelrc
{"presets": ["next/babel"],"plugins": ["effector/babel-plugin"]}
If you are using
effector
version > 21.3.0, you also need to configure the babel plugin:{"presets": ["next/babel"],"plugins": ["effector/babel-plugin", {"importName": ["effector-next"] }]}
Configure what event will be triggered when the page is requested from the server using
withStart
pages/index.js
importReactfrom"react";import{withStart}from"effector-next";import{useStore}from"effector-react";import{pageLoaded}from"../model";constenhance=withStart(pageLoaded);functionHomePage(){return(<div><h1>Hello World</h1></div>);}exportdefaultenhance(HomePage);
Declare our model
models/index.js
import{forward,createEvent,createStore,createEffect}from"effector-next";exportconstpageLoaded=createEvent();exportconstbuttonClicked=createEvent();consteffect=createEffect({handler(name){returnPromise.resolve({ name});},});exportconst$data=createStore(null);$data.on(effect.done,(_,{ result})=>result);forward({from:pageLoaded.map(()=>"nameFromPageLoaded"),to:effect,});forward({from:buttonClicked.map(()=>"nameFromButtonClicked"),to:effect,});
Connect the page to the store (all units must be wrapped in hooks - this is necessary in order to associate units with scope on the server)
pages/index.jsx
importReactfrom"react";import{useStore,useEvent}from"effector-react";import{$data,buttonClicked}from"../models";exportdefaultfunctionHomePage(){constdata=useStore($data);consthandleClick=useEvent(buttonClicked);return(<div><h1>HomePage</h1><h2>Store state:{JSON.stringify({ data})}</h2><buttononClick={handleClick}>click to change store state</button></div>);}
Bind an event that will be called on the server when the page is requested
pages/index.jsx
import React from "react";import { useStore, useEvent } from "effector-react";+import { withStart } from "effector-next";-import { $data, buttonClicked } from "../models";+import { $data, pageLoaded, buttonClicked } from "../models";+const enhance = withStart(pageLoaded);-export default function HomePage() {+function HomePage() { const data = useStore($data); const handleClick = useEvent(buttonClicked); return ( <div> <h1>HomePage</h1> <h2>Store state: {JSON.stringify({ data })}</h2> <button onClick={handleClick}>click to change store state</button> </div> );}+export default enhance(HomePage);
ThewithFork
accepts a config object as a parameter:
debug
(optional, boolean) : enable debug loggingserializeIgnore
(optional, array) : stores whose values should not be sent to the client after serialization
When the unit passed towithStart
is called, the object will be passed as a payload:
req
: incoming requestres
: serever responsecookies
: parsed cookiespathname
: path section ofURL
query
: query string section ofURL
parsed as an object.
- Check out thedraft release.
- All PRs should have correct labels and useful titles. You canreview available labels here.
- Update labels for PRs and titles, nextmanually run the release drafter action to regenerate the draft release.
- Review the new version and press "Publish"
- If required check "Create discussion for this release"
About
☄️ Effector wrappers for Next.js