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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:44:53