UNPKG

@vrx-arco/pro-components

Version:

<p align="center"> <img src="https://vrx-arco.github.io/arco-design-pro/favicon.svg" width="200" height="250"> </p>

202 lines (201 loc) 5.93 kB
import { defineComponent, ref, createVNode, Fragment, mergeProps, createTextVNode, unref, toRaw } from "vue"; import { Form, Input, Space, Checkbox, Link, Button, Message } from "@arco-design/web-vue"; import { useToggle } from "@vueuse/core"; import { controlVModel } from "@vrx-arco/use"; import IconLock from "@vrx-arco/icons-vue/IconLock"; import IconUser from "@vrx-arco/icons-vue/IconUser"; import { style } from "../style/var.mjs"; import { loginFormEmits } from "./config.mjs"; const LoginForm = /* @__PURE__ */ defineComponent({ name: "vrx-arco-login-form", props: { forget: { type: Boolean, default: false }, register: { type: Boolean, default: false }, remember: { type: Boolean, default: false }, /** * 标题 */ title: String, /** * 副标题 */ subtitle: String, onSubmit: Function, /** * 是否使用内置消息提示组件 */ submitNotice: { type: Boolean, default: false }, /** * 传入任何数据外部受控表单数据 */ model: Object }, emits: loginFormEmits(), setup: (props, { slots, expose, emit }) => { const { bemClass } = style("login-form"); const model = controlVModel(props, "model", emit, () => ({ username: "", password: "" })); const rules = ref({ username: { required: true, message: "用户名不能为空" }, password: { required: true, message: "密码不能为空" } }); const rememberChecked = ref(false); const [loading, setLoading] = useToggle(false); const errorMessage = ref(""); const setModel = (data) => { model.value = unref(data); }; const handleSubmit = () => { const { submitNotice, onSubmit } = props; setLoading(true); errorMessage.value = ""; return onSubmit == null ? void 0 : onSubmit(toRaw(model.value), rememberChecked.value).then(() => { if (!submitNotice) { return; } Message.success("登录成功"); }).catch((err) => { if (typeof err === "string") { errorMessage.value = err; } if (err instanceof Error) { errorMessage.value = err.message; } if (!submitNotice) { return; } Message.error(errorMessage.value || "登录出错"); }).finally(() => { setLoading(false); }); }; expose({ setModel }); return () => { var _a; const { register, remember, forget, title, subtitle } = props; return createVNode("div", { "class": bemClass() }, [((_a = slots.title) == null ? void 0 : _a.call(slots)) || createVNode(Fragment, null, [createVNode("div", { "class": bemClass("__title") }, [title]), createVNode("div", { "class": bemClass("__subtitle") }, [subtitle])]), createVNode("div", { "class": bemClass("__error-msg") }, [errorMessage.value]), createVNode(Form, { "model": model.value, "rules": rules.value, "layout": "vertical", "onSubmitSuccess": handleSubmit }, { default: () => { var _a2; return [createVNode(Form.Item, { "field": "username", "hideLabel": true, "hideAsterisk": true, "validateTrigger": "input" }, { default: () => [createVNode(Input, { "modelValue": model.value.username, "onUpdate:modelValue": ($event) => model.value.username = $event, "placeholder": "请输入用户名" }, { prefix: () => createVNode(IconUser, { "class": "arco-icon" }, null) })] }), createVNode(Form.Item, { "field": "password", "hideLabel": true, "hideAsterisk": true, "validateTrigger": "input" }, { default: () => [createVNode(Input.Password, mergeProps({ "modelValue": model.value.password, "onUpdate:modelValue": ($event) => model.value.password = $event }, { placeholder: "请输入密码", allowClear: true }), { prefix: () => createVNode(IconLock, { "class": "arco-icon" }, null) })] }), (_a2 = slots.form) == null ? void 0 : _a2.call(slots, { model: model.value }), createVNode(Space, { "direction": "vertical", "size": 16 }, { default: () => [(remember || forget) && createVNode("div", { "class": bemClass("__password-actions") }, [remember && createVNode(Checkbox, { "modelValue": rememberChecked.value, "onUpdate:modelValue": ($event) => rememberChecked.value = $event }, { default: () => [createTextVNode("记住密码")] }), forget && createVNode(Link, { "onClick": () => emit("forget") }, { default: () => [createTextVNode("忘记密码")] })]), createVNode(Button, { "type": "primary", "htmlType": "submit", "long": true, "loading": loading.value }, { default: () => [createTextVNode("登录")] }), register && createVNode(Button, { "type": "text", "long": true, "class": bemClass("__register-btn"), "onClick": () => emit("register") }, { default: () => [createTextVNode("注册")] })] })]; } })]); }; } }); export { LoginForm };