应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

vue给当前点击的元素添加样式 。vue实现tag类型的菜单选中切换效果,vue点击切换样式效果,vue点击选中效果。vue类似tag菜单的样式选中效果

3712人阅读 2020/6/29 17:20 总访问:5182636 评论:0 收藏:0 手机
分类: 前端

比较简单的静态Tag选中效果

页面:

  1. <div class="title-wapper">
  2. <div class="title " :class="active=='noread'?'cur':''" @click="switchRead(0,'noread')">未读(3)</div>
  3. <div class="title" :class="active=='all'?'cur':''" @click="switchRead(1,'all')" style="margin-left: 10px;">全部(5)</div>
  4. <div class="readBut">全部已读</div>
  5. </div>

js核心的地方:

  1. data() {
  2. return {
  3. // 默认是未选中那效果
  4. active:"noread"
  5. }
  6. },
  7. methods: {
  8. switchRead(isRead,readTag){
  9. this.active=readTag
  10. }
  11. }

vue tag动态生成的菜单样式选中效果,和上面那个静态的逻辑是一样的,参考:
https://www.tnblog.net/xiuxin/article/details/7959

静态Tag选中其实也可以使用绑定的方式好处理点,后面修改成动态的也可以无缝衔接

比如静态的是这样的:

  1. <div class="tbt-tag cur">观看视频</div>
  2. <div class="tbt-tag">任务介绍</div>
  3. <div class="tbt-tag">在线学习</div>

完全可以使用绑定的方式来处理方便一点,变成这样写

先写数据源:

  1. const state = reactive({
  2. choiseTagArray:[
  3. {id:1,tagname:"观看视频"},
  4. {id:2,tagname:"任务介绍"},
  5. {id:3,tagname:"在线学习"}
  6. ],
  7. choiseTag:1,
  8. })

然后就可以循环解析了,而且可以直接把样式选中的逻辑写上了:

  1. <div v-for="(item,index) in state.choiseTagArray" :class="{ cur: item.id === state.choiseTag }" :key="index" class="tbt-tag" @click="changeChoiseTag(item)">{{item.tagname}}</div>

处理选中的方法贴一下:

  1. const changeChoiseTag = (item:any)=>{
  2. state.choiseTag = item.id
  3. }

这样就非常方便和灵活了,要增加额外的属性也非常方便,在数据源里边增加即可

绑定样式可以使用方法的形式处理,这样写逻辑更方便了

比如:class="dealChoise(item.schoolID)"

  1. <div class="shcoolItem" :class="dealChoise(item.schoolID)" @click="changeSchool(item.schoolID)"
  2. v-for="(item, index) in schoolList" v-bind:key="index">
  3. {{ item.schoolName }}</div>

处理的方法如下,达成某种条件就返回一个选中样式即可

  1. methods: {
  2. dealChoise: function (schoolID) {
  3. // 找到相同的id就给一个cur样式,达到选中的效果
  4. if (schoolID === this.$getSchoolId()) {
  5. return "cur"
  6. }
  7. }
  8. }

就上面那么一点代码就可以实现这种校区切换页面刷新之后的选中效果了

可以不用方法处理选中,直接这样写还简单点

  1. :class="{ cur: item.schoolID === this.$getSchoolId() }"

当然如果是比较复杂点的逻辑还是写方法处理逻辑清晰点,仅仅是处理一个选中的样式,这样简写简单点

样式绑定的可以看看这个:https://www.tnblog.net/aojiancc/article/details/3346

不是循环生成的也可以使用这样方式,原理是完全一样的,贴一下vue3中的写法

效果如下:

