Uniapp去掉顶部导航栏和路由传参

一、去掉顶部导航栏

在pages.json中设置这两条参数"navigationStyle":"custom","titleView":false[注意层级不同]

如果想全局取消顶部导航栏,可以在page.json的globalStyle中设置:

"globalStyle": {
		"navigationBarTextStyle": "black",
		"navigationBarTitleText": "Ebook",
		"navigationBarBackgroundColor": "#F8F8F8",
		"backgroundColor": "#F8F8F8",
		"navigationStyle":"custom",//只看这两条其他的不用看
		"app-plus": {
				"titleView":false//只看这两条其他的不用看
		    }
	}

如果想单独去掉一个界面的导航栏,可以在pages.json中单独在那个页面的模块中设置:

{
		"path": "pages/index/index",
		"style": {
			"navigationBarTitleText": "Ebook",
			"navigationStyle":"custom"//只看这两条,其他不用看
		},
		"app-plus": {
				"titleView":false//只看这两条,其他不用看
		    }
	}

二、路由传参

提供两种思路:(1)使用vuex传参(2)导航url后面拼接参数

(1)使用vuex传参

html:

<template>
	<view @click="openContent">跳转</view>
</template>

<script>
 	export default {
        data(){
            return{
                message:1            
            }    
        }
		methods:{
			openContent(item){
				this.$store.state.contents = this.message
				uni.navigateTo({
				  	url: `/pages/contents/contents`//你写好的路由地址
				});
			}
		},
	}
</script>

<style>

</style>

vuex:

import Vue from 'vue'
import Vuex from 'vuex'


Vue.use(Vuex)

const store = new Vuex.Store({
    state: {
		contents:''
	},
})
export default store

导航到的页面:

<template>
	<view>
		<view>{{contents}}</view>
	</view>
</template>

<script>
export default{
	name:'contents',
	data(){
		return{
			contents:''
		}
	},
	onLoad: function () {
		this.contents = this.$store.state.contents//获取参数
	}
}
</script>

<style scoped>
	
</style>

(2)导航url后面拼接参数[这种方法要区分传参类型]

如果传递字符、数字类型、可以直接拼接

js:

<template>
	<view @click="openContent">跳转</view>
</template>

<script>
 	export default {
        data(){
            return{
                message:1            
            }    
        }
		methods:{
			openContent(item){
				uni.navigateTo({
				  	url: `/pages/contents/contents?message=` + this.message//拼接message
				});
			}
		},
	}
</script>

<style>

</style>

导航到的页面:

<template>
	<view>
		<view>{{contents}}</view>
	</view>
</template>

<script>
export default{
	name:'contents',
	data(){
		return{
			contents:''
		}
	},
	onLoad: function (option) {
        console.log(option.message)//option.'你起的参数名'
		this.contents  = option.message
        console.log(this.contents)
	}
}
</script>

<style scoped>
	
</style>

如果想要传递对象,需要先将对象转化为数组,导航到的页面收到参数后再转化为对象。

具体例子为:

js:

<template>
	<view @click="openContent">跳转</view>
</template>

<script>
 	export default {
        data(){
            return{
                message:[
                      {
                       id:1,
                       name:''bob' 
                    }    
                ]            
            }    
        }
		methods:{
			openContent(item){
				uni.navigateTo({
				  	url: `/pages/contents/contents?message=` + JSON.stringify(this.message)//参数以数组形式传递
				});
			}
		},
	}
</script>

<style>

</style>

导航到的页面:

<template>
	<view>
		<view>{{contents}}</view>
	</view>
</template>

<script>
export default{
	name:'contents',
	data(){
		return{
			contents:''
		}
	},
	onLoad: function (option) {
        console.log(option.message)
	}
}
</script>

<style scoped>
	
</style>

打印结果为:

 但是形式却不是对象,打印option.message[0].id或者option.message[0].name会显示undefined

需要将数组转化为对象,正确格式是这样的:

<template>
	<view>
		<view>{{contents}}</view>
	</view>
</template>

<script>
export default{
	name:'contents',
	data(){
		return{
			contents:''
		}
	},
	onLoad: function (option) {
        this.contents  = JSON.parse(option.message[0].id)//使用JSON.parse将数组转换为对象
        console.log(this.contents)
	}
}
</script>

<style scoped>
	
</style>

这样传参就结束了

推荐多练习第二种,但是第二种可能会产生很多麻烦,例如对象转化成数组正常,但是再转化为对象时出错:

 这都是不能修改的错误,可以用第二种方法练练手,出错了就用第一种方法。

分割线


发现了路由传参不报转化失败错误的方法:

//需要参数的界面

