PureScript 语言 Preact+Redux 实现全局状态管理 主题切换 + 用户登录

PureScript阿木 发布于 1 天前 2 次阅读


Preact + Redux 实现全局状态管理:主题切换与用户登录

在现代前端开发中,全局状态管理是确保应用状态一致性和响应性的关键。PureScript 作为一种函数式编程语言,结合 Preact 和 Redux 可以构建高效、可维护的前端应用。本文将探讨如何使用 Preact 和 Redux 在 PureScript 中实现全局状态管理,包括主题切换和用户登录功能。

PureScript 是一种严格、高效的函数式编程语言,它提供了类型系统和模式匹配等特性,有助于编写更安全、更易于维护的代码。Preact 是一个轻量级的 React 实现,它专注于核心功能,提供了高性能和易于使用的 API。Redux 是一个流行的状态管理库,它通过单一的状态树来管理应用的状态。

环境搭建

在开始之前,我们需要搭建一个 PureScript + Preact + Redux 的开发环境。以下是基本的步骤:

1. 安装 Node.js 和 npm。
2. 创建一个新的 npm 项目:`npm init -y`。
3. 安装依赖:`npm install preact preact-redux redux react-redux`.
4. 初始化 Redux:`npm install redux`.
5. 创建 PureScript 项目:`purs init my-app`。

Redux Store

我们需要创建一个 Redux store 来管理全局状态。在 PureScript 中,我们可以使用 `redux` 包来创建 store。

purs
import Redux from "redux"

type State = { theme :: String, isLoggedIn :: Boolean }

initialState :: State
initialState = { theme: "light", isLoggedIn: false }

store :: Redux.Store State
store = Redux.createStore reducer initialState

Reducers

接下来,我们需要定义一些 reducers 来处理不同的状态更新。在 PureScript 中,我们可以使用 `redux` 包来定义 reducers。

purs
import Redux from "redux"

themeReducer :: Redux.Reducer State
themeReducer state = case _ of
Redux.Action { type: "SET_THEME", payload: theme } -> { ...state, theme }
Redux.Action { type: "LOG_IN" } -> { ...state, isLoggedIn: true }
Redux.Action { type: "LOG_OUT" } -> { ...state, isLoggedIn: false }
_ -> state

reducer :: Redux.Reducer State
reducer = Redux.combineReducers { theme: themeReducer }

Actions

在 Redux 中,actions 是用于描述状态变化的普通对象。在 PureScript 中,我们可以定义 actions 来触发状态更新。

purs
import Redux from "redux"

data Action = SetTheme String | LogIn | LogOut

setTheme :: String -> Action
setTheme theme = SetTheme theme

logIn :: Action
logIn = LogIn

logOut :: Action
logOut = LogOut

dispatchSetTheme :: Redux.Dispatch Action
dispatchSetTheme = Redux.dispatch store setTheme

dispatchLogIn :: Redux.Dispatch Action
dispatchLogIn = Redux.dispatch store logIn

dispatchLogOut :: Redux.Dispatch Action
dispatchLogOut = Redux.dispatch store logOut

Preact Components

现在,我们可以使用 Preact 来构建 UI 组件。以下是一个主题切换组件的示例:

purs
import Preact from "preact"
import React from "react"
import Redux from "preact-redux"

type Props = { theme :: String, dispatch :: Redux.Dispatch Action }

changeTheme :: Props -> String -> Preact.Element
changeTheme { theme, dispatch } newTheme =
Preact.createElement "button" { onClick: _ -> dispatch (setTheme newTheme) }
[ Preact.text $ "Change Theme to " newTheme ]

themeComponent :: Props -> Preact.Element
themeComponent { theme, dispatch } =
Preact.createElement "div" { className: "theme" }
[ Preact.createElement "h1" { className: "title" } [ Preact.text "Theme Switcher" ]
, Preact.createElement "p" { className: "current-theme" } [ Preact.text $ "Current Theme: " theme ]
, Preact.createElement changeTheme { theme, dispatch } [] ]

连接 Redux 和 Preact

为了将 Redux store 与 Preact 组件连接起来,我们可以使用 `preact-redux` 包中的 `Provider` 组件。

purs
import Preact from "preact"
import React from "react"
import Redux from "preact-redux"
import Redux from "redux"
import themeComponent from "./themeComponent"

type Props = {}

main :: Props -> Preact.Element
main {} =
Preact.createElement Redux.Provider { store }
[ Preact.createElement themeComponent { theme: state.theme, dispatch } [] ]

用户登录

用户登录功能可以通过添加一个登录表单和一个 reducer 来实现。以下是登录组件和登录 reducer 的示例:

purs
import Preact from "preact"
import React from "react"
import Redux from "preact-redux"
import Redux from "redux"

type LoginProps = { dispatch :: Redux.Dispatch Action }

loginComponent :: LoginProps -> Preact.Element
loginComponent { dispatch } =
Preact.createElement "div" { className: "login" }
[ Preact.createElement "form" { onSubmit: _ -> dispatch logIn }
[ Preact.createElement "input" { type: "submit", value: "Log In" } [] ]
]

loginReducer :: Redux.Reducer State
loginReducer state = case _ of
Redux.Action { type: "LOG_IN" } -> { ...state, isLoggedIn: true }
Redux.Action { type: "LOG_OUT" } -> { ...state, isLoggedIn: false }
_ -> state

reducer :: Redux.Reducer State
reducer = Redux.combineReducers { theme: themeReducer, login: loginReducer }

总结

通过结合 PureScript、Preact 和 Redux,我们可以构建一个具有全局状态管理的现代前端应用。本文展示了如何使用 Redux 来管理主题切换和用户登录状态,并通过 Preact 组件来展示这些状态。这种组合提供了强大的功能,同时保持了代码的清晰和可维护性。

请注意,本文提供的代码示例仅供参考,实际应用中可能需要根据具体需求进行调整。由于 PureScript 和 Redux 的文档和社区相对较小,开发者可能需要投入额外的时间来学习和掌握这些技术。