Green 发表于 2021-7-14 10:15:21

全部设置为仅查看/可编辑【第一种方法:watch】

效果图:

需求:
1、根据接口数据渲染list中每条数据,operationType===1则【仅查看】高亮,operationType===2则【可编辑】高亮
2、如果list中的所有数据都是【仅查看】,那么底部的【全部设置为仅查看】高亮,反之【全部设置为可编辑】高亮。如果既有【仅查看】又有【可编辑】,那么这连个按钮都不亮
3、点击【全部设置为仅查看】则将list中所有数据都设置为【仅查看】高亮,点击【全部设置为可编辑】则将list中所有数据都设置为【可编辑】高亮
实现思路:watch监听
<template>
<div class="my-radio">
    <ul>
      <li v-for="item in list" :key='item.id'>
      <div class="name">
          <span>{{item.userName}}</span>
      </div>
      <van-radio-group v-model="item.operationType" direction="horizontal">
          <van-radio :name="1">仅查看
            <template #icon="props">
            <div :class="props.checked ? 'activeIcon' : 'inactiveIcon'"><span></span></div>
            </template>
          </van-radio>
          <van-radio :name="2">可编辑
            <template #icon="props">
            <div :class="props.checked ? 'activeIcon' : 'inactiveIcon'"><span></span></div>
            </template>
          </van-radio>
      </van-radio-group>
      </li>
    </ul>
    <van-radio-group class="set-all" v-model="operationType" direction="horizontal">
      <van-radio :name="1">全部设置为仅查看
      <template #icon="props">
          <div :class="props.checked ? 'activeIcon' : 'inactiveIcon'"><span></span></div>
      </template>
      </van-radio>
      <van-radio :name="2">全部设置为可编辑
      <template #icon="props">
          <div :class="props.checked ? 'activeIcon' : 'inactiveIcon'"><span></span></div>
      </template>
      </van-radio>
    </van-radio-group>
</div>
</template>
<script>
export default {
data() {
    return {
      list: [
      {
          id: 266,
          operationType: 2,
          userName: 'brandotest3'
      },
      {
          id: 267,
          operationType: 1,
          userName: 'brandotest4'
      },
      {
          id: 268,
          operationType: 2,
          userName: 'brandotest5'
      },
      {
          id: 269,
          operationType: 2,
          userName: 'brandotest6'
      }
      ],
      operationType: null
    }
},
watch: {
    list: {
      handler(newList) {
      const arr = newList.map((item) => item.operationType)
      const allReadonly = arr.every((item) => item === 1)
      const allEditable = arr.every((item) => item === 2)
      if (allReadonly) {
          this.operationType = 1
      } else if (allEditable) {
          this.operationType = 2
      } else {
          this.operationType = null
      }
      },
      deep: true,
      immediate: true
    },
    operationType: {
      handler(newVal) {
      if (newVal !== 1 && newVal !== 2) return
      this.list.forEach((item) => {
          item.operationType = newVal
      })
      }
    }
}
}
</script>css:

<style lang="less" scoped>
.my-radio {
padding: 20px;
ul {
    li {
      width: 100%;
      box-sizing: border-box;
      height: 52px;
      background-color: #f3f6f9;
      border-radius: 6px;
      display: flex;
      align-items: center;
      justify-content: space-between;
      padding-left: 15px;
      margin-top: 10px;
      .name {
      width: 40%;
      height: 100%;
      display: flex;
      align-items: center;
      word-break: break-all;
      position: relative;
      > span {
          font-weight: bold;
          color: #4d5c82;
      }
      > i {
          width: 16px;
          height: 16px;
          background-color: #fc5e5e;
          border-radius: 50%;
          position: absolute;
          top: 10px;
          right: -20px;
          text-align: center;
          line-height: 16px;
          color: #fff;
          font-size: 12px;
      }
      }
      @media screen and (device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) {
      .name {
          width: 35%;
      }
      }
      .van-radio-group {
      margin-right: 15px;
      .van-radio:last-child {
          margin-right: 0;
      }
      }
    }
}
.set-all {
    display: flex;
    justify-content: space-between;
    margin-top: 35px;
    .van-checkbox {
      .van-checkbox__icon {
      font-size: 18px;
      }
      .van-checkbox__label {
      font-size: 14px;
      color: #4d5c82;
      line-height: 1;
      }
    }
    .van-radio:last-child {
      margin-right: 0;
    }
}
// 选中和未选中样式-start
.activeIcon {
    width: 18px;
    height: 18px;
    border: 2px solid #198cff;
    border-radius: 50%;
    box-sizing: border-box;
    display: flex;
    align-items: center;
    justify-content: center;
    > span {
      display: block;
      width: 10px;
      height: 10px;
      background: #198cff;
      border-radius: 50%;
    }
}
.inactiveIcon {
    width: 18px;
    height: 18px;
    border: 2px solid #e0e5f5;
    border-radius: 50%;
    box-sizing: border-box;
}
// 选中和未选中样式-end
}View Code



文档来源:51CTO技术博客https://blog.51cto.com/u_15301829/3068249
页: [1]
查看完整版本: 全部设置为仅查看/可编辑【第一种方法:watch】