- 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
Topics
Resources
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors4
Uh oh!
There was an error while loading.Please reload this page.