element-plus 如何在弹窗中独立管理密码输入框的明文/密文状态?

element-plus 一个弹窗里使用了form表单,其中有个密码输入框,使用show-password显示切换密码图标时,发现打开一个弹窗将密码设置成了明文,关闭弹窗打开另外一个内容,密码也依然会显示成明文。
image.png

1723171541122.png

后面有尝试过:show-password="showPassword",弹窗关闭时showPassword设置为false,打开时设置为true,然而还是没有用。

<el-dialog
      v-model="dialogVisible"
      title="新建运营商账号"
      width="450"
      class="form-dialog"
      :close-on-click-modal="showDetail"
      :before-close="handleClose"
    >
      <el-form
        ref="addFormRef"
        :rules="rules"
        :model="addForm"
        :disabled="showDetail"
        class="dialog-form"
      >
        <el-form-item label="密码" required prop="password">
          <el-input
            v-model="addForm.password"
            type="password"
            :show-password="showPassword"
            clearable
            placeholder="请输入密码"
            style="width: 100%;"
            maxlength="30"
          />
        </el-form-item>
      </el-form>
    </el-dialog>
// 关闭弹窗
const handleClose = () => {
  state.dialogVisible = false;
  state.showPassword = false;
};

// 打开弹窗
const addAccount = (formEl: FormInstance | undefined) => {
  state.dialogVisible = true;
  state.showPassword = true;
  nextTick(() => {
    if (formEl) {
      formEl.resetFields();
    }
  });
};

如何让密码框不共享明文密文这个状态?

阅读 1.8k
3 个回答

你在点击关闭的时候,或者重新打开弹窗的时候,重置一下这个密码框的状态

这个框的状态没法改变
根据源代码可知,这个是否显示密码明文是由内部变量passwordVisible进行控制的,showPassword只能开启或关闭这个功能,且开启和关闭不会重置当前状态。

所以一个实例已经生成时,你没法在外部去设置passwordVisible,没这个功能

当前可以想到的变通方式是:
你给dialogform 或者单独给password的el-input一个v-if="dialogVisible",让它隐藏时自动销毁组件,以便再次显示时能重置整个组件的状态。

这和Element-plus没什么关系,假设你有一个变量用于控制弹窗显示或隐藏,你应该在变量变化时,将用于控制密码框显示或隐藏的属性值重置.

//伪代码如下

<template>
  <el-input
    v-model="input"
    style="width: 240px"
    type="password"
    placeholder="Please input password"
    :show-password="showPwd"
  />
</template>

<script lang="ts" setup>
import { ref, watch } from 'vue'
const input = ref('')
const showPwd = ref(false)

// 弹窗变量
const dialogShow = ref(false)

watch(dialogShow, (newVal) => {
  showPwd.value = newVal;
})

// ....
</script>
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