找回密码
 加入怎通
查看: 225|回复: 1

小程序三级联动,实现三级分类,顶部导航栏,左侧分类栏,右侧数据列表(小程序级联选择)

[复制链接]
我来看看 发表于 2023-03-14 10:24:23 | 显示全部楼层 |阅读模式
& n6 j3 G2 b( u- y9 k& y& d

如果大家一直读石头哥的文章,或者看石头哥的视频,肯定知道,石头哥的点餐小程序有实现二级菜品或者商品分类。如下图

5 E' M0 W1 Y: Q1 D

但是有时候我们想实现三级分类,该怎么做呢,今天就来教大家如何实现三级分类。随便教下大家如何把excel数据批量的导入到云开发数据库一,老规矩,先看效果图

& d7 X8 r7 j/ @, T. f& ]+ X1 o5 @- S

先来给大家分析下原理二,原理分析首先来分析下有那三级

7 Q4 l1 Y. x( ^& b3 Z

可以看出,我们最顶部是一级菜单,左侧是二级菜单,右侧是最终的三级列表我们来理一理层级关系=宿舍楼号====宿舍号========学生聪明的人肯定知道,我们是一个宿舍楼里包含很多宿舍,宿舍里有包含很多学生。

% Z5 b! T3 r* i ]- u2 V7 V/ S

这样我们的三级就是 楼号》宿舍》学生当我们切换楼号时,就会重新获取当前楼号包含的宿舍。比如下图左为惠兰楼,右为学苑楼的数据,可以看出每个楼里的宿舍和学生信息。

/ N0 K5 H3 {: E) r" z

分析完原理,我们就来看技术实现了。三,获取分类数据这里先给大家说下,我这里是用一张表来存的所有信息

