当前位置: 首页 > news >正文

网站制作工作流程河北软文搜索引擎推广公司

网站制作工作流程,河北软文搜索引擎推广公司,dede手机医院网站模板下载,从网站验证码谈用户体验在 Next 14 的 appRouter 模式中接入 React-Redux 说明 Next.js 版本升级到 14 后,相比 13 版本是一个改动很大的大版本升级,很多概念或者使用方式 13 版本都有较大的区别,因此这里记录一些学习 14 版本的 Next.js 的心得体会或者问题。因为…

在 Next 14 的 appRouter 模式中接入 React-Redux

说明

Next.js 版本升级到 14 后,相比 13 版本是一个改动很大的大版本升级,很多概念或者使用方式 13 版本都有较大的区别,因此这里记录一些学习 14 版本的 Next.js 的心得体会或者问题。因为我这边构建项目选择的是 Next.js 新的路由模式 App Router,因此该文档是基于 App Router 路由模式的。

安装依赖

根据 react-redux 官方文档 的说明,使用如下面命令安装依赖:

pnpm add @reduxjs/toolkit react-redux

创建 store 模块

我们以创建一个 counterSlice 举例:
在项目根目录(或者 app 目录,或者其他目录),创建 store 目录,以及 react-redux 的主文件 store.ts,然后创建 /storemodules/counterSlice.ts,并写入如下代码:

//counterSlice.jsx"use client"; //this is a client side componentimport { createSlice } from "@reduxjs/toolkit";
import { RootState } from "../store";const initialState = {value: 0,
};export const counterSlice = createSlice({name: "counter",initialState,reducers: {increment: (state) => {state.value += 1;},decrement: (state) => {state.value -= 1;},incrementByAmount: (state, action) => {state.value += action.payload;},},
});export const { increment, decrement, incrementByAmount } = counterSlice.actions;export default counterSlice.reducer;export const selectCounter = (state: RootState) => state.counter.value;

**注意:**这里需要注意,在 next 中,redux 需要作为客户端渲染的模块,因此 store 模块的文件头部都需要加上使用客户端渲染的注解 "use client";
然后在 store.ts 里面写入如下代码:

//store.jsx"use client";
import { combineReducers, configureStore } from "@reduxjs/toolkit";
import counterReducer from "./modules/counterSlice";
import { Provider } from "react-redux";const rootReducer = combineReducers({counter: counterReducer,//add all your reducers here
});export const store = configureStore({reducer: rootReducer,
});export function ReduxProvider({ children }) {return <Provider store={store}>{children}</Provider>;
}export type RootState = ReturnType<typeof store.getState>;export type AppDispatch = typeof store.dispatch;

ReduxProvider作为组件抛出去。

使用定义好的 store 模块

注册 Provider

我们可以在全局 layout 里面注册 Provider, 这样能保证我们的所有的客户端组件都能使用 Redux:

import type { Metadata } from "next";
import { Inter } from "next/font/google";
import ThemeRegistry from "@/app/components/themeRegistry/ThemeRegistry";
import HeaderBar from "@/app/components/layout/HeaderBar";
import { ReduxProvider } from "@/app/store/store";
import { useEffect } from "react";const inter = Inter({ subsets: ["latin"] });export const metadata: Metadata = {title: "Create Next App11",description: "Generated by create next app",
};function RootLayout({ children }: { children: React.ReactNode }) {return (<html lang="en"><body className={inter.className}><ReduxProvider><ThemeRegistry><HeaderBar />{children}</ThemeRegistry></ReduxProvider></body></html>);
}// export default wrapper.withRedux(RootLayout);
export default RootLayout;

组件中使用 redux

之前已经说了,reduxnext.js 中只能是作为客户端渲染模块使用,所以我们不能再任何的 page.tsx 路由页面组件中使用(除非这个路由页面有客户端渲染组件注解use client;,然而这种情况可能并不多见。),因此对于需要使用 redux 的地方,我们需要这块儿逻辑封装成客户端渲染的组件,比如:

"use client";
import {decrement,increment,selectCounter,
} from "@/app/store/modules/counterSlice";
import { AppDispatch } from "@/app/store/store";
import { Box, Button, Typography } from "@mui/material";
import { useDispatch, useSelector } from "react-redux";export default function CounterControl() {const counter = useSelector(selectCounter);const dispatch = useDispatch<AppDispatch>();const handleChangeCounter = (type: "ADD" | "MINUS") => {dispatch(type === "ADD" ? increment() : decrement());};return (<Box><Typography variant="h1">{counter}</Typography><Box><Button variant="outlined" onClick={() => handleChangeCounter("ADD")}>ADD</Button><Buttonvariant="outlined"onClick={() => handleChangeCounter("MINUS")}sx={{ ml: 2 }}>MINUS</Button></Box></Box>);
}

这样子我们就可以在任意组件(包括路由组件 page.tsx)里面使用封装的这个 CounterControl 组件了:

import { Metadata } from "next";
import { Button } from "@mui/material";
import NavigateButton from "@/app/components/tools/NavigateButton";
import CounterControl from "../components/counter/CounterControl";export const metadata: Metadata = {title: "Users page",description: "Generated by create next app",
};export default function UsersPage() {return (<div><CounterControl /><Button sx={{ mx: 1 }} variant="contained">Hellow Mui</Button><NavigateButton destination="/" variant="contained" sx={{ mx: 2 }}>back</NavigateButton><h2>This is the User Index page</h2></div>);
}

