vue2.0中click事件 + 点击当前元素(如li)实现动态切换class
1、点击当前元素(如li)实现动态切换class,只有当前元素添加active,其他兄弟元素均隐藏
XML/HTML Code复制内容到剪贴板
- <template>
- <div>
- <ul>
- <!-- 渲染的数组中active这个字段 可以没有 -->
- <li v-for="(item, index) in pageList" class="page-infinite-listitem" @click="playMp3($event,item,index)" :class="{ 'active' : item.active}">
- <div class="text">
- <i class="icon iconfont"></i> {{item.title}}
- </div>
- </li>
- </ul>
- </div>
- </template>
- <script>
- import Vue from 'vue'
- export default {
- data() {
- return {
- active: false,
- pageList: [{
- title: '第一行'
- }, {
- title: '第二行'
- }, {
- title: '第三行'
- }, {
- title: '第四行'
- }]
- }
- },
- methods: {
- playMp3(event, item, index) {
- // 列表的数据先将所有的class遍历一遍设为false,再设置指定的子元素的字段active的class为显示active
- this.$nextTick(function() {
- this.pageList.forEach(function(item) {
- Vue.set(item, 'active', false);
- });
- Vue.set(item, 'active', true);
- });
- }
- }
- }
- </script>
2、点击添加class,点击删除class
Vue.set 也可以写成:this.$set,就可以不用再引入一遍Vue了
XML/HTML Code复制内容到剪贴板
- <!--
- 要求:点击添加class 再点击去掉class 并获取点击的值
- :value 绑定值
- :class 添加class运算式
- click 点击事件添加value并且高亮
- tag.isA 并不是数组中自带的,要用vue的set方法给写入进去
- -->
- <div class="box_shadow classify_details_item">
- <span v-for="(tag, index) in tagList" :value="tag.tagName" :class="{'classify_item active':tag.isA,'classify_item':!tag.isA}" v-on:click="addTag($event,tag,index)">{{tag.tagName}}</span>
- </div>
- <script>
- import Vue from 'vue'
- export default {
- name: 'publishBase',
- data: function() {
- return {
- value: []
- }
- },
- methods: {
- addTag(event, tag, index) {
- let isA = this.tagList[index].isA;
- let that = this;
- if(!isA) {
- // 在选中的时候要判断
- if((this.value.length + 1) > 3) {
- that.$toast({
- message: "最多只能选择三个!",
- position: "top",
- className: "toast-z"
- });
- return false;
- }
- }
- this.value = [];
- Vue.set(this.tagList[index], 'isA', !isA);
- this.tagList.forEach(function(item) {
- if(item.isA) {
- that.value.push(item.tagName);
- }
- });
- },
- },
- watch: {
- value() {
- console.log(this.value);
- //设置监听
- this.$emit('chooseTags', this.value);
- },
- }
- }
- </script>
点击checkbox框指定数值,其余的灰色:
下一步,任意选择一个checkbox,其余灰色:
将选中的取消,其他也恢复:
XML/HTML Code复制内容到剪贴板
- <div class="class-item clear" v-for="(item,index) in classList">
- <input type="checkbox" v-model="selectedBox" :value="item.lessonId" :disabled="item.active">
- </div>
JavaScript Code复制内容到剪贴板
- <script>
- export default {
- name: 'classLibrary',
- data: function() {
- return {
- selectedBox: [], //监听用户选择的checkbox
- classList: [], //数组,可以在init中对其赋值
- }
- },
- watch: {
- selectedBox() {
- let vm = this;
- let list = vm.classList;
- let selected = vm.selectedBox;
- let selectedLen = selected.length;
- let userSelected = []; //用户选择的开始重组数组
- if(selectedLen >= 1) { //大于1就开始灰色
- list.forEach(function(item, index) {
- if(selected.indexOf(item.lessonId) !== -1) {
- // 如果不存在
- vm.$set(list[index], 'active', false);
- userSelected.push(item);
- } else {
- vm.$set(list[index], 'active', true);
- vm.removeByValue(userSelected,item.lessonId);
- }
- });
- } else {
- list.forEach(function(item, index) {
- vm.$set(list[index], 'active', false);
- });
- }
- },
- }
- }
- </script>
JavaScript Code复制内容到剪贴板
- removeByValue(arr, val) {
- // 查询value中是否有这个值,如果有就去除这个数组
- for(var i = 0; i < arr.length; i++) {
- if(arr[i].value == val) {
- arr.splice(i, 1);
- break;
- }
- }
- },
事件修饰符
Vue.js 为 v-on 提供了事件修饰符来处理 DOM 事件细节,如:event.preventDefault() 或 event.stopPropagation()。
Vue.js通过由点(.)表示的指令后缀来调用修饰符。
.stop
.prevent
.capture
.self
.once
JavaScript Code复制内容到剪贴板
- <!-- 阻止单击事件冒泡 -->
- <a v-on:click.stop="doThis"></a>
- <!-- 提交事件不再重载页面 -->
- <form v-on:submit.prevent="onSubmit"></form>
- <!-- 修饰符可以串联 -->
- <a v-on:click.stop.prevent="doThat"></a>
- <!-- 只有修饰符 -->
- <form v-on:submit.prevent></form>
- <!-- 添加事件侦听器时使用事件捕获模式 -->
- <div v-on:click.capture="doThis">...</div>
- <!-- 只当事件在该元素本身(而不是子元素)触发时触发回调 -->
- <div v-on:click.self="doThat">...</div>
- <!-- click 事件只能点击一次,2.1.4版本新增 -->
- <a v-on:click.once="doThis"></a>
上一篇 vue-touch
下一篇 HBuilder支持es6