uniapp实现登录组件之外区域置灰并引导登录

实现需求

每个页面需要根据用户是否登录决定是否显示登陆组件,登录组件半屏底部显示,登录组件之外区域置灰,功能按钮点击之后引导提示登录.页面效果如下:

实现思路说明

设置登录组件背景颜色为灰色,将页面分成登录区域(底部)和非登陆区域(上面灰色显示部分),

置灰区域添加点击事件提示登录.最开始想的方式是点击任意置灰区域提示登录,但是发现点击事件不生效,所以换了一种实现方式,将登录提示处理放到父页面的功能按钮点击事件中,父组件引用子组件,根据登录组件是否显示调用子组件中提示登录的逻辑.登录组件不显示,父组件点击功能按钮跳转到对应页面,登录组件显示,点击功能按钮提示登录.

实现关键代码

登录组件:

bash 复制代码
<template>
	<view class="loginOut" v-if="showLogin">
		<view class="top" @click="needsLogin()"></view>
		<view class="login_class" >
			<!-- 登录描述部分 -->
			<view class="content_class" v-if="showWxAuthorWindow">
				欢迎进入AAA
			</view>
			<!-- 微信一键登录 -->
			<view class="quick_login_class" v-if="showWxAuthorWindow" @tap="login()">
				<button class="login_buttom_class">
					<text>一键登录</text>
				</button>
		
			</view>
		
			<!-- 服务协议 -->
			<view class="service_class" >
				<radio  :checked="agreeServer" @click="changeAgreeServer()"/>
				<view class="desc">我已阅读并同意</view>
				<view class="link">
					<view class="link_class" @tap="gotoWebview()">用户协议</view>
				</view>
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		name: "login",
		data() {
			return {
				// 是否显示登录窗口
				showLogin: true
			}
		},
		created() {
			// 获取登录用户信息
			let token = uni.getStorageSync("token")
			if (token) {
				this.showLogin = false
				return
			} else {
				this.showLogin = true
			}
		},
		methods: {
			needsLogin(){
			uni.showToast({
				    title:"请先登录!",
				    duration:1500,
					icon:'none'
				});
			}
		}

	}
</script>

<style lang="scss">
	@mixin height-width-setting($height, $width) {
		height:$height;
		width: $width;
	}
	.loginOut{
		@include height-width-setting(100%,100%); 
		background-color: rgb(178,178,178);
		.top{
			@include height-width-setting(55%,100%); 
			
		}
		.login_class {
			@include height-width-setting(45%,100%); 
			position: fixed;
			bottom: 0;
			right: 0;
			display: flex;
			flex-direction: column;
			background-color: #e4e7ea;
			align-items: center;
			align-content: flex-end;
		}
	}
</style>

父组件(首页):

c 复制代码
<template>
	<view class="out">
		<view class="notice" v-if="noticeInfo.length">
				<t-notice-bar :list="noticeInfo"></t-notice-bar>
		</view>
		<view class="center">
			<view class="c_in">
				<view class="c_title">
					工作
				</view>
				<view class="c_line_1" @click="goToPdfToWord">
					<image src="https://oss.abc.top/lewan/img/cai.png" mode="aspectFill"></image>
					<text>中大奖</text>
				</view>
		</view>
		<!-- 登录 -->
		<login ref="login"></login>
	</view>
</template>

<script>
	import tNoticeBar from '../../components/t-notice-bar/t-notice-bar.vue';
	import login from '../../components/login/login.vue';
	export default {
		components:{tNoticeBar,login},
		data() {
			return {
				noticeInfo:['我是滚动条']
			}
		},
		onLoad() {

		},
		methods: {
			goToPdfToWord(){
				if(this.$refs.login.showLogin){
					this.$refs.login.needsLogin()
					return
				}
				uni.switchTab({
						'/subPages/a/a',
						success: function (res) {
							console.log(res)
						},
						fail: function (e) {
							console.log(e)
						}
					})
				}
		}
	}
</script>

以上是实现过程,希望对有同样需求的同学有所帮助!

相关推荐
Aliex_git4 分钟前
性能优化 - Vue 日常实践优化
前端·javascript·vue.js·笔记·学习·性能优化
董世昌417 分钟前
添加、删除、替换、插入元素的全方法指南
java·开发语言·前端
qq_3168377513 分钟前
Element-Plus el-table lazy 自动更新子列表
前端·vue.js·elementui
xiaoxue..15 分钟前
把大模型装进自己电脑:Ollama 本地部署大模型完全指南
javascript·面试·node.js·大模型·ollama
林恒smileZAZ33 分钟前
Electron 的西天取经
前端·javascript·electron
这就是佬们吗37 分钟前
告别 Node.js 版本冲突:NVM 安装与使用全攻略
java·linux·前端·windows·node.js·mac·web
IT_陈寒41 分钟前
2024年JavaScript开发者必备的10个ES13新特性实战指南
前端·人工智能·后端
Miketutu42 分钟前
Flutter - 布局
开发语言·javascript·ecmascript
满栀58544 分钟前
基于 jQuery 实现商品列表增删改查与数据统计
前端·javascript·jquery
web小白成长日记44 分钟前
CSS 作用域隔离实战:React、Vue 与 Styled Components 的三种范式
前端·css·vue.js·react.js