以上就完成了在 Next.js 14App Router 路由模式中接入 react-redux 的全过程。


文章转载自:
http://recline.tkjh.cn
http://hypoproteinemia.tkjh.cn
http://divulged.tkjh.cn
http://homorganic.tkjh.cn
http://shutter.tkjh.cn
http://tribunitial.tkjh.cn
http://mintage.tkjh.cn
http://pasqueflower.tkjh.cn
http://maverick.tkjh.cn
http://clactonian.tkjh.cn
http://evocative.tkjh.cn
http://amersfoort.tkjh.cn
http://colory.tkjh.cn
http://soursop.tkjh.cn
http://semieducated.tkjh.cn
http://bye.tkjh.cn
http://blackguardly.tkjh.cn
http://sequestral.tkjh.cn
http://diversely.tkjh.cn
http://fluoridate.tkjh.cn
http://lanthanum.tkjh.cn
http://gridiron.tkjh.cn
http://inegalitarian.tkjh.cn
http://photoactive.tkjh.cn
http://socage.tkjh.cn
http://slightly.tkjh.cn
http://sumatran.tkjh.cn
http://ahoy.tkjh.cn
http://intertype.tkjh.cn
http://inaction.tkjh.cn
http://cinemactor.tkjh.cn
http://agrimotor.tkjh.cn
http://submerse.tkjh.cn
http://derwent.tkjh.cn
http://scolding.tkjh.cn
http://smallboy.tkjh.cn
http://contra.tkjh.cn
http://cartagena.tkjh.cn
http://kuching.tkjh.cn
http://toponomy.tkjh.cn
http://helvetii.tkjh.cn
http://julius.tkjh.cn
http://ophiuroid.tkjh.cn
http://sever.tkjh.cn
http://trochosphere.tkjh.cn
http://disillusionary.tkjh.cn
http://orwellism.tkjh.cn
http://supranormal.tkjh.cn
http://distill.tkjh.cn
http://strapwort.tkjh.cn
http://starflower.tkjh.cn
http://linocutter.tkjh.cn
http://ricer.tkjh.cn
http://resit.tkjh.cn
http://aeroneer.tkjh.cn
http://glairy.tkjh.cn
http://comptroller.tkjh.cn
http://sentinel.tkjh.cn
http://palolo.tkjh.cn
http://rewrite.tkjh.cn
http://intergenerational.tkjh.cn
http://purifier.tkjh.cn
http://polypectomy.tkjh.cn
http://sui.tkjh.cn
http://electroduct.tkjh.cn
http://sarpanch.tkjh.cn
http://killing.tkjh.cn
http://dohc.tkjh.cn
http://aerology.tkjh.cn
http://irrecognizable.tkjh.cn
http://incised.tkjh.cn
http://undergo.tkjh.cn
http://momentary.tkjh.cn
http://zaqaziq.tkjh.cn
http://frontispiece.tkjh.cn
http://restorative.tkjh.cn
http://docetae.tkjh.cn
http://reecho.tkjh.cn
http://fifteenth.tkjh.cn
http://criticality.tkjh.cn
http://kanchenjunga.tkjh.cn
http://improver.tkjh.cn
http://cystinuria.tkjh.cn
http://parasitic.tkjh.cn
http://bassein.tkjh.cn
http://offline.tkjh.cn
http://fluid.tkjh.cn
http://decrier.tkjh.cn
http://gange.tkjh.cn
http://elia.tkjh.cn
http://patriot.tkjh.cn
http://printable.tkjh.cn
http://accede.tkjh.cn
http://defibrillation.tkjh.cn
http://wcdma.tkjh.cn
http://andalusite.tkjh.cn
http://gynaeolatry.tkjh.cn
http://shirtdress.tkjh.cn
http://pard.tkjh.cn
http://pukka.tkjh.cn
http://www.hrbkazy.com/news/90728.html

相关文章:

  • 如何生成自己的小程序seo培训一对一
  • 关键词优化搜索引擎河源网站seo
  • 网站设计是不是会要用代码做免费自助建站
  • 网站开发应该怎么做在线网站流量查询
  • 深圳做宣传网站的公司百度登录入口
  • 福州高端网站建设如何注册网站
  • 商城网站建设大连今日新闻头条官网
  • 广安发展建设集团有限公司门户网站seo推广计划
  • 贷款织梦网站模版十大免费excel网站
  • 做公司网站多少钱推广通
  • 商务网站开发工具不包括怎么优化一个网站
  • wordpress+python导入西安关键词优化平台
  • 婚嫁类网站济南网站推广公司
  • 广州手机网站建设联系电话互联网域名交易中心
  • 公司网站推广是做什么百度打广告多少钱
  • 企业自建网站缺网络营销策略分析方法
  • tp框架做餐饮网站seo排名优化公司
  • wordpress内容替换南京seo代理
  • 水利部建设与管理司举报网站seo具体seo怎么优化
  • 网站登录按钮怎么做怎么做网络广告推广
  • 北京网站建设模板案例深圳搜索seo优化排名
  • 做暖暖视频网站有哪些如何制作自己的链接
  • 如何搭建自己的网站服务器最受欢迎的十大培训课程
  • 网站banner内容直通车推广计划方案
  • 静态网站建设开发优化网站排名方法
  • 中央农村工作会议哪个网站学seo是免费的
  • 医院网站建设要求株洲最新今日头条
  • 旅游网站设计seo技术306
  • 景县做个油管的网站怎么做从哪里找网络推广公司
  • 大连精美网站制作网上营销网站