使用 PureScript 和 Preact 开发简易计算器及历史记录功能
PureScript 是一种函数式编程语言,它基于 Haskell,旨在提供一种简洁、类型安全的编程方式。Preact 是一个轻量级的 React 实现,它专注于性能和易用性。本文将介绍如何使用 PureScript 和 Preact 来开发一个简易的计算器,该计算器支持基本的四则运算,并能够记录历史记录。
准备工作
在开始之前,请确保您已经安装了 Node.js 和 npm。接下来,我们将使用 `purs` 命令行工具来创建一个新的 PureScript 项目。
bash
purs new calculator-app
cd calculator-app
安装 Preact:
bash
npm install preact
项目结构
以下是项目的目录结构:
calculator-app/
├── src/
│ ├── Components/
│ │ ├── Calculator.purs
│ │ └── History.purs
│ ├── Main.purs
│ └── styles/
│ └── calculator.purs
├── package.json
└── purs.json
创建计算器组件
在 `src/Components/Calculator.purs` 文件中,我们将创建一个计算器组件。
purs
module Components.Calculator where
import Preact as P
import Preact.hammer as H
import Preact.hammer.react as HR
import Data.Array as Array
import Data.Maybe (Maybe(Just, Nothing))
import Data.Tuple (Tuple(Tuple2))
import Effect (Effect)
import Effect.Class (liftEffect)
import Effect.Console (log)
import Foreign.Object (Object)
import Optic.Core ((^?))
import Optic.Lens ((.~), (^.))
import Optic.Lens.Index ((ix))
import Optic.Lens.Prism (_Just)
import Optic.Lens.Traversal (_Just_, _Just__)
type State =
{ expression :: String
, result :: Maybe String
, history :: Array String
}
initialState :: State
initialState =
{ expression: ""
, result: Nothing
, history: []
}
handleClick :: String -> Effect Unit
handleClick value = do
let newState = case value of
"=" -> do
result <- liftEffect $ evaluateExpression initialState.expression
history Tuple2 Nothing initialState.history
case _Just_ newState.result of
Just result -> log $ "Result: " result
Nothing -> pure unit
modifyState newState
modifyState :: State -> Effect Unit
modifyState state = do
log $ "Expression: " state.expression
log $ "Result: " show state.result
log $ "History: " show state.history
evaluateExpression :: String -> Effect String
evaluateExpression expr = do
result String -> String -> Effect (Array String)
modifyHistory history expr result = do
pure $ Array.snoc history $ expr " = " result
render :: State -> P.Element State
render state =
P.div_
[ P.div_
[ P.div_
[ P.text state.expression
]
, P.div_
[ P.button
{ onClick: HR.of handleClick "1"
, children: [P.text "1"]
}
, P.button
{ onClick: HR.of handleClick "2"
, children: [P.text "2"]
}
-- Add more buttons for digits and operations
]
]
, P.div_
[ P.text "Result: " show state.result
]
, P.div_
[ P.text "History: "
, P.div_
[ P.text history
]
]
]
main :: Effect Unit
main = do
let state = initialState
P.render_ (render state) "app"
创建历史记录组件
在 `src/Components/History.purs` 文件中,我们将创建一个历史记录组件。
purs
module Components.History where
import Preact as P
import Preact.hammer as H
import Preact.hammer.react as HR
import Data.Array as Array
import Data.Maybe (Maybe(Just, Nothing))
import Data.Tuple (Tuple(Tuple2))
import Effect (Effect)
import Effect.Class (liftEffect)
import Effect.Console (log)
import Foreign.Object (Object)
import Optic.Core ((^?))
import Optic.Lens ((.~), (^.))
import Optic.Lens.Index ((ix))
import Optic.Lens.Prism (_Just)
import Optic.Lens.Traversal (_Just_, _Just__)
import Optic.Lens.Fold (_Just)
type State =
{ history :: Array String
}
initialState :: State
initialState =
{ history: []
}
render :: State -> P.Element State
render state =
P.div_
[ P.text "History: "
, P.div_
[ P.text history
]
]
where
history = Array.foldMap (entry -> P.text entry P.text "") state.history
main :: Effect Unit
main = do
let state = initialState
P.render_ (render state) "history"
样式
在 `src/styles/calculator.purs` 文件中,我们可以添加一些基本的样式。
purs
module styles.calculator where
import Preact as P
style :: P.Style
style =
P.style_
[ P.style "body" [P.styleProp "font-family" "Arial"]
, P.style "div" [P.styleProp "margin" "10px"]
]
主组件
在 `src/Main.purs` 文件中,我们将创建主组件,它将包含计算器和历史记录组件。
purs
module Main where
import Preact as P
import Preact.hammer as H
import Preact.hammer.react as HR
import Components.Calculator
import Components.History
import styles.calculator
main :: Effect Unit
main = do
let state = initialState
P.render_
(P.div_
[ P.div_
[ P.div_
[ P.text "Calculator"
, P.div_
[ P.div_
[ P.text "Expression: "
, P.div_
[ P.text state.expression
]
]
, P.div_
[ P.button
{ onClick: HR.of handleClick "1"
, children: [P.text "1"]
}
, P.button
{ onClick: HR.of handleClick "2"
, children: [P.text "2"]
}
-- Add more buttons for digits and operations
]
]
]
, P.div_
[ P.div_
[ P.text "Result: "
, P.div_
[ P.text "Result: " show state.result
]
]
]
]
, P.div_
[ P.div_
[ P.text "History"
]
, P.div_
[ P.div_
[ P.div_
[ P.text "History: "
]
]
]
]
)
"app"
总结
本文介绍了如何使用 PureScript 和 Preact 开发一个简易的计算器,该计算器支持基本的四则运算,并能够记录历史记录。通过使用函数式编程和组件化架构,我们可以创建一个简洁、可维护的应用程序。这个例子只是一个起点,您可以根据需要添加更多的功能和改进。
Comments NOTHING