我的showToast无法显示弹窗

来源:3-9 Setup函数的职责以及注册功能的实现(2)

Alslo

2023-02-21 01:41:23

填写正确接口地址的时候,可以完成页面跳转,但是也是无法显示showToast
接口改错之后,showtoast的提示框依旧显示不出来
我看了一遍Toast View.vue的代码,没看出来错误

相关截图:

图片描述
图片描述
图片描述

相关代码:

<template>
  <div class="wrapper">
    <img class="wrapper__img" src="http://www.dell-lee.com/imgs/vue3/user.png" />
    <div class="wrapper__input">
      <input
        class="wrapper__input__content"
        placeholder="请输入用户名"
        v-model="username"
      />
    </div>
    <div class="wrapper__input">
      <input
        type="password"
        class="wrapper__input__content"
        placeholder="请输入密码"
        v-model="password"
        autocomplete="new-password"
        />
    </div>
    <div class="wrapper__login-button" @click="handleLogin">登录</div>
    <!-- <router-link :to="{ name: 'Register' }">
      <div class="wrapper__login-link">立即注册</div>
    </router-link> -->
    <div class="wrapper__login-link" @click="handleToRegisterClick" >立即注册</div>
  </div>
  <Toast v-if="show" :message="toastMessage" />
</template>

<script>
import { reactive, toRefs } from 'vue'
import { useRouter } from 'vue-router'
import { post } from '../../utils/request'
import ToastView, { useToastEffect } from '../../components/ToastView.vue'

// 点击登录接口逻辑
const useLoginEffect = (showToast) => {
  const router = useRouter()
  const data = reactive({ username: '', password: '' })
  // 点击登录,通过向 axios 传递相关配置来创建请求
  // axios是在封装的post里面进行导入的
  // async 和 await 实现异步操作
  const handleLogin = async () => {
    try {
      const result = await post('/api/user/login123', {
        username: data.username,
        password: data.password
      })
      if (result?.errno === 0) {
        localStorage.isLogin = true
        // 告诉路由重新做一次页面跳转
        router.push({ name: 'Home' })
      } else {
        showToast('登陆失败')
      }
    } catch (e) {
      showToast('请求失败')
    }
  }
  const { username, password } = toRefs(data)
  return { username, password, handleLogin }
}

// 跳转注册逻辑
const useToRegisterEffect = () => {
  const router = useRouter()
  const handleToRegisterClick = () => {
    router.push({ name: 'Register' })
  }
  return { handleToRegisterClick }
}

export default {
  name: 'LoginView',
  components: { Toast: ToastView },
  // setup职责就是告诉你,代码执行的流程
  setup () {
    const { show, toastMessage, showToast } = useToastEffect()
    const { username, password, handleLogin } = useLoginEffect(showToast)
    const { handleToRegisterClick } = useToRegisterEffect()
    return {
      username,
      password,
      handleLogin,
      show,
      toastMessage,
      showToast,
      handleToRegisterClick
    }
  }
}
</script>

<style lang="scss" scoped>
@import '../../style/viriables.scss';
.wrapper {
  position: absolute;
  top: 50%;
  left: 0;
  right: 0;
  transform: translateY(-50%);
  &__img {
    display: block;
    margin: 0 auto .4rem auto;
    width: .66rem;
    height: .66rem;
  }
  &__input {
    height: .48rem;
    margin: 0 .4rem .16rem .4rem;
    padding: 0 .16rem;
    background: #F9F9F9;
    border: 1px solid rgba(0,0,0,0.10);
    border-radius: 6px;
    &__content {
      line-height: .48rem;
      border: none;
      outline: none;
      width: 100%;
      background: none;
      font-size: .16rem;
      &::placeholder {
        color: $content-notice-fontcolor;
      }
    }
  }
  &__login-button {
    margin: .32rem .4rem .16rem .4rem;
    line-height: .48rem;
    background: #0091FF;
    box-shadow: 0 .04rem .08rem 0 rgba(0,145,255,0.32);
    border-radius: 4px;
    color: #fff;
    font-size: .16rem;
    text-align: center;
  }
  &__login-link {
    text-align: center;
    font-size: 14px;
    color: $content-notice-fontcolor;
  }
}
</style>

相关代码:

<template>
  <div class="toast">{{ message }}</div>
</template>

<script>
import { reactive, toRefs } from 'vue'
export default {
  props: ['message']
}
export const useToastEffect = () => {
  const toastData = reactive({
    showToast: false,
    toastMessage: ''
  })
  // 是否显示Toast函数
  const showToast = (message) => {
    toastData.showToast = true
    toastData.toastMessage = message
    setTimeout(() => {
      toastData.showToast = false
      toastData.toastMessage = ''
    }, 2000)
  }
  const { show, toastMessage } = toRefs(toastData)
  return { show, toastMessage, showToast }
}
</script>

<style lang="scss" scoped>
.toast {
  position: fixed;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  padding: .1rem;
  background: rgba(0, 0, 0, .35);
  border-radius: .05rem;
  color: #fff;
}
</style>

写回答

1回答

好帮手慕慕子

2023-02-21

同学你好,问题解答如下:

1、在完成页面成功跳转的逻辑中并没有调用showToast方法提示登录成功。可以添加对应的代码,并将跳转代码放在定时器中,方便查看到提示信息,示例:

https://img.mukewang.com/climg/63f4249c09c7cd7e08740566.jpg

2、解构那里写的、return返回和Login.vue中使用的是show,而定义toastData中定义的属性名为showToast,前后不一致,导致无法实现效果。

建议修改:直接调整属性名为show

https://img.mukewang.com/climg/63f4253709214c5e09840892.jpg

祝学习愉快~

0

0 学习 · 17877 问题

查看课程