页面

  1. <view class="classStar">
  2. <view class="classStarTitle">班级之星</view>
  3. <view class="splitline"></view>
  4. <view class="tagWrap">
  5. <view class="tagContent">
  6. <view class="tagItem" :class="dealClassStarChoise(1)" @tap="getSortByType(1)">健康</view>
  7. <view class="tagItem" :class="dealClassStarChoise(3)" @tap="getSortByType(3)">思维</view>
  8. <view class="tagItem" :class="dealClassStarChoise(2)" @tap="getSortByType(2)">技术</view>
  9. <view class="tagItem" :class="dealClassStarChoise(4)" @tap="getSortByType(4)">管理</view>
  10. </view>
  11. <view @click="openClassStarMorePopup">
  12. <view class="moreTag">更多 ></view>
  13. </view>
  14. </view>
  15. </view>

ts核心部分代码:

  1. <script setup lang="ts">
  2. import { ref, reactive } from 'vue'
  3. import { onShow } from '@dcloudio/uni-app'
  4. import http from '@/common/request.ts'
  5. const state = reactive({
  6. studentScoreSortType:[] as any,
  7. // 这里配置默认选中的
  8. taskTypeEnum:1
  9. })
  10. onShow(() => {
  11. // 默认查询健康的排名数据
  12. getSortByType(1)
  13. })
  14. // 健康,技术,思维,管理得排名数据
  15. const getSortByType = async (taskTypeEnum:number)=>{
  16. var res: any = await http.get('/growing/api/StuReport/GetStuScoreSortByClassAndType',{taskTypeEnum:taskTypeEnum})
  17. state.studentScoreSortType = res.data
  18. // 记录一下当前需要选中的是什么
  19. state.taskTypeEnum = taskTypeEnum
  20. }
  21. // 处理tag菜单选中的方法
  22. const dealClassStarChoise=(taskTypeEnum:number)=>{
  23. if(taskTypeEnum==state.taskTypeEnum)
  24. {
  25. return "cur"
  26. }
  27. }
  28. </script>

可以不用方法处理选中,直接这样写还简单点

  1. :class="{ cur: 1 === state.taskTypeEnum }"
  2. :class="{ cur: 2 === state.taskTypeEnum }"
  3. :class="{ cur: 3 === state.taskTypeEnum }"

其中一点样式也贴一下:

  1. .classStar {
  2. background-color: #fff;
  3. margin-top: 23rpx;
  4. padding-top: 23rpx;
  5. padding-bottom: 23rpx;
  6. .classStarTitle {
  7. font-size: 30rpx;
  8. color: #3A3B42;
  9. margin-left: 20rpx;
  10. // margin-top: 23rpx;
  11. }
  12. .tagWrap {
  13. display: flex;
  14. justify-content: space-between;
  15. margin-top: 23rpx;
  16. .tagContent {
  17. display: flex;
  18. margin-left: 30rpx;
  19. .tagItem {
  20. width: 110rpx;
  21. height: 45rpx;
  22. line-height: 45rpx;
  23. text-align: center;
  24. margin-right: 30rpx;
  25. background: #F5F5F5;
  26. border-radius: 25px 25px 25px 25px;
  27. font-size: 28rpx;
  28. color: #909399;
  29. }
  30. .cur {
  31. background-color: #4D9DF5;
  32. color: #FFFFFF;
  33. }
  34. }
  35. .moreTag {
  36. cursor: pointer;
  37. color: #4D9DF5;
  38. font-size: 24rpx;
  39. height: 45rpx;
  40. line-height: 45rpx;
  41. margin-right: 30rpx;
  42. }
  43. }
  44. }

选中后的样式不一样的情况,效果如下:

就是tag切换效果,选中的样式是三种不一样的

方法一:直接使用dom操作

如果选中样式一样,就可以写死选中的样式了,如果不一样,通过方法传递过来就行,比如上面示例图那种情况。

html:

  1. <div class="labroom-trend-tag">
  2. <span class="daychoise" @click="switchChart($event,'daychoise')"></span>
  3. <span @click="switchChart($event,'monthchoise')"></span>
  4. <span @click="switchChart($event,'termchoise')">学期</span>
  5. </div>

