网络请求可能会失败,文件权限可能会丢失……更常见的是,错误随处而见。默认情况下,我们处理每个未处理的异常或未解决的 Promise 并把错误展示出来。但是,您应该自行处理命令的 “预期” 错误。您不应该因为出现问题而中断用户流程。例如,如果网络请求失败但您可以读取缓存,那就显示缓存内容。用户可能不需要立即获得新数据。在大多数情况下,最好显示包含错误信息的 Toast。
import { Detail, showToast, Toast } from "@raycast/api";
import { useEffect, useState } from "react";
export default function Command() {
const [error, setError] = useState<Error>();
useEffect(() => {
setTimeout(() => {
setError(new Error("Booom 💥"));
}, 1000);
}, []);
useEffect(() => {
if (error) {
showToast({
style: Toast.Style.Failure,
title: "Something went wrong",
message: error.message,
});
}
}, [error]);
return <Detail markdown="Example for proper error handling" />;
}
import { List } from "@raycast/api";
import { useEffect, useState } from "react";
export default function Command() {
const [items, setItems] = useState<string[]>();
useEffect(() => {
setTimeout(() => {
setItems(["Item 1", "Item 2", "Item 3"]);
}, 1000);
}, []);
return (
<List isLoading={items === undefined}>
{items?.map((item, index) => (
<List.Item key={index} title={item} />
))}
</List>
);
}
import { Form } from "@raycast/api";
import { useState } from "react";
export default function Command() {
const [nameError, setNameError] = useState<string | undefined>();
const [passwordError, setPasswordError] = useState<string | undefined>();
function dropNameErrorIfNeeded() {
if (nameError && nameError.length > 0) {
setNameError(undefined);
}
}
function dropPasswordErrorIfNeeded() {
if (passwordError && passwordError.length > 0) {
setPasswordError(undefined);
}
}
return (
<Form>
<Form.TextField
id="nameField"
title="Full Name"
placeholder="Enter your name"
error={nameError}
onChange={dropNameErrorIfNeeded}
onBlur={(event) => {
if (event.target.value?.length == 0) {
setNameError("The field should't be empty!");
} else {
dropNameErrorIfNeeded();
}
}}
/>
<Form.PasswordField
id="password"
title="New Password"
error={passwordError}
onChange={dropPasswordErrorIfNeeded}
onBlur={(event) => {
const value = event.target.value;
if (value && value.length > 0) {
if (!validatePassword(value)) {
setPasswordError("Password should be at least 8 characters!");
} else {
dropPasswordErrorIfNeeded();
}
} else {
setPasswordError("The field should't be empty!");
}
}}
/>
<Form.TextArea id="bioTextArea" title="Add Bio" placeholder="Describe who you are" />
<Form.DatePicker id="birthDate" title="Date of Birth" />
</Form>
);
}
function validatePassword(value: string): boolean {
return value.length >= 8;
}