# 🏅Day37 - React 套件應用 (3) - validate.js
Validator.js 是一個流行的 JavaScript 函式庫,專門用來進行字串驗證和清理。它提供了多種用於處理常見驗證需求的方法,像是檢查電子郵件格式、URL 格式、數字範圍等,並且還支援語言本地化,使其在國際化應用中非常有用。
[官方連結](https://validatejs.org/)
## Validator.js 常見功能
#### 驗證電子郵件格式
使用 validator.isEmail() 方法來檢查字串是否為有效的電子郵件地址。
```js
const email = "example@example.com";
if (validator.isEmail(email)) {
console.log("有效的電子郵件地址");
} else {
console.log("無效的電子郵件地址");
}
```
#### 驗證 URL 格式
使用 validator.isURL() 方法來檢查字串是否為有效的 URL。
```js
const url = "https://www.example.com";
if (validator.isURL(url)) {
console.log("有效的 URL");
} else {
console.log("無效的 URL");
}
```
#### 檢查是否為數字
使用 validator.isNumeric() 方法來檢查字串是否包含數字。
```js
const numString = "12345";
if (validator.isNumeric(numString)) {
console.log("是數字");
} else {
console.log("不是數字");
}
```
#### 檢查字串是否符合正則表達式
使用 validator.matches() 方法來檢查字串是否符合指定的正則表達式。
```js
const password = "Password123";
const regex = /^(?=.*[A-Z])(?=.*\d)/; // 至少一個大寫字母和一個數字
if (validator.matches(password, regex)) {
console.log("密碼格式正確");
} else {
console.log("密碼格式錯誤");
}
```
#### 檢查是否為日期格式
使用 validator.isDate() 方法來檢查字串是否為有效的日期格式。
```js
const date = "2024-11-16";
if (validator.isDate(date)) {
console.log("有效的日期");
} else {
console.log("無效的日期");
}
```
這邊也提供一個實際範例給同學參考:
```js
const { useState } = React;
function App() {
const [formData, setFormData] = useState({ name: "", email: "" });
const [errors, setErrors] = useState({ name: "", email: "" });
// 處理表單提交
const handleSubmit = (e) => {
e.preventDefault();
const newErrors = validateForm();
if (Object.keys(newErrors).length === 0) {
alert("表單提交成功!");
} else {
setErrors(newErrors);
}
};
// 驗證表單
const validateForm = () => {
const newErrors = {};
// 檢查姓名是否為空
if (!formData.name.trim()) {
newErrors.name = "姓名是必填欄位";
}
// 使用 window.validator 檢查 email 格式
if (!window.validator.isEmail(formData.email)) {
newErrors.email = "無效的電子郵件格式";
}
return newErrors;
};
// 處理表單欄位更改
const handleChange = (e) => {
const { name, value } = e.target;
setFormData({ ...formData, [name]: value });
setErrors({ ...errors, [name]: "" }); // 清除欄位錯誤
};
return (
<div style={{ maxWidth: "400px", margin: "auto", padding: "20px" }}>
<h2>註冊表單</h2>
<form onSubmit={handleSubmit}>
<div style={{ marginBottom: "10px" }}>
<label>
姓名:
<input
type="text"
name="name"
value={formData.name}
onChange={handleChange}
/>
</label>
{errors.name && <p style={{ color: "red" }}>{errors.name}</p>}
</div>
<div style={{ marginBottom: "10px" }}>
<label>
電子郵件:
<input
type="email"
name="email"
value={formData.email}
onChange={handleChange}
/>
</label>
{errors.email && <p style={{ color: "red" }}>{errors.email}</p>}
</div>
<button type="submit">提交</button>
</form>
</div>
);
}
ReactDOM.render(<App />, document.getElementById("root"));
```
## 題目
請複製 (右下角 fork)這個[範例](https://codepen.io/yen-kg/pen/ZEgZeZw?editors=1010),並且完成下面條件:
1. 請替 email 跟密碼欄位加上 validator 的驗證。
2. email 若不符合規則的話請利用 setEmailError 並加上「請輸入有效的電子郵件地址」的錯誤文字提示。
3. 密碼需要加上「最少六個字」的規則,若不符合規則的話請利用 setPasswordError 並加上「密碼至少需要6個字」的錯誤文字提示。
4. 點擊提交按鈕,欄位都有成功驗證時,請利用 alert 顯示「表單提交成功!」。
<!-- 解答:
```
const handleSubmit = (event) => {
event.preventDefault();
if (!validator.isEmail(email)) {
setEmailError('請輸入有效的電子郵件地址');
} else {
setEmailError('');
}
if (!validator.isLength(password, { min: 6 })) {
setPasswordError('密碼至少需要6個字');
} else {
setPasswordError('');
}
if (validator.isEmail(email) && validator.isLength(password, { min: 6 })) {
alert('表單提交成功!');
}
};
```
-->
| Name | Codepen |
| -------- | -------- |
| 7lun | [codepen](https://codepen.io/mfyvqhsn-the-bold/pen/ZYOamrM?editors=1010) |
| Rogan | [codepen](https://codepen.io/RoganHsu/pen/azZGaaM?editors=1011) |
| Nooooora | [CodePen](https://codepen.io/Nora-Ch/pen/azZGaeg?editors=1010)|
| Jin | [CodePen](https://codepen.io/Jin-L/pen/azZGRze)|
| Tetsu |[Codepen](https://codepen.io/ttgchang/pen/OPXZodp)|
| Chia |[Codepen](https://codepen.io/Chia-the-encoder/pen/myELQyL)|
| Eric | [Codepen](https://codepen.io/wc-su/pen/myELaZr) |
| andy | [Codepen](https://codepen.io/ewnblckz-the-styleful/pen/jErxdMp?editors=0011) |
| RUDY | [Codepen](https://codepen.io/Rudy-crw/pen/pvbVQxb?editors=0011) |
|TWLeoC|[Codepen](https://codepen.io/TWLeoC/pen/ByzxMOV?editors=0010)|
| 地瓜 |[Codepen](https://codepen.io/ChippyYU/pen/LEZmvLa?editors=1010)|
| Melanie |[Codepen](https://codepen.io/pnrcspte-the-animator/pen/GgqdaYy)|
| 平平 |[Codepen](https://codepen.io/ypinpin/pen/ogLdray)|
| 老屠 |[Codepen](https://codepen.io/fsgfxvlb-the-selector/pen/pvbVXev?editors=0011)|
| 小懿 |[Codepen](https://codepen.io/YT-the-vuer/pen/bNeKbNo?editors=0010)|
| cks40660 |[Codepen](https://codepen.io/CKS40660/pen/MYeXWyw)|
|社子畢卡索|[Codepen](https://codepen.io/pen?template=dPXKPzL)|
|Percy|[Codepen](https://codepen.io/Percy-Ku/pen/MYeXaaY)|
| Jenna |[Codepen](https://codepen.io/abiscc14/pen/jErKraO)|
| kashiwatei |[Codepen](https://codepen.io/kashiwatei/pen/wBWXWEV?editors=1010)|
| wind |[Codepen](https://codepen.io/wind7y/pen/ZYORLyQ) |
| 星雪糖 |[Codepen](https://codepen.io/vfpofbgm-the-scripter/pen/QwEBGZx?editors=0010) |
| Miikaa | [codepen](https://codepen.io/Miikaa/pen/GgqBMNZ) |
| Eileen | [codepen](https://codepen.io/Eileen-io/pen/LEZrrrG) |
| 7Red | [Codepen](https://codepen.io/cch2655/pen/VYjGgqY) |