onLoad: function (option) {
			const item = JSON.parse(decodeURIComponent(option.item));
		    this.userInfo = item
			console.log(this.userInfo)
		}


//传递参数的界面
infoSearch() {
				let item = encodeURIComponent(JSON.stringify(this.userInfo))
				uni.navigateTo({
					url: '/pages/user/userInfo/userInfo?item=' + item
				});
			},

用了个encodeURIComponent()把对象参数包起来传递。

<think>我们正在讨论Uniapp的页面传参路由传参方法。根据用户引用的内容,我们可以总结出几种常见的传参方式,并补充一些其他方法。 用户引用中提到了: 1. 使用`uni.navigateTo`等路由跳转方法时,在url后面拼接参数。 2. 在目标页面的`onLoad`生命周期函数中通过options参数获取。 除此之外,Uniapp还支持其他传参方式,比如使用全局变量、Vuex状态管理、本地存储等,但这里我们重点讨论路由传参。 常见的路由跳转方法有: - uni.navigateTo: 保留当前页面,跳转到新页面(可返回) - uni.redirectTo: 关闭当前页面,跳转到新页面(不可返回) - uni.reLaunch: 关闭所有页面,打开到新页面 - uni.switchTab: 跳转到tabbar页面(会关闭其他非tabbar页面) - uni.navigateBack: 返回上一页 传参方式都是在url后面拼接查询字符串,然后在目标页面的onLoad(options)中接收。 另外,还可以通过事件总线或Vuex进行跨页面数据传递,但这不属于路由传参的范畴。 下面我们详细介绍路由传参的方法注意事项。 </think>### Uniapp页面路由传参详解 Uniapp提供了多种路由传参方式,根据引用资料[1][2][3]整理如下: #### 一、基础传参方式 1. **URL拼接传参**(最常用) ```javascript // 传递单个参数 uni.navigateTo({ url: '../detail/detail?id=123' }) // 传递多个参数 const data = { id: '001', category: 'tech', timestamp: Date.now() } uni.navigateTo({ url: `../detail/detail?payload=${encodeURIComponent(JSON.stringify(data))}` }) ``` 2. **接收参数**(必须在`onLoad`生命周期) ```javascript onLoad(options) { // 接收普通参数 console.log('ID:', options.id) // 接收JSON参数 if(options.payload) { const payload = JSON.parse(decodeURIComponent(options.payload)) console.log('完整数据:', payload) } } ``` #### 二、不同路由方法的传参限制 | **路由方法** | **参数传递特点** | **应用场景** | |--------------------|------------------------------------|-----------------------------| | `uni.navigateTo` | 可通过URL传参,页面栈保留 | 普通页面跳转 | | `uni.redirectTo` | 可通过URL传参,关闭当前页 | 登录页跳转主页 | | `uni.reLaunch` | 可通过URL传参,关闭所有页面 | 应用重启或深度跳转 | | `uni.switchTab` | **无法通过URL传参** | 切换tabBar页面 | | `uni.navigateBack` | 通过`getCurrentPages()`获取页面栈传递 | 返回前页并传递数据 | #### 三、特殊场景解决方案 1. **TabBar页面传参** ```javascript // 使用全局变量代替URL传参 getApp().globalData.tabParams = { userId: 'U1001', fromPage: 'home' } uni.switchTab({ url: '/pages/user/user' }) // 目标页面onShow中获取 onShow() { const params = getApp().globalData.tabParams if(params) { console.log('Tab参数:', params) delete getApp().globalData.tabParams // 及时清理 } } ``` 2. **页面返回传参** ```javascript // 前页设置回调 const pages = getCurrentPages() const prevPage = pages[pages.length - 2] prevPage.$vm.setReturnData({ status: 'success' }) uni.navigateBack() // 前页定义方法 methods: { setReturnData(data) { console.log('返回数据:', data) } } ``` #### 四、最佳实践与注意事项 1. **数据量控制** 参数总长度不超过2KB(小程序平台限制),复杂数据建议用全局变量或Vuex[^2] 2. **数据类型处理** ```javascript // 数字类型转换 onLoad(options) { this.id = Number(options.id) // 显式转换 } ``` 3. **安全编码** ```javascript // 防止XSS攻击 const safeString = escapeHTML(decodeURIComponent(options.input)) ``` 4. **参数失效场景** - 页面预加载时参数可能未更新 - 安卓设备URL参数中`#`会被截断 - 微信小程序`navigateBack`无法携带参数 > **关键要点**: > - 优先使用`onLoad`接收参数而非`onShow` > - 敏感数据避免URL明文传输 > - 复杂对象必须`JSON.stringify`转换[^1] > - Tab页面传参需用全局变量替代[^3]
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值