( r' d; x' \9 [& K2 T

既然是一张表存所有数据,我们就要做下分组,看数据里都有哪些楼号。3-1,借助group实现楼号分组(一级数据)

0 S1 w7 t) b. E; c5 s* ?" z- u

具体代码如下

8 G9 b. Q5 X2 T$ p# ~6 z

然后获取到的数据如下

+ t0 M: p3 ?& M3 j+ {( Z

可以看出我们一共有11个宿舍楼。就是我们顶部的这些区域

6 U6 W8 W# \9 z' S y

3-2,借助group和match实现宿舍分组(二级数据)

# R/ f, f! h$ g3 g

这个时候,我们就要根据用户选择的楼号,来对当前楼号下所有数据进行分组了

( V; W& N7 B2 I/ m

分组后的数据如下

9 u/ q9 n. r7 }0 A

可以看出,前进楼有两个宿舍3-3,借助where获取宿舍里的学生数据(三级)

+ j2 N+ r0 U3 x' u0 a: W. \

获取的数据如下

. d6 D, U5 {7 x. J, O1 c$ F

到这里我们的三级分类就实现了四,完整项目代码下面把完整项目代码,贴出来给大家4-1,wxml 2 Y4 s9 X4 A8 Y" B' l1 f 5 q4 q' B5 G( _) Q / B+ K* r6 J0 Q! w$ o& Z% u {{item._id}}# b) M3 x% S( c9 ~/ _- B7 l% w! t& l $ {* N- u2 g) D* ` Y9 n! q - M; h5 x' u7 K2 C+ i4 ~ & {- t" ^5 N* B& i2 j8 Q* w6 g( M* j$ s 4 B* f# ]* e9 V, X: u$ s $ ^) X( r; w( {$ h * T! B( G, t* h" G) }; F {{item._id}} 4 x1 ]% O* Y/ a8 W ' M. K: a9 f1 r9 B! u5 F8 ^1 W6 { : ^$ p% n, |$ E) X! X2 U) m" Q1 X8 r- h7 T' U! l% v* ? , C) [$ u7 U8 F. V0 }9 }; [% x7 P1 Z' m 7 z- J6 t- L& h( ], m # J. F3 _- z8 U+ ?# v* H! s, X: B$ h6 r. z- s: z$ n8 _ {{item.mingzi}}5 c7 j/ U% D( X. [. G3 S 9 X9 b2 p5 z% W: ^% h9 [; A; j / s1 U. x* \9 J/ v7 J8 }' W % h6 e/ b/ v8 {" Q6 T: D- T9 ^& w# H5 R- u

# x$ }+ x& z Z

4-2,wxss样式/* 导航栏布局相关 */ 3 ?" I2 a! v9 c# D# N8 G. C .navbar {/ [% s: |3 v7 x- j width: 100%;* G$ a! p# \9 A7 [, | height: 90rpx;' M% P, y9 ^& d; R" t3 B' c /* 文本不换行 */ 8 B5 ]9 }5 r e white-space: nowrap; 0 a$ z( z( I8 Q& ]) n" g display: flex;5 J4 T& R5 N- V( ~" z9 l box-sizing: border-box; + z# ~) f. x$ M0 ?/ y border-bottom: 1rpx solid #eee; ( Z. T9 i) v6 q background: #fff; 3 b; @; F8 [4 W H" B9 c align-items: center; . X: S; [& s& O( F6 q3 T" H5 R% M /* 固定在顶部 */ * _& K9 h! n9 l$ w) a position: fixed;1 J4 u. n- `' h9 T left: 0rpx;: J/ K( j) H6 X" ]6 Y* m- ` top: 0rpx;9 d, x# z# v$ z* I, A! B }! f) M" m( u0 K4 |0 n + t% l5 l/ Q( }5 R/ G& n .nav-item {7 U& h5 r' {1 k3 @ padding-left: 25rpx;$ C4 E$ |$ N l' C& x1 _ padding-right: 25rpx; 0 u% }# N# c; k3 T height: 100%; , P2 u/ P( q7 E, J2 h6 ^2 h display: inline-block; + S/ \+ N- f5 Q; F& ] /* 普通文字大小 */ 9 ~# _6 r. v# g/ S# e font-size: 28rpx; Y+ g4 S. J$ z) n- G. N0 l- _ }, v9 i7 b/ b3 q& `8 X ' J. C1 L% n. o" H0 t L: O .nav-text {; c+ J2 C. L( v width: 100%;0 L1 n7 r2 f2 w8 f( t5 I/ T8 { height: 100%; * k7 e6 F' [2 g/ Y1 B display: flex; , i' g( _6 j* e' ~2 i1 n/ | align-items: center; - L0 T, g4 R+ M% W3 g; \+ i justify-content: center;: d9 b* s" S' }5 N letter-spacing: 4rpx;( |9 u) E6 A" C: R box-sizing: border-box; 6 x5 ?+ ]/ b: c4 I4 k }6 {# M/ o% d1 d* y( y- T ! Z' } B2 Z, N! i" M) R .tab-on { 2 V) h( Z) b5 E color: #000080; : ~# c$ F1 c& U9 b3 h+ n /* 选中放大 */5 v4 W+ N5 n/ i1 m font-size: 38rpx !important;6 t9 d' }, M7 Q5 F# n; f. L font-weight: 600;4 F4 ]$ j/ y. L: `& E border-bottom: 4rpx solid #000080 !important;% R+ b' L% P* H: l/ M7 u& {4 q: t+ B6 V }7 m1 m1 C2 J' y ) O% l# d( e; M9 M& B /* 正文部分 */* z# C6 U( S0 u" Z0 a: N5 | .container { / z+ f" q6 m1 H% J2 P& z. ~ position: fixed;# p. [$ j' P. m) T, ]. d* I! } width: 100%;4 U3 P# W& n) T' J+ v# b! T6 S height: 90%; : ?5 `' q% m) U4 C top: 100rpx; K$ V+ [1 Y ^- k/ Y background-color: #FFF; 9 c, ]) q8 X* k, ~ } 5 `+ z0 n1 z% v3 P! W ; O2 T4 t) E7 T# Y6 c, F .nav_left { 6 m+ \8 b. [# J+ @8 o9 Y; E width: 25%;9 m' X4 }# F6 u. Y height: 100%; 2 B8 `" E0 |1 a' y! @2 R5 a4 F background: #F2F2F2; ( [8 H3 [ @4 Q: w, v9 \0 |* W text-align: center;# X& d C) `" v3 Y2 @5 i7 t position: absolute;$ ?$ G: I& I5 b3 t. x4 h top: 0; $ c% {6 ]: D7 E6 m3 m: A8 g3 Z left: 0;# I. o5 ?* k% P% \ } 8 ?2 v+ n3 B. J! \/ m# h, s* a7 x; N/ l, G- r .nav_left .nav_left_items {% q- `* {3 x' _4 U; S5 \ x+ r height: 100rpx; 0 r3 k1 _2 I" \* r p line-height: 100rpx;# o0 r9 g% N3 G b; b% w font-size: 28rpx; , u8 A: _; d" z% {8 S( s } ) r. C+ L8 R8 J6 X# @6 y0 W2 y4 k9 `; M `. G .nav_left .nav_left_items.active {, q% Y. A2 \. e# X; S5 u' s- r position: relative; ( P0 Y2 s- A+ N4 n8 z9 @5 O9 M background: #FFF;8 X4 U( r n4 U5 p _6 J color: #000080;5 T5 H0 S! u, w- X/ F+ F4 _ }0 s0 J/ |$ W2 `! `2 ~: B 1 l7 D/ \0 V8 ]) } .nav_left .nav_left_items.active::before {" @4 z% N+ W3 C$ f display: inline-block;; a. w0 K' r* }5 U1 E! @' ~ width: 6rpx; ; Z+ r9 Y5 q/ }# O height: 60rpx; - P- `1 ^" ]0 _, `. @$ R2 b' v8 c background: #000080; 0 P. s) v* z: ]# ]( L; X content: ;8 Z, g& y: _1 z& n8 v position: absolute;3 h$ ~: X, z+ T) u. @% s top: 20rpx; $ m7 E7 F/ B4 l: O7 S! \& E left: 0;5 J0 i. ?! c: X3 K& t% u }, S/ n$ A8 h: `, U5 G4 |6 F # \" z+ p5 m3 {5 e R9 @& f( h- u .nav_right {. Z1 \* H$ g1 Z4 L2 w4 s position: absolute;" h/ R1 r8 O& ~6 r top: 0;; S' u# O M8 U0 e( F* F6 X right: 0;- K9 @# _% O: H/ p width: 75%;! b, o* p, Z; T9 e height: 100%; 0 a& v0 {6 s7 Q- h ]8 E& r }7 m1 g! |, v" D . q, O, o7 }- [9 E8 F .nav_right .nav_right_items { ; Z3 y! U$ P& C8 E: q float: left; ( D4 q8 X% E) b1 q5 W) K* t width: 33.33%; $ J4 \( Y2 W. M0 {: f) b8 T text-align: center;% B! [. ]! Q: a padding: 30rpx 0;& }9 f8 }' ]& V& @% k }; Q0 {7 @; b8 I$ t! o( h3 C , e7 P, f! [3 Z2 [ .nav_right .nav_right_items image {9 C7 J' R9 n5 h t width: 120rpx;$ i/ v# k1 c/ B0 Q$ B* d6 R height: 160rpx;3 O9 t; g. c- A5 h4 X. S7 l }5 Q+ s) \7 ]" a O* o% t$ E1 H- \5 V/ { .nav_right .nav_right_items text { 3 d% C& z- Q4 R# ^5 ? display: block; : D2 }/ u1 p! X2 f' E+ ? margin-top: 20rpx; & r7 ]& h( f) a font-size: 28rpx; 0 w; A) Z5 v3 D, d2 [: q; @ overflow: hidden;; \5 a9 g. k! n0 ^; p white-space: nowrap;0 j) O' E/ }1 Y1 U( [ text-overflow: ellipsis; ], w8 n p( z }" x1 b3 T7 _$ ]5 f& D * s+ I9 A. f# K+ q* m .nocate {. l' W+ q% B0 k/ i0 k; m- R padding: 100rpx;+ x5 J5 O* _3 w( E! {, q' h2 G6 H text-align: center; ) p3 c" |0 P9 Z% g# F W# \ } * v T" U* B o! T4 N% T7 i* e6 { P0 ^3 F) J* K$ d .nocate image {" H- s% c9 ~/ ` width: 70rpx;1 `, ]7 H0 L7 x height: 70rpx;* `+ Z" a; {- {! o }# y* F: \+ o7 s4 B+ P % F& e! q, h( w& w .nocate text { 0 B. F1 I* {7 B& ~# b- _/ e font-size: 28rpx;9 g& P$ X' W+ b+ d! b display: block; k) y9 D$ e' o6 M8 u5 {8 Z color: #BBB; / A8 n! h# f" k+ {6 a! d } ( _' F! @% Y9 S ] + H4 s- @( S; F5 h /*隐藏滚动条*/ & \- x# m! G0 H1 [+ M' d0 ` ::-webkit-scrollbar { ' V9 X" @9 L- T1 _# {( Z" v width: 0;3 B. S. D/ b ? height: 0; ! c6 Y( [# k$ N) h# |' U, }# Z color: transparent;5 D9 m" Y9 h. ?/ g } ; `' A U& y$ ?" J3 E U' r' t4 F& C' k( y7 K* ~ .topx { . H6 w$ J. K7 ~+ ^ width: 90%; R# r: A( g7 @, k7 ] /* height: 700rpx; */ * {7 v, i; z V margin: 30rpx auto;5 W W9 W: W8 n7 { z-index: 1; # t: l. N: P) w4 X" o border-radius: 10rpx; 0 X1 M* B+ a; q background-size: cover; : t: h1 |! a5 `# E( s* o }

3 A% n. i9 V. f' n( y. S

4-3,js实现分类逻辑const db = wx.cloud.database()" K* t6 j# h. Q0 `5 l const $ = db.command.aggregate. W) b; Y0 g7 k5 f; D. K: A Page({ + w+ P6 Q2 A5 e5 |1 l5 H0 A. ~" m3 ?7 Q data: { ' o' c. G/ Z3 W$ A tabs: [],+ b. {, p% J @3 c b9 Y$ Q tabCur: 0, //默认选中 : ^3 R4 @1 e1 \9 g lefts: [], : }( X! N* R0 ?! {+ u, m2 ` leftCur: 0,* {7 [: @+ p) S1 q rights: [],' N" c" |1 _. u: _5 h & i$ M& z9 @2 e2 m3 S- E! m" o },, }& D, S2 {: _3 T# s onLoad: function (options) {0 W# d# {* h, q2 b- ~# i db.collection(demo).aggregate()& }/ h2 U7 a- H$ I! c' d .group({ 2 z2 X1 e7 }" H9 E. G1 q _id: $louhao# ?3 R/ W8 D8 q E }) " N5 k$ |8 V! \' ], U .end() 9 K, ?/ g# w1 J: K& g+ U& N .then(res => { 0 t: Y- E8 v7 \8 o7 L console.log(楼号列表, res) + l# u/ z4 f3 q3 }2 g this.setData({7 H1 p1 M" d9 N9 k/ W- T# D: D tabs: res.list$ O& B1 l! s' c V4 G5 g })# s( D, {: m* j1 p& @0 T this.sushehao(res.list[0]._id) 3 w9 S7 m7 Y* M& D' Z }) r! ^) H, X: o7 q },# P; ?1 P, y7 V+ B1 [/ m: F0 [ //加载当前楼号所有的宿舍号8 j4 a9 V# z) n E8 v sushehao() { 3 {7 n& I5 a, n( _ let louhao = this.data.tabs[this.data.tabCur]._id1 N/ L2 _/ N5 ~& f+ T" _6 D/ v: J& m db.collection(demo).aggregate() 5 V+ h* [+ n: r) y- ] .match({ 6 N0 D8 |- b2 {0 ?0 q/ h. ` louhao, T* G5 r% U/ T5 V" e+ u' J8 Z/ c }) K; q/ ?& ~9 ]0 A2 a G8 ` .group({ - s o$ ^" N: `7 Z# j _id: $sushe 1 w" s& i5 w3 N' s }) ( l- ]; ?$ T; m0 H .sort({& T' N$ A0 A: B2 I/ O4 N sushe: -1 //宿舍号升序排列4 [$ @5 a' W* X# J7 r' q }) ) `9 `4 Y! j9 o% x .end() - x1 g7 m* Q2 b# q8 c .then(res => { : Q5 ~+ W& ], i5 f5 K, v2 s7 C console.log(louhao + 宿舍号列表, res)! b8 J; j5 p9 I this.setData({ ; ]9 l' `5 Z" ?! K/ I lefts: res.list1 D& [) |* \ q0 ^6 }) Y* o })4 i7 ]( Z& R5 ]. j this.xuesheng()7 u8 Y) z6 Y; D* f* E })) p- B- V. W# H },# o( F! S) Q( I2 } //加载当前宿舍号里所有的学生. v1 I' \ W6 w% j/ U S0 u5 m xuesheng() {, u7 O# ?8 x1 Z" D let louhao = this.data.tabs[this.data.tabCur]._id 6 s5 ?: H! V, ^# L, D' B let sushe = this.data.lefts[this.data.leftCur]._id * N4 ~) C+ z! I& w$ _% ~ db.collection(demo)+ K4 `6 Y7 T# |" X& L+ h .where({' o/ N3 f; h, e! H" ` louhao,- R7 e' Y" ?' x3 ]0 t0 S1 Z sushe6 `# k4 i8 K3 ` }).get() 5 W3 O9 G5 [! U$ I .then(res => {5 B: [& t/ @" ^" h# m3 W' s/ u0 C console.log(louhao + sushe + 室学生列表, res)# f& E% D0 O0 M% w% F o this.setData({ 6 u6 g, {1 R$ @+ H( L: Y. t rights: res.data# S9 E \6 }8 {8 u2 o4 R9 p5 p0 M }) / }5 R( I1 J$ S9 m. A& n$ [0 v }) & _' E$ b: R- [; n* T+ G( x },- e4 T: T2 u! A A //顶部选择分类条目 4 E: L/ X* K4 w% k6 S5 N tabSelect(e) { 7 p% q' o5 u: N/ k; q1 b this.setData({! @# w2 F0 x7 J$ V/ x( I( y tabCur: e.currentTarget.dataset.id,+ \9 p( T. g- w f) W scrollLeft: (e.currentTarget.dataset.id - 2) * 2001 Y+ f$ y9 @% m }, success => { ) ~; y' `; h( W3 m this.sushehao()( W4 d+ H/ b! ?) g" V- k/ B; | })- E& _5 A9 w. b# j9 g( ~ }, " d( z: u. d5 D3 [ //左侧条目选择& b* i9 x6 X. b- K' C& l switchLeftTab(e) { & y: v& I" v+ \* W let index = e.target.dataset.index;3 T, A4 k$ [7 `# z. w this.setData({ 4 p. ^" i7 @" G0 ]! r0 F' @* g' W leftCur: index,) @# r6 d' r o7 a. t" G }, success => {/ \$ a u# W* ?0 { this.xuesheng() 3 G+ @( @' N* R9 P) r/ t9 P7 O })( q' j; u9 k+ d/ t. [+ Q }, / W7 b8 N! }* m6 e7 p P/ W: ^! Y })

) Y& C! y4 ^& l( } J2 {6 y

4-4,记得修改数据表权限修改权限为所有用户可读,仅创建者可读写

: Y0 H% M4 U) n0 t, E# ?

到这里我们的三级分类就完整的实现了。关于excel数据批量导入,我下节再做讲解的。欢迎关注,欢迎留言交流。

8 J; ~) H2 z& I9 B- T9 [/ M' Y 7 G* o+ X! Y6 w# X" K - J- b; h3 H7 \ ~: a/ |$ [' D& l 6 f% I7 W6 f/ y( R2 I- f7 P* A0 X. _7 O* _! x
回复

使用道具 举报

头像被屏蔽
52helen 发表于 2026-03-15 13:36:19 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

    您需要登录后才可以回帖 登录 | 加入怎通

    本版积分规则

    QQ|手机版|小黑屋|网站地图|真牛社区 ( 苏ICP备2023040716号-2 )

    GMT+8, 2026-4-4 11:42 , Processed in 0.055001 second(s), 23 queries , Gzip On.

    免责声明:本站信息来自互联网,本站不对其内容真实性负责,如有侵权等情况请联系420897364#qq.com(把#换成@)删除。

    Powered by Discuz! X3.5

    快速回复 返回顶部 返回列表