vue3
+ vite
+ electron
+ element-plus
创建的界面使用的 el-form
+ el-input
。
每次获取焦点之后只能输入一个字符,单独使用 el-input
没有问题,放到 el-form
里面之后就有问题了。
<template>
<div class="login-container">
<div class="login-box">
<el-card class="box-card">
<el-form ref="loginForm" :model="loginForm" :rules="rules" label-width="80px">
<el-form-item label="用户名:" prop="username">
<el-input v-model="loginForm.username"></el-input>
</el-form-item>
<el-form-item label="密码:" prop="password">
<el-input type="password" v-model="loginForm.password"></el-input>
</el-form-item>
<el-form-item class="login-btn">
<el-button type="primary" @click="handleLogin">登录</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</div>
</template>
<script setup>
import { ref, getCurrentInstance } from 'vue';
import { useRouter } from 'vue-router';
import { ElCard, ElForm, ElFormItem, ElInput, ElButton } from 'element-plus';
const { proxy } = getCurrentInstance();
const router = useRouter();
const loginForm = ref({
username: '',
password: '',
});
const rules = ref({
username: [{ required: true, trigger: "blur", message: "请输入您的账号" }],
password: [{ required: true, trigger: "blur", message: "请输入您的密码" }],
});
const handleLogin = () => {
proxy.$refs['loginForm'].validate((valid) => {
if (valid) {
router.push({ name: 'Interface' });
}
});
};
</script>
单独使用 el-input
,不用el-form
没有问题,使用 el-form
+ 原生input
也没问题。
ref 的使用:ref 创建的是一个包含 value 的响应式引用。el-input 需要访问直接的字符串值(如 username),而不是 loginForm.value.username。
Vue 的响应式系统:el-input 组件在内部使用 Vue 的响应式系统。如果给它传递的是 ref 的引用,它可能无法正确处理这个引用,从而导致只能输入一个字符。
reactive 的优势:使用 reactive 创建的对象本身就是响应式的,直接可以通过 loginForm.username 访问属性,el-input 能够正常识别并更新这个值。
我对你的代码做了一些改进。主要是确保 loginForm 使用 reactive 而不是 ref,并且去掉了 ref 属性。以下是改进后的代码:
<template>
<div class="login-container">
<div class="login-box">
<el-card class="box-card">
<el-form :model="loginForm" :rules="rules" label-width="80px">
<el-form-item label="用户名:" prop="username">
<el-input v-model="loginForm.username"></el-input>
</el-form-item>
<el-form-item label="密码:" prop="password">
<el-input type="password" v-model="loginForm.password"></el-input>
</el-form-item>
<el-form-item class="login-btn">
<el-button type="primary" @click="handleLogin">登录</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</div>
</template>
<script setup>
import { reactive, getCurrentInstance } from 'vue';
import { useRouter } from 'vue-router';
import { ElCard, ElForm, ElFormItem, ElInput, ElButton } from 'element-plus';
const { proxy } = getCurrentInstance();
const router = useRouter();
const loginForm = reactive({
username: '',
password: '',
});
const rules = reactive({
username: [{ required: true, trigger: "blur", message: "请输入您的账号" }],
password: [{ required: true, trigger: "blur", message: "请输入您的密码" }],
});
const handleLogin = () => {
proxy.$refs['loginForm'].validate((valid) => {
if (valid) {
router.push({ name: 'Interface' });
}
});
};
</script>
这样修改后,loginForm 使用 reactive 创建,并且去掉了 ref 属性,避免了可能的冲突。
很简单,你的 $refs
注册的key和你 ref()
声明的 loginForm
重合了。
在组件实例挂载之后会被覆盖成 el-form
的模板引用,所以你没办法修改 loginForm.username
了。
el-input
是 受控组件 所以会有OP你说的问题现象。要解决的话,改成不一样的key就行了。
另外最好不要再使用 getCurrentInstance
获取当前组件实例了。
<template>
<div class="login-container">
<div class="login-box">
<el-card class="box-card">
<el-form ref="elFormRef" :model="loginForm" :rules="rules" label-width="80px">
<el-form-item label="用户名:" prop="username">
<el-input v-model="loginForm.username"></el-input>
</el-form-item>
<el-form-item label="密码:" prop="password">
<el-input type="password" v-model="loginForm.password"></el-input>
</el-form-item>
<el-form-item class="login-btn">
<el-button type="primary" @click="handleLogin">登录</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue';
import { ElCard, ElForm, ElFormItem, ElInput, ElButton } from 'element-plus';
const loginForm = ref({
username: '',
password: '',
});
const rules = ref({
username: [{ required: true, trigger: "blur", message: "请输入您的账号" }],
password: [{ required: true, trigger: "blur", message: "请输入您的密码" }],
});
const elFormRef = ref(null)
const handleLogin = () => {
elFormRef.value.validate((valid) => {
if (valid) {
router.push({ name: 'Interface' });
}
});
};
</script>
请问大佬们,如何对一行el-form-item内多个el-input输入框的进行只能输入整数或者小数的校验?
使用vue3 element-plus el-calendar 点击某一格选中后能获取到对应的时间,element-plus文档里面没有change时间
el-input框输入的问题 el-input是通过封装的,在data里面是这样使用的,代码如下 userName: { }, 现在的赋值 const res = await getCompanyInfo() res.data.companyCode是接口api返回来的数据固定的字段,显示在页面上 现在的需求是 返回来的字段是固定的不能让客户删除,只能在固定的字段后面添加跟删除,现在想要在inpu
defineExpose如何处理ref获取到的组件方法。如把el-form的方法暴露出去。通过ref获取。但是defineExpose处理时。el-form还未获取到。导致暴露为null 如下一个form 通过ref获取 暴露给defineExpose由于此时formRef.value为null.暴露失败目前是通过自定义方法调用暴露。有好方法处理这个问题吗
共同点是两者都可以下拉
<el-checkbox v-model="checked" label="Option 1" size="large" /> 期望 checked 的值是 0 和 1(0 表示 true,1 表示 false)。 怎么绑定这个值呢? 尝试过: <el-checkbox :value="checked" label="Option 1" size="large" />