You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue.js登录组件Firebase验证时Email值为undefined的解决方法

问题修复方案

你的代码存在几个关键问题导致Email值为undefined,以下是具体修复步骤:

1. 修复模板语法错误

模板中第二个<q-input>标签内错误插入了</template>,导致DOM结构断裂,v-model绑定完全失效。需要删除这个错误的闭合标签,并正确闭合<q-input>:

<!-- 错误代码 -->
<q-input           
  v-model="password"           
  </template>    
  </q-input>        

<!-- 修复后 -->
<q-input           
  v-model="password"
  type="password" <!-- 建议添加密码类型,隐藏输入内容 -->
></q-input>        

2. 移除冗余的选项式data定义

你同时在选项式data()和组合式setup()中定义了同名变量,导致作用域冲突——login函数实际调用的是setup()中未被模板绑定的局部变量,自然会是undefined。直接删除data()选项:

// 删掉这段冗余代码
data() {
  return {
    Email: '',
    password: '',
  };
},

3. 在setup中暴露响应式变量

setup()中定义的Email和password是局部变量,必须通过return暴露给模板,才能让v-model正确绑定到响应式变量上:

setup() {
  const Email = ref('');
  const password = ref('');

  // ... login函数代码

  return {
    Email, // 暴露给模板
    password, // 暴露给模板
    login
    // 删掉signup、onMainClick、hata这些未定义的无效变量
  };
}

4. 修正Firestore查询语法

query函数的第一个参数必须是集合引用,而非Firestore实例,需要先导入collection方法并修正写法:

// 先导入collection方法
import { collection } from 'firebase/firestore';

// 错误代码
const usersCollection = query(getFirestore(), 'users', where('uid', '==', user.uid));

// 修复后
const firestore = getFirestore();
const usersCollection = query(collection(firestore, 'users'), where('uid', '==', user.uid));

5. 可选:统一变量命名风格

建议将Email改为email,符合JavaScript小驼峰命名规范,避免与构造函数命名混淆:

<!-- 模板中修改 -->
<q-input v-model="email" label="邮箱"></q-input>

<!-- setup中修改 -->
const email = ref('');
// login函数中对应改为email.value
const userCredential = await signInWithEmailAndPassword(auth, email.value, password.value);

修复后的完整代码

<template>
<div class="q-pa-md" style="max-width: 500px; margin-left: 200px;" >    
   <q-form class="q-gutter-md">
     <q-input          
       v-model="email"
       label="邮箱"          
     ></q-input>    
     <q-input           
        v-model="password"
        label="密码"
        type="password"           
     ></q-input>        
     <div>
       <q-btn @click="login()" label="登录" type="button" color="red"></q-btn>
     </div>
   </q-form>    
 </div>
</template>

<script>
import { ref } from 'vue';
import { useMyStore } from 'src/stores/example-store';
import { getFirestore, collection, query, where, getDocs } from 'firebase/firestore';
import { auth } from 'src/boot/firebase';
import { getAuth, signInWithEmailAndPassword } from 'firebase/auth';

export default {
  setup() {
    const email = ref('');
    const password = ref('');

    const login = async () => {
      try {
        const authInstance = getAuth();
        const userCredential = await signInWithEmailAndPassword(authInstance, email.value, password.value);
        const user = userCredential.user;

        const firestore = getFirestore();
        const usersCollection = query(collection(firestore, 'users'), where('uid', '==', user.uid));
        const userSnapshot = await getDocs(usersCollection);

        if (userSnapshot.empty) {
          console.error('Login failed:用户不存在');
          return;
        }

        const userData = userSnapshot.docs[0].data();
        console.log('Login successful', userData);
      } catch (error) {
        console.error("Login failed:", error.message);
        console.log('当前输入的邮箱:', email.value);
      }
    };

    return {
      email,
      password,
      login
    };
  },
};
</script>

内容的提问来源于stack exchange,提问作者Ömer Gün

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 02:01:03