option-bar.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  1. <template>
  2. <view :class="{prevent_move:flag}" :style="{height:photoheight+'px'}">
  3. <view class="option-bar">
  4. <!-- 下拉框的导航部分 -->
  5. <view class="option u-f">
  6. <block v-for="(title,index) in tits" :key="index">
  7. <view class="selection u-f" @tap="selectionFun(index)">
  8. <view :class="{down:down[index]}">{{title}}</view>
  9. <view v-if="down[index]" class="icon iconfont icon-down-fill"
  10. :class="{down:down[index]}">
  11. </view>
  12. <view v-else class="icon iconfont icon-up-fill" :class="{down:down[index]}">
  13. </view>
  14. </view>
  15. </block>
  16. </view>
  17. <!-- 下拉框的主体部分 -->
  18. <scroll-view class="box">
  19. <block v-for="(contents,index) in contentArrs" :key="index">
  20. <view v-if="down[index]" class="content">
  21. <block v-for="(content,key) in contents" :key="key">
  22. <view class="line" >
  23. <block v-for="(con,index) in content" :key="index">
  24. <view @tap="filteFun(clickNum,key,index)">{{con}}</view>
  25. </block>
  26. </view>
  27. </block>
  28. </view>
  29. </block>
  30. </scroll-view>
  31. <!-- 遮罩层 -->
  32. <view v-if="flag" class="page" @tap="cancel"
  33. :style="{'height':photoheight-contentHeight+'px'}"></view>
  34. </view>
  35. <view class="mainstay">
  36. <block v-for="(list,index) in filterArrs" :key="index">
  37. <view class="collList">
  38. <view class="listLeft">
  39. <view class="collPic"><image src="../../static/school.png"></image></view>
  40. <view class="collName">{{list.name}}</view>
  41. </view>
  42. <view class="listRight">
  43. <view class="listTop">
  44. <view>
  45. <view>
  46. <view class="collAddress">
  47. <view class="deletDeg">{{list.address}}</view>
  48. </view>
  49. <view class="collType">
  50. <view class="deletDeg">{{list.type}}</view>
  51. </view>
  52. <view class="collProject">
  53. <view class="deletDeg">{{list.project}}</view>
  54. </view>
  55. </view>
  56. <view>
  57. <view class="collMaxSco u-f"><view>最高分:</view>{{list.maxSco}}</view>
  58. <view class="collMinSco u-f"><view>最低分:</view>{{list.minSco}}</view>
  59. </view>
  60. </view>
  61. <view @tap="collectionFun(index)">
  62. <view v-if="!collectionFlag[index]" class="icon iconfont icon-shoucang" >
  63. </view>
  64. <view v-else class="icon iconfont icon-wodeshoucang"
  65. >
  66. </view>
  67. </view>
  68. </view>
  69. <view class="listBottom">
  70. <view class="collLevel"><view>综合评级:</view><view>{{list.level}}</view></view>
  71. </view>
  72. </view>
  73. </view>
  74. </block>
  75. </view>
  76. </view>
  77. </template>
  78. <script>
  79. export default {
  80. data() {
  81. return {
  82. // list1:getApp().globalData.global_colle,
  83. "photoheight":504, //可用屏幕的高度
  84. contentHeight:300, //下拉框底部距离屏幕顶部的距离
  85. contenttop:20, //下拉框顶部距离屏幕顶部的距离
  86. down:[], //空数组,保存每个下拉框的状态。当down【index】为true时,出现下拉框
  87. flag:false, //当falg为true时,出现遮罩层,并且作为下拉框状态传递的中间参数
  88. clickNum:-1, //纪录上次点击的是哪个下拉框,初始值是-1,表示上次没有选中下拉框
  89. collectionFlag:getApp().globalData.global_collectionFlag,
  90. collectionArr:getApp().globalData.global_collection_arr ,//收藏的学校
  91. tits:[], //导航栏
  92. filterArrs:this.list
  93. }
  94. },
  95. props:{
  96. titles:Array,
  97. contentArrs:Array,
  98. list:Array
  99. },
  100. onReady() {
  101. this.tits=["所在地","级别","高校层次","类型"]
  102. console.log(this.titles);
  103. },
  104. updated() { //在.content部分下拉弹出以后,获得dom元素的具体高度信息
  105. let view=uni.createSelectorQuery().in(this).select('.box');
  106. view.boundingClientRect(data=>{
  107. // console.log(data.bottom)
  108. this.contentHeight=data.bottom
  109. this.contenttop=data.top
  110. // console.log(data);
  111. }).exec();
  112. uni.getSystemInfo({
  113. success:e=>{
  114. // console.log(e.windowHeight)
  115. this.photoheight=e.windowHeight
  116. }
  117. });
  118. },
  119. methods: {
  120. filteFun(clickNum,key,index){
  121. let list=this.list //渲染的数组
  122. let filterArr=list
  123. this.filterArrs=filterArr;
  124. console.log(this.titles);
  125. // //换导航栏的内容
  126. this.tits[clickNum]=this.contentArrs[clickNum][key][index];
  127. console.log(this.titles);
  128. for(let i=0;i<this.tits.length;i++){
  129. filterArr=[] //搜寻的数组
  130. if(this.tits[i]!="全部"&&this.tits[i]!="级别"&&
  131. this.tits[i]!="所在地"&&this.tits[i]!="高校层次"&&
  132. this.tits[i]!="类型"){
  133. switch(true){
  134. case i==0:
  135. for(let j=0;j<list.length;j++){
  136. if(list[j].address==this.tits[i]){
  137. filterArr.push(list[j])
  138. }
  139. };
  140. this.filterArrs=filterArr;
  141. list=this.filterArrs
  142. break;
  143. case i==1:
  144. console.log("这里应该选择学校级别");
  145. break;
  146. case i==2:
  147. for(let j=0;j<list.length;j++){
  148. if(list[j].project+'工程'==this.tits[i]){
  149. filterArr.push(list[j])
  150. }
  151. };
  152. this.filterArrs=filterArr;
  153. list=this.filterArrs
  154. break;
  155. case i==3:
  156. for(let j=0;j<list.length;j++){
  157. if(list[j].type==this.tits[i]){
  158. filterArr.push(list[j])
  159. }
  160. };
  161. this.filterArrs=filterArr;
  162. list=this.filterArrs
  163. break;
  164. }
  165. }
  166. }
  167. // console.log(this.filterArrs);
  168. // console.log(this.list);
  169. this.cancel()
  170. },
  171. selectionFun(index){
  172. if(this.clickNum==index){
  173. this.down=[] //每次点击时,使得其他兄弟节点不出现下拉框
  174. this.down[index]=this.flag
  175. this.down[index]=!this.down[index]
  176. this.flag=this.down[index] //保存该下拉框的状态
  177. }else{
  178. this.down=[]
  179. this.down[index]=!this.down[index]
  180. this.flag=this.down[index]
  181. }
  182. this.clickNum=index //纪录这次点击的是哪个下拉框
  183. // console.log(this.down)
  184. // console.log(this.flag)
  185. // console.log(index);
  186. // return Promise.this.clickNum
  187. },
  188. cancel(){
  189. this.down=[],
  190. this.flag=false
  191. },
  192. collectionFun(index){
  193. this.collectionFlag[index]=!this.collectionFlag[index];
  194. getApp().globalData.global_collectionFlag=this.collectionFlag;
  195. // this.collectionFlag=getApp().globalData.global_collectionFlag;
  196. // console.log(this.collectionFlag[index]);
  197. // console.log(getApp().globalData.global_collectionFlag);
  198. if(this.collectionFlag[index]){
  199. uni.showToast({
  200. "title":"收藏成功"
  201. });
  202. this.collectionArr.push(getApp().globalData.global_colle[index])
  203. // console.log(this.collectionArr)
  204. getApp().globalData.global_collection_arr=this.collectionArr
  205. }else{
  206. uni.showToast({
  207. "title":"取消收藏"
  208. });
  209. for(let i=0;i<getApp().globalData.global_collection_arr.length;i++){
  210. // console.log(getApp().globalData.global_collection_arr[i].name);
  211. if(getApp().globalData.global_collection_arr[i].name==
  212. getApp().globalData.global_colle[index].name){
  213. this.collectionArr.splice(i,1)
  214. getApp().globalData.global_collection_arr=this.collectionArr
  215. // console.log(this.collectionArr);
  216. }
  217. }
  218. }
  219. }
  220. }
  221. }
  222. </script>
  223. <style scoped>
  224. .u-f{
  225. display: flex;
  226. justify-content: center;
  227. align-items: center;
  228. text-align: center;
  229. }
  230. .option{
  231. display: flex;
  232. width: 100%;
  233. position: fixed;
  234. background: rgba(255,255,255,1);
  235. top: 0;
  236. }
  237. .selection{
  238. flex: 1;
  239. height: 55upx;
  240. line-height: 55upx;
  241. font-size: 30upx;
  242. color: #999999;
  243. }
  244. .selection .icon{
  245. font-size: 20upx;
  246. margin-left: 15upx;
  247. margin-top: 10upx;
  248. }
  249. .icon-up-fill{
  250. margin-bottom: 15upx;
  251. }
  252. .down{
  253. color: red;
  254. }
  255. .option-bar .content{
  256. max-height: 600upx;
  257. overflow-y: scroll;
  258. color: #000000;
  259. background: rgba(255,255,255,1);
  260. }
  261. .line>view{
  262. border-bottom: 1px solid #B2B2B2;
  263. margin-left: 30upx;
  264. padding: 20upx;
  265. }
  266. .line>view:last-child{
  267. border-bottom: 1px solid white;
  268. }
  269. //遮罩层
  270. .page{
  271. width: 100%;
  272. position: fixed;
  273. bottom: 0upx;
  274. background: rgba(0,0,0,0.2);
  275. z-index: 100;
  276. }
  277. .box{
  278. position: fixed;
  279. top: 55upx;
  280. z-index: 999;
  281. }
  282. .prevent_move{
  283. overflow: hidden;
  284. }
  285. /* 内容部分 */
  286. .mainstay{
  287. margin-top: 55upx;
  288. width: 100%;
  289. }
  290. .mainstay .collList{
  291. width:100%;
  292. height: 310upx;
  293. border-top: 25upx solid rgba(245,245,245,1);
  294. display: flex;
  295. }
  296. /* 校徽部分 */
  297. .mainstay .collList .listLeft{
  298. display: flex;
  299. flex-direction: column;
  300. flex-wrap: wrap;
  301. flex: 1;
  302. padding: ;
  303. justify-content: center;
  304. align-items: center;
  305. }
  306. .mainstay .collList .listLeft .collPic{
  307. width: 100%;
  308. height: 210upx;
  309. }
  310. .mainstay .collList .listLeft .collPic image{
  311. margin-left: 5%;
  312. margin-top: 20%;
  313. width: 90%;
  314. height: 80%;
  315. }
  316. /* 左边学校名字 */
  317. .mainstay .collList .listLeft .collName{
  318. width: 100%;
  319. height: 100upx;
  320. display: flex;
  321. flex-wrap: wrap;
  322. align-items: center;
  323. justify-content: center;
  324. text-align: center;
  325. font-size: 30upx;
  326. }
  327. .mainstay .collList .listRight{
  328. display: flex;
  329. flex: 3;
  330. flex-direction: column;
  331. }
  332. .mainstay .collList .listRight .listTop{
  333. display: flex;
  334. flex-wrap: wrap;
  335. height: 210upx;
  336. }
  337. /* 右边的分布 */
  338. .mainstay .collList .listRight .listTop>view{
  339. display: flex;
  340. flex-direction: column;
  341. color: black;
  342. flex-wrap: nowrap;
  343. }
  344. /* 地区,类型,985/211 */
  345. .mainstay .collList .listRight .listTop>view>view:first-of-type{
  346. display: flex;
  347. flex-direction: row;
  348. flex-wrap: wrap;
  349. height: 120upx;
  350. align-items: center;
  351. }
  352. /* 平行四边形样式 */
  353. .mainstay .collList .listRight .listTop>view>view:first-of-type>view{
  354. display: flex;
  355. background: #F1F1F1;
  356. min-width: 20%;
  357. max-width: 42%;
  358. margin: 20upx 0upx 20upx 20upx;
  359. justify-content: center;
  360. align-items: center;
  361. transform: skew(-12deg);
  362. z-index: -1;
  363. }
  364. /* 平行四边形里面字体的样式 去除倾斜*/
  365. .deletDeg{
  366. font-size: 25upx;
  367. transform: skew(12deg);
  368. }
  369. /* 最低分,最高分 */
  370. .mainstay .collList .listRight .listTop>view>view:last-of-type{
  371. display: flex;
  372. height: 90upx;
  373. flex-direction: row;
  374. font-size: 30upx;
  375. }
  376. /* 最高分,最低分颜色 */
  377. .mainstay .collList .listRight .listTop .collMaxSco>view{
  378. color: #999999;
  379. margin-right: 15upx;
  380. }
  381. .mainstay .collList .listRight .listTop .collMaxSco{
  382. margin-right: 50upx;
  383. margin-left: 20upx;
  384. }
  385. .mainstay .collList .listRight .listTop .collMinSco>view{
  386. color: #999999;
  387. margin-right: 15upx;
  388. }
  389. /* 收藏图标和左边内容的比例是3:1 */
  390. .mainstay .collList .listRight .listTop>view:first-of-type{
  391. display: flex;
  392. flex-direction: column;
  393. flex-wrap: wrap;
  394. flex: 3;
  395. }
  396. .mainstay .collList .listRight .listTop>view:last-of-type{
  397. flex: 1;
  398. justify-content: center;
  399. align-items: center;
  400. text-align: center;
  401. font-size: 50upx!important;
  402. display: flex;
  403. }
  404. .mainstay .collList .listRight .listTop .icon{
  405. flex: 1;
  406. justify-content: center;
  407. align-items: center;
  408. text-align: center;
  409. font-size: 50upx!important;
  410. font-weight: 100;
  411. }
  412. .icon-wodeshoucang{
  413. color:#FFB400;
  414. font-size: 50upx!important;
  415. }
  416. /* 综合评级行的设置 */
  417. .mainstay .collList .listRight .listBottom{
  418. padding-top: 20upx;
  419. padding-left: 350upx;
  420. font-size: 30upx;
  421. color: #999999;
  422. }
  423. .mainstay .collList .listRight .listBottom>view{
  424. display: flex;
  425. flex-direction: row;
  426. }
  427. .mainstay .collList .listRight .listBottom .collLevel>view:last-of-type{
  428. color: red;
  429. margin-left: 10upx;
  430. }
  431. </style>