js:

  1. switchChart(event, _className) {
  2. // 先把元素的样式全部回归成默认状态。默认状态根据情况可以是没有样式的,也可以是有默认样式的
  3. const childNodes = event.currentTarget.parentNode.childNodes
  4. for (let index = 0; index < childNodes.length; index++) {
  5. const element = childNodes[index]
  6. element.className = ''
  7. }
  8. // 给当前点击的元素添加选中样式。这里的样式不一样所以通过方法传递进来的
  9. event.currentTarget.className = _className
  10. }

一点样式也简单贴一下

  1. .labroom-trend-tag {
  2. position: absolute;
  3. right: 10px;
  4. top: 18px;
  5. }
  6. .labroom-trend-tag span {
  7. display:inline-block;
  8. width: 36px;
  9. height: 18px;
  10. background: #FFFFFF;
  11. cursor: pointer;
  12. border-radius: 2px 2px 2px 2px;
  13. opacity: 1;
  14. border: 1px solid #BFEFFF;
  15. font-size: 12px;
  16. font-family: MicrosoftYaHei-, MicrosoftYaHei;
  17. font-weight: normal;
  18. color: #BFEFFF;
  19. line-height: 18px;
  20. text-align: center;
  21. margin-right: 6px;
  22. }
  23. .labroom-trend-tag .termchoise
  24. {
  25. background: #6AB6ED;
  26. color: #fff;
  27. }
  28. .labroom-trend-tag .daychoise
  29. {
  30. background: #31C3F5;
  31. color: #fff;
  32. }
  33. .labroom-trend-tag .monthchoise
  34. {
  35. background: #8AABFF;
  36. color: #fff;
  37. }

方法二:使用绑定属性的方式

html:

  1. <div class="labroom-trend-tag">
  2. <span :class="daychoise" @click="switchChart($event,'daychoise')"></span>
  3. <span :class="monthchoise" @click="switchChart($event,'monthchoise')"></span>
  4. <span :class="termchoise" @click="switchChart($event,'termchoise')">学期</span>
  5. </div>

这里绑定了三个属性,因为他们选中的样式不一样,如果是一样的话,只需要一个属性就行了,会简单很多。
如果选中样式是一样的话,可以参考:https://www.tnblog.net/xiuxin/article/details/7959

绑定的属性:

  1. data() {
  2. return {
  3. //默认选中一个
  4. daychoise: 'daychoise',
  5. monthchoise: '',
  6. termchoise: ''
  7. }
  8. }

js:
同样的道理,因为他们选中的样式不一样,所以要操作三个变量

  1. switchChart(event, _className) {
  2. // 先把元素的样式全部回归成没有选中状态
  3. this.daychoise = ''
  4. this.monthchoise = ''
  5. this.termchoise = ''
  6. // 点击的哪个就给哪个加上选中的样式
  7. if (_className === 'daychoise') {
  8. this.daychoise = 'daychoise'
  9. }
  10. if (_className === 'monthchoise') {
  11. this.monthchoise = 'monthchoise'
  12. }
  13. if (_className === 'termchoise') {
  14. this.termchoise = 'termchoise'
  15. }
  16. }

如果没有选中的样式也不一样的话,其实就是还要写三个没有选中的样式,默认情况下使用这三个样式

写好三个没有选中情况下的样式

  1. .labroom-trend-tag .daynochoise
  2. {
  3. border: 1px solid #BFEFFF;
  4. color: #BFEFFF;
  5. }
  6. .labroom-trend-tag .monthnochoise
  7. {
  8. border: 1px solid #BBCEFF;
  9. color: #BBCEFF;
  10. }
  11. .labroom-trend-tag .termnochoise
  12. {
  13. border: 1px solid #B3D8FF;
  14. color: #B3D8FF;
  15. }

定义属性的时候给一下默认值

  1. data() {
  2. return {
  3. // 默认选中
  4. daychoise: 'daychoise',
  5. // 默认是没有选中状态
  6. monthchoise: 'monthnochoise',
  7. // 默认是没有选中状态
  8. termchoise: 'termnochoise',
  9. }
  10. }

