Vue3的非setup函数的ts (或Vue3外部导入的ts文件)为什么无法用 userRouter,以及怎么解决?

1、问题分析

问题报错:

在这里插入图片描述

2.问题原因:

userRouter是vue3的钩子函数(组合式API),不能直接用在组件外部或非setup函数内部。

3.问题解决:

方法1:
Login_bak0.ts文件代码


import { reactive,defineComponent} from "vue";
import { useRouter } from "vue-router";
interface LoginEmp {
    username?: string
    password?: string
}
export default defineComponent({
    setup(){
        let loginForm = reactive<LoginEmp>({})
        const router = useRouter();
        function toLogin() {
            router.push('/')
        }
        return{
            loginForm,
            toLogin
        }
    }
})

需要引入文件的vue代码不变 也就是还是下面


<script lang="ts">
   import login from './Login_bak0'
   export default login
</script>
<template>
  <div id="container">
    <div class="login-form">
      <el-form label-width="80px">
        <p class="title">xxxx系统</p>
        <el-form-item label="用户名" prop="username">
          <el-input
            v-model="loginForm.username"
            placeholder="请输入用户名"
          ></el-input>
        </el-form-item>

        <el-form-item label="密码" prop="password">
          <el-input
            type="password"
            v-model="loginForm.password"
            placeholder="请输入密码"
          ></el-input>
        </el-form-item>

        <el-form-item>
          <el-button class="button" type="primary" @click="toLogin"
            >登 录</el-button
          >
          <el-button class="button" type="info" @click="">重 置</el-button>
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>

<style scoped>
#container {
  padding: 10%;
  height: 410px;
  background-image: url('../../assets/bg1.jpg');
  background-repeat: no-repeat;
  background-size: cover;
}

.login-form {
  max-width: 400px;
  padding: 30px;
  margin: 0 auto;
  border: 1px solid #e0e0e0;
  border-radius: 10px;
  box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
  background-color: white;
}

.title {
  font-size: 30px;
  font-family: '楷体';
  text-align: center;
  margin-bottom: 30px;
  font-weight: bold;
}

.button {
  margin-top: 30px;
  width: 120px;
}
</style>

方法2:
Login_bak0.ts文件代码如下


import { reactive,defineComponent} from "vue";
import router from "@/router/index"; /* 存放路由的文件 */
interface LoginEmp {
    username?: string
    password?: string
}
export default defineComponent({
    setup(){
        let loginForm = reactive<LoginEmp>({})
        function toLogin() {
            router.push('/')
        }
        return{
            loginForm,
            toLogin
        }
    }
})

另:路由的文件index.ts如下:


import { createRouter, createWebHistory } from 'vue-router'

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: '/login',
      name: 'login',
      component: () => import('@/views/login/Login.vue')
    }
  ],
})

export default router

需要引入文件的vue代码不变 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱研究计算机的小陈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值