Vue.js指令及页面标题失效问题排查与代码修复请求
问题原因分析
你的代码存在以下核心问题导致Vue指令失效:
- 缺失数据绑定:输入框未使用
v-model关联Vue实例中的email和password,插值语法里的title也未在data中定义,模板无法被正确解析。 - 重复的
<title>标签:<head>中存在两个<title>,且Vue默认不支持解析<head>内的模板语法,导致{{ title }}原样输出。 - 未定义的原生事件:按钮的
onclick="encrypt()"和密码框的onkeydown="handleKeyPress(event)"引用了不存在的函数,抛出JS错误中断Vue初始化。 - 表单数据未关联:登录函数中使用的
this.email和this.password没有和输入框绑定,请求时参数为空。
修改后的完整代码
<!DOCTYPE html> <html> <head> <title>Login Form</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="description" content=""> <meta name="author" content=""> <meta http-equiv="refresh" content="300"> <link href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i" rel="stylesheet"> <!-- Custom styles for this template--> <link href="assets/css/sb-admin-2.css" rel="stylesheet"> <link rel="apple-touch-icon" sizes="180x180" href="assets/img/favicons/apple-touch-icon.png"> <link rel="icon" type="image/png" sizes="32x32" href="assets/img/favicons/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="16x16" href="assets/img/favicons/favicon-16x16.png"> <link rel="manifest" href="assets/img/favicons/site.webmanifest"> <style> .bg-gradient-custom { background-color: #367588; background-image: linear-gradient(180deg, #367588 10%, #FFFFFF 100%); background-size: cover; } .btn-success { color: #bfe8ea; background-color: #367588; border-color: #367588; } .btn-success:hover { color: #367588; background-color: #bfe8ea; border-color: #bfe8ea; } .btn-success:focus, .btn-success.focus { color: #367588; background-color: #bfe8ea; border-color: #bfe8ea; } .btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, .show>.btn-success.dropdown-toggle { color: #367588; background-color: #bfe8ea; border-color: #bfe8ea; } .btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, .show>.btn-success.dropdown-toggle:focus { box-shadow: 0 0 0 0.2rem #bfe8ea; } .error { font-size: small; color: red; display: block; width: 100%; padding-bottom: 0.95%; font-size: 1rem; font-weight: 200; line-height: 1; background-color: #fff; } </style> </head> <body> <div id="app"> <!--start here--> <div class="container"> <!-- Outer Row --> <div class="row justify-content-center"> <div class="col-xl-10 col-lg-12 col-md-9"> <div class="card o-hidden border-0 shadow-lg my-5"> <div class="card-body p-0"> <!-- Nested Row within Card Body --> <div class="row"> <div class="col-lg-6 d-none d-lg-block bg-login-image"></div> <div class="col-lg-6"> <div class="p-5"> <div class="text-center"> <h1 class="h4 text-gray-900 mb-4"> <font color="#367588"> {{ title }} </font> </h1> </div> <form @submit.prevent="login"> <div class="form-group"> <input type="text" class="form-control form-control-user" id="email" name="email" placeholder="Enter Email" maxlength="100" v-model="email"> </div> <div class="form-group"> <input type="password" class="form-control form-control-user" id="password" name="password" placeholder="Password" maxlength="100" v-model="password"> </div> <p v-if="errorMessage" class="error">{{ errorMessage }}</p> <input class="btn btn-success btn-user btn-block" type="submit" name="btnSubmit" id="btnSubmit" value="Sign In!"/> </form> </div> <hr> <div class="text-center"> <a href="auth/forgotpassword">Forgot Password?</a> </div> <br/> </div> </div> </div> </div> </div> </div> </div> <!-- end here --> <p v-if="loggedIn">You are logged in!</p> </div> <script> new Vue({ el: '#app', data: { title: 'Login Form', email: '', password: '', errorMessage: '', loggedIn: false }, methods: { login() { const loginData = { username: this.email, password: this.password }; axios.post('/api/login', loginData) .then(response => { // Login successful this.loggedIn = true; this.errorMessage = ''; }) .catch(error => { // Invalid credentials this.errorMessage = 'Invalid email or password'; }); } } }); </script> </body> </html>
关键修改点说明
- 在Vue实例的
data中添加title字段,解决插值语法的数据源问题,同时移除<head>中重复的<title>标签。 - 给邮箱和密码输入框添加
v-model指令,实现输入数据与Vue实例数据的双向绑定。 - 移除未定义的
encrypt()和handleKeyPress()原生事件绑定,避免JS错误中断Vue运行。 - 将错误提示
{{ errorMessage }}移至表单内部,提升用户体验。
内容的提问来源于stack exchange,提问作者Tanzeem
相关产品推荐
相关产品推荐

