可交互输入(Prompt)
引言
在实际开发过程中,我们可能会需要用户输入必填参数,或者需要用户确认操作,才能继续执行函数,为此, Zhin 在**会话(Session)**上提供了一个 prompt
对象,用于接收用户下一次输入的内容,具体用例如下:
案例
typescript
import { Context } from "zhin";
export function install(ctx: Context) {
ctx
.command("del [id:number]")
.desc("删除用户")
.action(async ({ session }, id) => {
if (!id) id = await session.prompt.number("请输入你要删除的用户ID");
const confirm = await session.prompt.confirm(`确认删除用户(${id})么?`);
if (confirm) {
// 删除用户
return "删除成功";
}
return "已取消";
});
}
聊天记录
当然,prompt 可以支持的交互不仅与 number 和 confirm,下面将详细介绍有那些交互输入的类型
可交互输入的类型
1.text
- 输出一条提示信息,提示用户输入一行文本
typescript
const name = session.prompt.text("请输入姓名");
2.number
- 输出一条提示信息,提示用户输入一个数字
typescript
const age = session.prompt.number("请输入年龄");
3.date
- 输入一条提示信息,提示用户输入一个日期
typescript
const birthDay = session.prompt.date("请输入出生年月日");
4.regexp
- 输入一条提示信息,提示用户输入一个正则表达式
typescript
const reg = session.prompt.regexp("请输入一个正则表达式");
5.confirm
- 输入一条提示信息,提示用户是否确认
typescript
const isAdult = session.prompt.confirm("是否成年");
6.list
- 输入一条提示信息,提示用户输入一个指定类型的list
typescript
const hobbies = session.prompt.list("请输入你的兴趣爱好", {
child_type: "text",
});
7.select
- 输入一条提示信息,提示用户选择一个或多个给出选项的值
typescript
const selctedList = session.prompt.select("请选择你喜欢的水果", {
child_type: "text",
multiple: true, // 不传则为单选
options: [
{ label: "苹果", value: "apple" },
{ label: "香蕉", value: "banana" },
{ label: "橙子", value: "orange" },
],
});
8.组合成对象使用 (prompts)
除了上述单条单条的让用户输入,Zhin 还允许,你将配置组合成一个对象,让用户依次输入,最后组装成一个对象返回。
我们将上述7个例子组装在一起后,试试效果
typescript
import { Context } from "zhin";
export function install(ctx: Context) {
ctx
.command("collect")
.desc("采集用户信息")
.action(async ({ session }, id) => {
const userInfo = await session.prompt.prompts({
name: { type: "text", message: "请输入姓名" },
age: { type: "number", message: "请输入年龄" },
birthDay: { type: "date", message: "请输入出生年月日" },
reg: { type: "regexp", message: "请输入一个正则表达式" },
isAdult: { type: "confirm", message: "是否成年" },
hobbies: {
type: "list",
child_type: "text",
message: "请输入你的兴趣爱好",
},
likeFruits: {
type: "select",
child_type: "text",
message: "请选择你喜欢的水果",
multiple: true,
options: [
{ label: "苹果", value: "apple" },
{ label: "香蕉", value: "banana" },
{ label: "橙子", value: "orange" },
],
},
});
return JSON.stringify(userInfo, null, 2);
});
}
聊天记录