PureScript 语言 Preact 实现表单验证 邮箱 / 密码格式实时校验

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


阿木博主一句话概括:基于PureScript和Preact的表单验证实践:邮箱与密码格式实时校验

阿木博主为你简单介绍:
本文将探讨如何使用PureScript语言和Preact框架实现一个具有邮箱和密码格式实时校验功能的表单。我们将从项目搭建、组件设计、状态管理、实时校验逻辑以及错误处理等方面进行详细阐述。

一、项目搭建

1. 安装Node.js和npm
确保你的计算机上已经安装了Node.js和npm。这两个工具是使用PureScript和Preact的基础。

2. 创建新项目
使用以下命令创建一个新的PureScript项目:

bash
npx psc-package init --template purescript-create-react-app my-form-validation
cd my-form-validation

3. 安装依赖
在项目根目录下,运行以下命令安装Preact和相关的PureScript库:

bash
npm install preact preact-hooks

二、组件设计

1. 创建表单组件
在`src`目录下创建一个名为`Form.purs`的文件,用于定义表单组件。

purs
module Form where

import Preact as P
import PreactHooks as PH
import Effect (Effect)
import Effect.Aff (Aff)
import Effect.Class (liftEffect)
import Data.Maybe (Maybe)
import Data.Either (Either)
import Data.Tuple (Tuple)
import Data.Array (filter)
import Control.Monad.Except (runExcept)
import Validation (validateEmail, validatePassword)

type FormState =
{ email :: String
, password :: String
, emailError :: Maybe String
, passwordError :: Maybe String
}

initialState :: FormState
initialState =
{ email: ""
, password: ""
, emailError: Nothing
, passwordError: Nothing
}

formHandler :: PH.UseFormHandler String String
formHandler =
PH.mkUseFormHandler
{ initialState
, validate: validateForm
, onChange: _ -> pure unit
, onSubmit: _ -> pure unit
}

validateForm :: String -> String -> Either String (Tuple String String)
validateForm email password =
let
emailResult = validateEmail email
passwordResult = validatePassword password
in
case emailResult of
Left err -> Left err
Right _ ->
case passwordResult of
Left err -> Left err
Right _ -> Right (email, password)

render :: FormState -> P.Component ()
render state = P.div_
[ P.form
{ onSubmit: PH.handleSubmit formHandler
, onReset: PH.handleReset formHandler
}
[ P.div_
[ P.label_ ["Email: "]
, P.input
{ type: "email"
, value: state.email
, onChange: PH.handleInputChange formHandler "email"
, className: if isJust state.emailError then "invalid" else ""
}
, P.div_
[ case state.emailError of
Just err -> P.div_ [P.text err]
Nothing -> P.text ""
]
]
, P.div_
[ P.label_ ["Password: "]
, P.input
{ type: "password"
, value: state.password
, onChange: PH.handleInputChange formHandler "password"
, className: if isJust state.passwordError then "invalid" else ""
}
, P.div_
[ case state.passwordError of
Just err -> P.div_ [P.text err]
Nothing -> P.text ""
]
]
, P.button
{ type: "submit"
, disabled: not PH.isValid formHandler
}
[ P.text "Submit" ]
]
]

main :: Effect Unit
main = liftEffect do
PH.runPreact
{ node: document.getElementById "app"
, render
, formHandler
}

2. 验证函数
在`src`目录下创建一个名为`Validation.purs`的文件,用于定义邮箱和密码的验证逻辑。

purs
module Validation where

import Data.Either (Either)
import Data.String (Pattern, contains)
import Data.String.Regexp (Regex, test)

validateEmail :: String -> Either String String
validateEmail email =
if contains (Pattern "/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$/") email
then Right email
else Left "Invalid email format"

validatePassword :: String -> Either String String
validatePassword password =
if length password >= 8 && contains (Pattern "/^[a-zA-Z0-9!@$%^&()_+]/") password
then Right password
else Left "Password must be at least 8 characters long and contain a special character"

三、状态管理

在`Form.purs`文件中,我们使用了`PH.UseFormHandler`来管理表单的状态。这个函数提供了初始状态、验证函数、输入改变处理函数和提交处理函数。

四、实时校验逻辑

在`validateForm`函数中,我们首先对邮箱进行验证,如果邮箱验证失败,则返回错误信息。如果邮箱验证成功,我们再对密码进行验证。如果密码验证失败,同样返回错误信息。如果两个验证都成功,则返回一个包含邮箱和密码的元组。

五、错误处理

在`render`函数中,我们使用`case`语句来处理`emailError`和`passwordError`。如果存在错误,我们将其显示在对应的输入框下方。

六、总结

本文介绍了如何使用PureScript和Preact实现一个具有邮箱和密码格式实时校验功能的表单。通过组件设计、状态管理、实时校验逻辑以及错误处理,我们成功地实现了一个健壮的表单验证功能。在实际项目中,你可以根据需求对验证逻辑进行扩展和优化。