折腾:
【记录】用小程序实现测评系统的前端页面
期间,需要实现点击选项,高亮显示的效果:
期间用到了,自己之前就遇到的:
【总结】
用代码:
pages/question/question.wxml
<view class="subquestion_options"> <view wx:for="{{firtQuestonOptions}}" wx:for-index="questionIdx" wx:for-item="curOption" wx:key="curOption.number" class='single_option' bindtap='singleOptionClicked' data-number="{{curOption.number}}" > <button class="{{curOption.style}}" > <view wx:if="{{curOption.type == 'text'}}" class="single_option_text" > {{curOption.text}} </view> <image wx:elif="{{curOption.type == 'image'}}" class="single_option_image" src="{{curOption.image}}" mode="aspectFit" ></image> </button> </view> </view>
pages/question/question.js
var firtQuestonOptions = [] for( var eachOption of firstQuestion.options){ console.log("[%s] %s, %s", eachOption.option_index, eachOption.option_text, eachOption.option_image) var curOptionType = "" if (firstQuestion.option_type == "text"){ curOptionType = "text" } else if ((firstQuestion.option_type == "image") || (firstQuestion.option_type == "mix")) { // TODO: support mix type option curOptionType = "image" } var curOption = { "selected": false, "style": "", "type": curOptionType, "number": eachOption.option_index, "text": eachOption.option_text, "image": eachOption.option_image, } console.log("curOption=%o", curOption) firtQuestonOptions.push(curOption) } console.log("firtQuestonOptions=%o", firtQuestonOptions) // // for debug // firtQuestonOptions[0].selected = true // console.log("demo added first selected: firtQuestonOptions=%o", firtQuestonOptions) firtQuestonOptions = this.updateOptionStyle(firtQuestonOptions) console.log("firtQuestonOptions=%o", firtQuestonOptions) // update option style updateOptionStyle: function(oldOptionList){ console.log("updateOptionStyle: oldOptionList=%o", oldOptionList) var newOptionList = [] for( var originOption of oldOptionList){ console.log("originOption=%o", originOption) var newOption = originOption var newOptionStyle = "" if (newOption.type == "text"){ newOptionStyle = "single_option_button single_option_button_text" } else if ((newOption.type == "image") || (newOption.type == "mix")) { // TODO: support mix type option newOptionStyle = "single_option_button single_option_button_image" } if (newOption.selected) { newOptionStyle += " single_option_button_selected" } console.log("newOptionStyle=%s", newOptionStyle) newOption.style = newOptionStyle console.log("newOption=%o", newOption) newOptionList.push(newOption) } console.log("newOptionList=%o", newOptionList) return newOptionList }, singleOptionClicked: function(e){ console.log("singleOptionClicked: e=%o", e) var optionNumber = e.currentTarget.dataset.number console.log("optionNumber=%s", optionNumber) var optionIndex = optionNumber - 1 console.log("optionIndex=%s", optionIndex) var newOptionList = this.data.firtQuestonOptions var prevSelectedIndex = -1 for( let oldOptionIdxValue of this.data.firtQuestonOptions.entries()){ var curIdx = oldOptionIdxValue[0] var oldOption = oldOptionIdxValue[1] console.log("[%s] oldOption=%s", curIdx, oldOption) if (oldOption.selected) { prevSelectedIndex = curIdx console.log("prevSelectedIndex=%s", prevSelectedIndex) break } } // cancel previous selection if exist if (prevSelectedIndex >= 0) { newOptionList[prevSelectedIndex].selected = false } // select current, if not the prev selected one if (prevSelectedIndex != optionIndex) { newOptionList[optionIndex].selected = true } console.log("update selection: newOptionList=%o", newOptionList) newOptionList = this.updateOptionStyle(newOptionList) console.log("update style: newOptionList=%o", newOptionList) this.setData({ firtQuestonOptions: newOptionList, }) },
pages/question/question.wxss
.single_option_button { background: rgba(238,238,238,1); font-size: 16px; font-family: "PingFangSC-Regular", "苹方", "Microsoft Yahei", "微软雅黑", "Heiti SC"; font-weight: 400; color: rgba(51,51,51,1); display: flex; align-items: center; justify-content: center; } .single_option_button::after{ border: none; } .single_option_button_text { border-radius: 15px; height: 40px; } .single_option_button_image { border-radius: 25px; height: 135px; } .single_option_button_selected { background:#E1F7F1; } .single_option_text { text-align: center; } .single_option_image { /* max-height: 125px; min-width: 125px; */ /* width: 88px; */ width: 125px; height: 125px; z-index: 10; }
实现了效果:
最开始是没有点击
点击了一次后:
再去点击别的选项:
以及点击之前选中的,可以取消选择:
转载请注明:在路上 » 【已解决】小程序中实现选项的点击高亮显示和切换选择和再点取消选择