js中也给一下没有选中状态下的样式即可

  1. switchChart(event, _className) {
  2. // 先把元素的样式全部回归成没有选中状态
  3. this.daychoise = 'daynochoise'
  4. this.monthchoise = 'monthnochoise'
  5. this.termchoise = 'termnochoise'
  6. // 点击的哪个就给哪个加上选中的样式
  7. if (_className === 'daychoise') {
  8. this.daychoise = 'daychoise'
  9. }
  10. if (_className === 'monthchoise') {
  11. this.monthchoise = 'monthchoise'
  12. }
  13. if (_className === 'termchoise') {
  14. this.termchoise = 'termchoise'
  15. }
  16. }

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

vue.js+Layer实现表格数据绑定与更新

一:使用Vue.js绑定好数据与更新事件 使用v-on绑定好事件,在事件里边直接把该行数据传递进去,在更新方法里边就可以直接...

vue.js 实现省市联动

HTML代码&lt;divid=&quot;pro_citys&quot;&gt; 省:&lt;selectid=&quot;provice&quot;v-on:change=&quot;prochange()&quo...

vue.js常见问题

一:花括号当做字符串显示的问题1:检查下绑定到vue.js的id是否重复,如果id重复了,就有可能存在这种问题,因为有可能把数...

vue.js常用指令

v-html可以把字符串当成一个html来渲染,而不是原样输出Html类似.net mvc中的@Html.Raw()方法&lt;divv-html=&quot;item.tit...

干货!div滚动到一定位置就固定他。vue实现一侧滚动到底部就固定

尊重原创:转载请注名出处div滚动到一定位置就固定他,例如左边的内容很多,右边的内容很少,如果不处理滚动到一定位置后右...

vue.js常用指令,事件绑定等,vue过滤器解析状态过滤器多个参数。vue表格状态解析。vue解析类型,element ui解析类型,状态,el-tag

按照html的编码显示:v-html&lt;div class=&quot;font_info&quot; v-html=&quot;item.Content&quot;&gt;{{item.Content}}&l...

vue.js if用法

vue.js if可以做一些判断例如我们要把下面这个输出varvm=newVue({ el:&quot;#content&quot;, data:{ titles:[&quot;小明...

vue.js 学习日记第一章-安装vue开发环境

官网:https://cn.vuejs.org/v2/guide/ 这是一篇学习性文章,不定时更新,用来记录我学习vue.js的过程。 首先,是v...

vue.js 学习日记第二章-在vue中编写function及一些简单指令

官网:https://cn.vuejs.org/v2/guide/ vue.js 学习日记第一章:http://www.tnblog.net/18323015640/article/details/2...

vue.js 学习日记第三章-vue中的简单事件及事件修饰符

官网:https://cn.vuejs.org/v2/guide/ vue.js 学习日记第二章:http://www.tnblog.net/18323015640/article/details/2...

vue.js 学习日记第四章-vue中文本框数据获取与绑定及computed计算属性

官网:https://cn.vuejs.org/v2/guide/ vue.js学习日记第三章: http://www.tnblog.net/18323015640/article/details/2...

vue.js 学习日记第五章-v-if和v-for指令的使用方式

官网:https://cn.vuejs.org/v2/guide/ vue.js学习日记第四章: http://www.tnblog.net/18323015640/article/details/2...

vue.js 学习日记第六章-vue组件初步学习

官网:https://cn.vuejs.org/v2/guide/ vue.js学习日记第五章: http://www.tnblog.net/18323015640/article/details/2...

vue.js学习日记第七章-搭建脚手架

官网:https://cn.vuejs.org/v2/guide/ vue.js学习日记第六章: http://www.tnblog.net/18323015640/article/details/2...

vue实现好友选中效果

逛过vue官网肯定会发现一个有趣的指令“v-for”,相比与以前拼接html代码确实要上档次一点,而且减少了工作量,先看一波效...

js时间格式化vue.js时间格式化,带T 时间格式化

也可以借助moment库, 参考:https://www.tnblog.net/aojiancc2/article/details/8079moment库有点大,推荐可以使用day.js...