弹出框

Siona

弹出框

1. 弹出框子组件

<template>
  <div>
    <a-modal v-model:visible="isOpen" title="修改推荐人" @ok="handleOk" @cancel="handleCancel">
    </a-modal>
  </div>
</template>

<script setup>
  import { defineEmits, defineProps, ref } from 'vue'
  import { message } from 'ant-design-vue'
  import InviteApi from '@/api/platform/InviteApi'
  
  const props = defineProps({
    open: Boolean,
    inviteHistoryNo: String
  })

  const emit = defineEmits(['modalOkClick'])

  const isOpen = ref(props.open)
  const historyNo = ref(props.inviteHistoryNo)

  const handleOk = async () => {
    isOpen.value = false

    const params = {
      historyNo: historyNo.value
    }

    const { data: result } = await InviteApi.changeInviter(params)
    if (result.status) {
      emit('modalOkClick', false)
    } else {
      message.error(result.msg)
    }
  }

  const handleCancel = () => {
    emit('modalOkClick', false)
  }

</script>

<style scoped lang="less">

</style>

2. 父组件


<template>
  <div>
    <KeepAlive>
      <DzChargeListInviterModal :key="Date.now()" :open="openInviterModal" :inviteHistoryNo="inviteHistoryNo"
                                @ModalOkClick="handleModalOkClick"/>
    </KeepAlive>
  </div>
</template>

<script setup>
  import DzChargeListInviterModal from '@/views/platform/dz/DzChargeListInviterModal.vue'
  import {ref} from "vue";

  const openInviterModal = ref(false)
  const inviteHistoryNo = ref('')

  const showInviterModal =  (historyNo) => {
    openInviterModal.value = true
    inviteHistoryNo.value = historyNo
  }
  
  const handleModalOkClick = (flag) => {
    openInviterModal.value = flag
  }
</script>

watch 监听 props 的变化,确保局部状态和父组件保持同步

1. 子组件

<template>
  <a-modal v-model:visible="isOpen"
           title="修改密码"
           @ok="handleOk"
           @cancel="handleCancel">
    <a-form
      ref="formRef"
      :model="changePwdFormState"
      :rules="rules"
      v-bind="layout"
    >
      <a-form-item has-feedback label="旧密码" name="oldPass">
        <a-input-password placeholder="至少 6 位的字母和数字组合" v-model:value="changePwdFormState.oldPass"/>
      </a-form-item>
      <a-form-item has-feedback label="新密码" name="newPass">
        <a-input-password placeholder="至少 6 位的字母和数字组合" v-model:value="changePwdFormState.newPass"/>
      </a-form-item>
      <a-form-item has-feedback label="确认密码" name="checkPass">
        <a-input-password placeholder="至少 6 位的字母和数字组合" v-model:value="changePwdFormState.checkPass"/>
      </a-form-item>
    </a-form>
  </a-modal>
</template>

<script setup>

import { ref, defineProps, defineEmits, reactive, watch } from 'vue'
import SysUserApi from '@/api/system/SysUser'
import { message } from 'ant-design-vue'

const props = defineProps({
  open: Boolean
})

const emit = defineEmits(['modalOkClick'])

const isOpen = ref(props.open)

const formRef = ref()
const changePwdFormState = reactive({
  oldPass: '',
  newPass: '',
  checkPass: ''
})

const layout = {
  labelCol: {
    span: 4
  },
  wrapperCol: {
    span: 14
  }
}

// const validatePass = async (_rule, value) => {
//   if (value === '') {
//     return Promise.reject(new Error('请输入密码'))
//   } else if (changePwdFormState.newPass.match(/^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]{6,}$/)) {
//     console.log('验证新密码3333')
//     if (changePwdFormState.checkPass !== '') {
//       console.log('验证新密码')
//       await formRef.value.validateFields('checkPass')
//     } else {
//       return Promise.reject(new Error('请输入正确的密码'))
//     }
//     return Promise.resolve()
//   }
// }

const validatePass2 = async (_rule, value) => {
  if (value === '') {
    return Promise.reject(new Error('请再次输入密码'))
  } else if (value !== changePwdFormState.newPass) {
    return Promise.reject(new Error('两次输入的密码不一致'))
  } else {
    return Promise.resolve()
  }
}

const rules = {
  newPass: [
    {
      required: true,
      message: '请输入正确的密码',
      // validator: validatePass,
      trigger: 'change',
      pattern: /^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]{6,}$/
    }
  ],
  checkPass: [
    {
      validator: validatePass2,
      trigger: 'change'
    }
  ]
}

/**
 * 修改用户密码
 */
const changePwdSysUser = async () => {
  const params = {
    oldPwd: changePwdFormState.oldPass,
    newPwd: changePwdFormState.newPass,
    confirmPwd: changePwdFormState.checkPass
  }

  const { data: result } = await SysUserApi.changePwdSysUser(params)
  if (result.status) {
    message.success('修改成功')
    emit('modalOkClick', false)
  } else {
    message.error(result.msg)
  }
}

const handleOk = values => {
  changePwdSysUser()
}

const handleCancel = () => {
  emit('modalOkClick', false)
}

// 监听 props 的变化,确保局部状态和父组件保持同步
watch(() => props.open, (newVal) => {
  console.log('isOpen.value   ', isOpen.value)
  console.log('newVal    ', newVal)
  if (formRef.value) {
    formRef.value.resetFields()
  }
  isOpen.value = newVal
}, { deep: true })

</script>

<style scoped lang="less">

</style>

2. 父组件

不需要使用 <KeepAlive>,直接在子组件对话框中重置表单内容即可。

<template>
  <div class="userinfo-container">
    <div>
      <span class="label-title">登录用户</span>
      <span class="label-content">{{ userName }}</span>
    </div>
    <div>
      <span class="label-title">系统角色</span>
      <div class="label-content">
        <a-tag :color="tagColor[index % tagColor.length]" v-for="(item, index) in userRole" :key="index">{{ item }}</a-tag>
      </div>
    </div>
    <div>
      <span class="label-title">账户安全</span>
      <span class="modify-password" @click="showModifyPasswordModal">修改密码</span>
    </div>
  </div>
  <ModifyPassword :open="isShowPasswordModal" @ModalOkClick="handleModalOkClick"/>
</template>

<script setup>
import ModifyPassword from '@/views/system/ModifyPassword.vue'
import { onMounted, ref } from 'vue'
import SysUserApi from '@/api/system/SysUser'
import { message } from 'ant-design-vue'

const tagColor = ['pink', 'green', 'orange', 'blue', 'purple', 'cyan', 'red']
const userRole = ref([])
const userName = ref('')

/**
 * 用户信息
 */
const getUserInfo = async () => {
  const { data: result } = await SysUserApi.getUserInfo()
  if (result.status) {
    userName.value = result.data.userName
    userRole.value = result.data.roleName
  } else {
    message.error(result.msg)
  }
}

onMounted(() => {
  getUserInfo()
})

const isShowPasswordModal = ref(false)

const showModifyPasswordModal = () => {
  isShowPasswordModal.value = true
}

const handleModalOkClick = (flag) => {
  isShowPasswordModal.value = flag
}

</script>

<style scoped lang="less">

</style>
Last Updated 9/23/2024, 8:33:14 AM