seatonwan9
2025-08-14 a0fc5b1e703769a8936fd8671ec9cdd9adfda20a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<!--
 * @Description: 
 * @Version: 2.0
 * @Autor: yuxinqiang
 * @Date: 2022-08-03 09:28:47
 * @LastEditors: yuxinqiang
 * @LastEditTime: 2022-08-03 15:00:32
-->
<template>
  <div>
    <el-form ref="userForm" class="user-info-form" :model="state.userInfoForm" :rules="rules" :labelWidth="labelWidth">
      <el-form-item label="用户名" prop="username">
        <el-input v-model="state.userInfoForm.username" readonly />
      </el-form-item>
      <el-form-item label="姓名" prop="name">
        <el-input v-model="state.userInfoForm.name" autocomplete="off" clearable />
      </el-form-item>
      <el-form-item label="邮箱" prop="email">
        <el-input type="email" v-model="state.userInfoForm.email" autocomplete="off" clearable />
      </el-form-item>
      <el-form-item label="手机号" prop="phone">
        <el-input v-model="state.userInfoForm.phone" autocomplete="off" clearable />
      </el-form-item>
    </el-form>
    <div class="form-footer">
      <el-button type="primary" @click="saveUserInfo(userForm)">保存</el-button>
    </div>
  </div>
</template>
 
<script setup lang="ts">
import { FormInstance, FormRules } from 'element-plus'
import { validatorMobile, validatorEmail, validatorName } from '@/utils/validate'
 
 
interface userInfoType {
  username: string
  name: string
  email: string
  phone: string | number
}
 
interface Props {
  userInfo: userInfoType
}
 
const props = withDefaults(defineProps<Props>(), {
  userInfo: () => {
    return {
      username: '',
      name: '',
      email: '',
      phone: ''
    }
  },
})
 
const userForm = ref<FormInstance>()
const labelWidth = ref<string>('100px')
 
interface State {
  userInfoForm: userInfoType
}
const state = reactive<State>({
  userInfoForm: {
    username: '',
    name: '',
    email: '',
    phone: ''
  }
})
 
// 将父组件中传递的个人信息赋值给本地属性,方便后面修改
state.userInfoForm = { ...props.userInfo }
 
const rules = reactive<FormRules>({
  username: [{ required: true, message: '用户名不能为空', trigger: 'blur' }],
  name: [
    { required: true, message: '姓名不能为空', trigger: 'blur' },
    { min: 2, max: 16, message: '姓名为2-16位中英文及下划线的组合', trigger: 'blur' },
    { validator: validatorName, trigger: 'blur' }
  ],
  email: [
    { required: true, message: '邮箱不能为空', trigger: 'blur' },
    { validator: validatorEmail, trigger: 'blur' }
  ],
  phone: [
    { required: true, message: '手机号不能为空', trigger: 'blur' },
    { validator: validatorMobile, trigger: 'blur' }
  ]
})
 
// 子组件与父组件的通信方法
const emits = defineEmits(['save'])
 
// 保存个人信息修改
const saveUserInfo = (formEl: FormInstance | undefined) => {
  if (!formEl) return
  formEl.validate((valid) => {
    if (valid) {
      emits('save', state.userInfoForm)
    }
  })
}
</script>
 
<style lang="scss" scoped>
// 弹窗样式
.user-info-form {
  width: 80%;
  margin: auto;
}
 
.form-footer {
  width: 100%;
  display: flex;
  justify-content: center;
}
</style>