微信原生小程序中,以下 列表显示,最后一条数据被部分遮挡: <view class="page-c...
생성일: 2025년 2월 17일
생성일: 2025년 2월 17일
微信原生小程序中,以下 列表显示,最后一条数据被部分遮挡:
<view class="page-container data-v-3dcbeed4"> <view style="margin-bottom: 550rpx;"> <!--顶部搜索 start --> <van-search value="{{ value }}" label="" placeholder="搜索我的订单"use-action-slot
bind:change="onChange"
bind:search="onSearch"
<view slot="action" bind:tap="onClick"><van-button color="#1ABC9C" size="small">搜索</van-button></view>
</van-search>
</view> </van-cell> </van-cell-group> </van-tab> </van-tabs> <!--订单列表 end --> </view> <!-- 底部 自定义导航栏 start--> <van-tabbar active="{{ activeIndex }}" bind:change="tab_onChange" safe-area-inset-bottom active-color="#1abc9c" inactive-color="#000"> <block wx:for="{{ tabList }}" wx:key="name"> <!-- 使用 tab 的 icon、text、name 动态渲染 --> <van-tabbar-item link-type="navigateTo"> <image slot="icon" src="/static/footer/{{ item.icon }}0.png" mode="aspectFit" style="width: 30px; height: 18px;" /> <image slot="icon-active" src="/static/footer/{{ item.icon }}1.png" mode="aspectFit" style="width: 30px; height: 18px;" /> {{ item.text }}text<view class="name"><view class="icon1"><van-icon name="like" color='#1ABC9C'/></view><text class="fontwightblod">{{item.bnames}}</text> <van-tag type="success" color="#1ABC9C">{{item.bsex}}</van-tag> <van-tag type="success" color="#1ABC9C">{{item.bage}}岁</van-tag> </view> <view class="name"><view class="icon1"><van-icon name="location" color='#1ABC9C'/></view><text >{{item.yymc}} {{item.ksmc}} {{item.cw}}床</text> </view> <view class="name"><view class="icon1"><van-icon name="clock" color='#1ABC9C'/></view><text >期望到岗时间:{{item.gsj0}}~{{item.gsj1}}</text> </view> <view class="name"><view class="icon1"><van-icon name="smile" color='#1ABC9C'/></view><text >服务套餐:{{item.tcmc}}</text><text class="yuan">¥{{item.zje}}元</text></view> <view class="name flexright"><van-button type="info" size="small">护理记录</van-button><van-button type="warning" size="small">确认完成</van-button></view>
</van-tabbar> <!-- 底部 自定义导航栏 end--> </view>text</van-tabbar-item> </block>
在小程序中,如果使用了自定义底部导航(例如 van-tabbar
),常见的「最后一条数据被遮挡」问题通常和页面布局或滚动容器没有预留足够底部空间有关。下面给出几种常用的解决思路,任选其一或结合使用即可避免列表内容被底部栏覆盖。
在你的代码里,最外层容器是:
html<view class="page-container data-v-3dcbeed4"> <view style="margin-bottom: 550rpx;"> <!-- 订单列表 --> </view> <!-- 底部 自定义导航栏 --> <van-tabbar ...> ... </van-tabbar> </view>
去掉或缩小内层 view
上那种过大的 margin-bottom
值,比如把 550rpx
调小到合适的值(如 200rpx
左右),然后观察下效果;
如果你想保持较大的底部区域,但又不想让它“太空”,可以改用 padding-bottom
为页面本身留出空间。例如:
css/* page-container.wxss */ .page-container { /* 可以根据实际 UI 需要调整大小 */ padding-bottom: 200rpx; }
这样一来,页面的可滚动内容区在底部会留出额外的 200rpx 空间,避免被 tabbar 遮住。
scroll-view
并固定 tabbar如果希望列表可以在固定底部导航栏之下滚动显示,可以:
scroll-view
容器里,并设置合适的 height
或 flex: 1; overflow: auto;
van-tabbar
设为固定定位(或者直接用它的自带 safe-area-inset-bottom
即可),确保它始终在屏幕底部。示例(示意写法):
html<view class="page-container"> <scroll-view scroll-y style="height: calc(100vh - 100rpx);"> <!-- 可以视情况用 flex: 1; 处理 --> <!-- 订单列表内容 --> </scroll-view> <van-tabbar safe-area-inset-bottom active="{{ activeIndex }}" bind:change="tab_onChange" ... > ... </van-tabbar> </view>
calc(100vh - 100rpx)
或者一个你觉得合适的高度,保证 scroll-view 高度减去底部导航的高度即可。safe-area-inset-bottom
,是为了适配 iPhone X 等带有底部安全区域的机型,对普通机型同样也会适配到最底部。van-tabbar
上写固定定位,或通过其自带的样式让它“悬浮”在底部。有时遮挡问题也和 z-index
层级冲突、或缺少安全区域适配有关。
但是你这里使用了 safe-area-inset-bottom
属性,说明 Vant 组件本身就会帮你在底部留出安全区给 iPhone X 这一类机型。若依旧被遮挡,多数情况还是**本身容器滚动区域的“底部高度不够”**的问题。
padding-bottom
或者改成 scroll-view
方式)。position: fixed;
到页面底部,也需要给页面下方内容留出空白,否则列表的最后一条就会被覆盖。safe-area-inset-bottom
仅能保证适配有下巴区域的手机(如 iPhone X 系列),它并不会自动给“滚动内容”做额外的可视预留空间,所以还需要你在页面或滚动容器中手动留位。这样调整后,一般就不会再出现最后一条订单被底部导航挡住的情况了。
<view class="miaoshu">{{item.grjj}}</view>
</view>
</van-cell>
[ WXML 文件编译错误] ./pages/hugong/index.wxml
unexpected character �
20 | <view slot="title">
21 | <view class="name">{{item.names}}</view>
22 | <view class="zizhi"><text>资料认证:</text><van-tag type="primary" wx:if=“{{item.hgzrz==1}}”>护工证</van-tag><van-tag type="success" wx:if=“{{item.jkzrz==1}}”>体检报告</van-tag><van-tag type="warning" wx:if=“{{item.ok==1}}”>背景调查</van-tag></view>
| ^
23 |
24 | <view class="miaoshu">{{item.grjj}}</view>
25 |
at files://pages/hugong/index.wxml#22(env: Windows,mp,1.06.2407092; lib: 2.32.3)
根据错误信息提示 unexpected character '�'
,这是因为 WXML 编译器识别到了非法或不兼容的字符。
从你贴出来的代码里,可以看到在 wx:if
上使用了 “中文/弯引号” 而不是标准的英文双引号。例如:
html<van-tag type="primary" wx:if=“{{item.hgzrz==1}}”>护工证</van-tag> <van-tag type="success" wx:if=“{{item.jkzrz==1}}”>体检报告</van-tag> <van-tag type="warning" wx:if=“{{item.ok==1}}”>背景调查</van-tag>
这里的 “ ”
看上去像双引号,但其实是带方向的「弯引号」,会导致编译报错。
"
,或者直接使用单引号 '
也行。修正后的示例如下:
html<van-cell center wx:for="{{list}}" wx:key="index"> <view slot="icon"> <image src="{{item.xt}}" class="hugongtouxiang" /> </view> <view slot="title"> <view class="name">{{item.names}}</view> <view class="zizhi"> <text>资料认证:</text> <!-- 将 “ 更换为 " --> <van-tag type="primary" wx:if="{{item.hgzrz == 1}}">护工证</van-tag> <van-tag type="success" wx:if="{{item.jkzrz == 1}}">体检报告</van-tag> <van-tag type="warning" wx:if="{{item.ok == 1}}">背景调查</van-tag> </view> <view class="miaoshu">{{item.grjj}}</view> </view> </van-cell>
注意 wx:if="{{item.hgzrz==1}}"
中的 ==1
也要写在合法表达式内。
修复引号后再编译,就不会再出现 unexpected character
错误了。
res结果中,grjj 使用c# 的HttpUtility.UrlEncode 编码:
{"zt":1,"msg":"ok","data":[{"names":"护工1","hgzrz":1,"jkzrz":1,"ok":1,"grjj":"%25E6%258A%25A4%25E7%2590%2586%25E7%25BB%258F%25E9%25AA%258C2%25E5%25B9%25B4%25EF%25BC%258C%25E7%2594%25A8%25E5%25BF%2583%25E6%259C%258D%25E5%258A%25A1%25E8%25BF%2587118%25E4%25B8%25AA%25E5%25AE%25B6%25E5%25BA%25AD","xt":"/ads/2025-02-18-03-2610009.jpg"},{"names":"护工123","hgzrz":0,"jkzrz":0,"ok":0,"grjj":"%25E6%258A%25A4%25E7%2590%2586%25E7%25BB%258F%25E9%25AA%258C2%25E5%25B9%25B4%25EF%25BC%258C%25E7%2594%25A8%25E5%25BF%2583%25E6%259C%258D%25E5%258A%25A1%25E8%25BF%2587118%25E4%25B8%25AA%25E5%25AE%25B6%25E5%25BA%25AD","xt":"/ads/2025-02-18-03-3810063.jpg"},{"names":"jxs2-hg1mc","hgzrz":0,"jkzrz":0,"ok":0,"grjj":"%25E6%258A%25A4%25E7%2590%2586%25E7%25BB%258F%25E9%25AA%258C2%25E5%25B9%25B4%25EF%25BC%258C%25E7%2594%25A8%25E5%25BF%2583%25E6%259C%258D%25E5%258A%25A1%25E8%25BF%2587118%25E4%25B8%25AA%25E5%25AE%25B6%25E5%25BA%25AD","xt":"/ads/2025-02-18-03-4710009.jpg"}]}
以下操作时,将 grjj 使用decodeURIComponent 解码后再赋值给list
that.setData({list:res.data});
从你的返回结果可以看出,grjj
字段的值实际是**被重复编码(双重编码)**了。
UrlEncode
后,会形如 %E6%8A%A4%E7%90%86...
这类字符串;%25E6%258A%25A4...
,说明 “%
” 自身也被再次编码成了 “%25
”。因此,在小程序里如果仅用一次 decodeURIComponent
,解出来的依然还带有 “%” 的剩余编码(即第一次编码的结果)。要想得到真正的中文,需要解码两次。
当你拿到 res.data
后,对其中被双重编码的字段(grjj
)执行两次 decodeURIComponent
:
js// 假设 res.data 是这样的结构: [{ grjj: "%25E6%258A..." }, ...] res.data.forEach((item) => { // 第一次解码 let tmp = decodeURIComponent(item.grjj); // 第二次解码,得到真正的中文 item.grjj = decodeURIComponent(tmp); }); that.setData({ list: res.data });
这样就能把 %25E6%258A...
还原为真正的中文字符串(例如“护理经验2年,用心服务...”)。
如果你在 C# 后端使用了 HttpUtility.UrlEncode
,但某些环节又多 encode 了一次,才导致出现 %25
。可以追踪下:
UrlEncode
?把多余的那次编码去掉,只让 grjj
在后端经过一次正确的 UrlEncode
,这样前端只需要一次 decodeURIComponent
即可。
只要让后端或前端处理逻辑保持一致,就可以正确显示中文而不会出现 %25
之类的多余符号。
微信原生小程序中,如何实现:关闭所有页面,打开 某个 tabbar 页面
在微信小程序中,如果要“关闭所有页面”并跳转到一个 tabBar 页面,官方推荐且唯一有效的方法是使用 wx.switchTab
。
wx.reLaunch
/ wx.redirectTo
等方法不支持直接跳转到 tabBar
页面;wx.switchTab
会关闭当前所有非 tabBar 页面,并切换到指定的 tabBar 页面。下面是一个示例(假设 /pages/home/home
是配置在 app.json
里的 tabBar 页面):
jswx.switchTab({ url: '/pages/home/home' })
这样就能达到「关闭所有当前打开的普通页面,并切换到指定 tabBar 页面」的效果。
tabbar 是自定义的,不是默认的
在小程序中,只有官方 TabBar(在 app.json
里配置 "tabBar"
)才能使用 wx.switchTab
来实现「关闭非 tabBar 页面并跳转」。
但如果你使用的是自定义 tabBar(比如自己写了底部导航组件,或用了第三方组件库的 van-tabbar 等),那么就无法用 wx.switchTab
达到同样效果。
核心思路:用 wx.reLaunch
来关闭所有历史页面,并打开指定页面(该页面内有你自定义的 tabBar 逻辑)。
jswx.reLaunch({ url: '/pages/yourCustomTabbarPage/yourCustomTabbarPage' })
这样做会销毁当前所有页面栈,并重新打开 /pages/yourCustomTabbarPage/yourCustomTabbarPage
这个页面。
然后,你可以在这个页面里(或它的父级组件)加载并显示自定义的 TabBar 组件,实现类似官方 tabBar 的效果。
在 app.json
中并未声明官方 tabBar,你所有页面都是普通页面,或自行封装“底部导航”组件。
在某个页面(比如 yourCustomTabbarPage
)里引用/使用你的自定义 tabBar 组件,并根据路由或数据来设置它的当前激活项。
当你需要“关闭所有页面,切到自定义 tabBar 页面”时,直接:
js// 关闭所有页面,并重新打开目标页面 wx.reLaunch({ url: '/pages/yourCustomTabbarPage/yourCustomTabbarPage' })
小程序会销毁当前所有历史页面栈,只留下一个新的页面实例,此时该页面内的自定义 tabBar 自然会被渲染出来。
wx.switchTab
只适用于官方 tabBar:它会强制跳转到配置在 app.json
中的 tabBar 页面,并隐式地关闭栈中其他非 tabBar 页面。自定义 tabBar 无法使用此方法。wx.redirectTo
与 wx.navigateTo
:都会保留历史页面栈(或保留一部分),无法真正做到“关闭所有页面”。要想彻底清空,就需要 wx.reLaunch
。总结
wx.reLaunch
。实际测试,以下方式 只打开空白页面:
wx.reLaunch({
url: '/pages/yourCustomTabbarPage/yourCustomTabbarPage'
})
当你使用 wx.reLaunch
跳转到自定义 tabBar 页面时,结果是「空白页面」,通常是因为下面几个常见原因导致页面并未正确渲染。
app.json
中 pages
数组里有该页面路径。如果你写的是 /pages/yourCustomTabbarPage/yourCustomTabbarPage
,就需要在 app.json
里相同路径进行声明:
json{ "pages": [ "pages/yourCustomTabbarPage/yourCustomTabbarPage", ... ] }
/
。可以尝试去掉第一个斜杠,改成:
或者保持jswx.reLaunch({ url: 'pages/yourCustomTabbarPage/yourCustomTabbarPage' })
/pages/...
与 app.json
一致。最简单的办法是直接复制 app.json
里声明的路径放到 url:
后面,确保完全相同。即使路径正确,如果页面内部代码出错(例如 WXML 语法错误、JS 报错),也可能会导致空白页。可以在开发者工具的调试控制台查看是否有报错。
常见问题:
usingComponents
中正确引用。this.setData
出错。排查建议:
onLoad
、onShow
加上 console.log
,看页面是否实际执行了这些生命周期函数。如果你的页面本身只是一个空壳,主要内容都在自定义 tabBar 组件里,那么需要确保:
json
或 usingComponents
里正确引入了该自定义 tabBar 组件;<custom-tab-bar />
(示例)来渲染自定义导航栏;当 wx.reLaunch
进入该页面后,页面必须能正常显示出自定义 tabBar,否则就会看到空白。
若你只想验证自定义 tabBar 是否正常,可以先在当前页面直接展示组件,无需 wx.reLaunch
。这样能更快排查「组件本身」是否能正常渲染。如果能正常渲染,再来测试跳转逻辑。
url
是否与 app.json
完全匹配;console.log
,以确保页面生命周期函数被调用。解决好以上问题后,wx.reLaunch
通常就能够正确打开并渲染你的自定义 tabBar 页面了。