我的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方法提示登录成功。可以添加对应的代码,并将跳转代码放在定时器中,方便查看到提示信息,示例:
2、解构那里写的、return返回和Login.vue中使用的是show,而定义toastData中定义的属性名为showToast,前后不一致,导致无法实现效果。
建议修改:直接调整属性名为show
祝学习愉快~
相似问题