FunctionMenu.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <template>
  2. <div class="menu-btn-wrap">
  3. <van-row>
  4. <!-- 菜单常驻按钮 最多只显示4个 -->
  5. <div class="menu-btn-fixed">
  6. <van-col span="6" v-for="(item, index) in funcList.filter((_, i)=>(i < 4))" :key="index">
  7. <!-- 状态切换按钮 -->
  8. <template v-if="item.switch">
  9. <div class="menu-item" @click="funcHandle(item)">
  10. <!-- 按钮块 -->
  11. <div class="icon-bg">
  12. <!-- 图标 -->
  13. <img width="36" height="36" :src="require(`~/assets/image/rtc/${item.switch[+item.status].icon}.png`)" />
  14. </div>
  15. <div class="menu-name">{{ item.switch[+item.status].label }}</div>
  16. </div>
  17. </template>
  18. <!-- 单一状态按钮 -->
  19. <template v-else>
  20. <div class="menu-item" @click="funcHandle(item)">
  21. <!-- 按钮块 -->
  22. <div class="icon-bg">
  23. <!-- 图标 -->
  24. <img width="36" height="36" :src="require(`~/assets/image/rtc/${item.icon}.png`)" />
  25. </div>
  26. <div class="menu-name">{{ item.label }}</div>
  27. </div>
  28. </template>
  29. </van-col>
  30. </div>
  31. <!-- 菜单抽屉内按钮 -->
  32. <div class="menu-drawer-warp" v-show="functionMenuVisible">
  33. <!-- 项 -->
  34. <van-col span="6" v-for="(item, index) in funcList.filter((_, i)=>(i > 3))" :key="index">
  35. <div class="menu-item" @click="funcHandle(item)">
  36. <div class="icon-bg">
  37. <img width="36" height="36" :src="require(`~/assets/image/rtc/${item.icon}.png`)" />
  38. </div>
  39. <div class="menu-name">{{ item.label }}</div>
  40. </div>
  41. </van-col>
  42. </div>
  43. </van-row>
  44. <div class="triger-menu-wrap">
  45. <!-- 展开/收起按钮 -->
  46. <div class="triger-btn" @click="hideOrShow">
  47. {{ functionMenuVisible ? '收起' : '展开' }}
  48. <!-- 图标 -->
  49. <van-icon :name="functionMenuVisible ? 'arrow-up' : 'arrow-down'" />
  50. </div>
  51. </div>
  52. </div>
  53. </template>
  54. <script>
  55. /**
  56. * 菜单按钮
  57. */
  58. export default {
  59. name: 'FunctionMenu',
  60. data() {
  61. return {
  62. // 菜单是否展开
  63. functionMenuVisible: false,
  64. // 功能列表
  65. funcList: [
  66. {
  67. switch: [{label: '显示虚拟键', code: 'showKey', icon: 'icon-show'}, {label: '隐藏虚拟键', code: 'hideKey', icon: 'icon-hide'}],
  68. status: true,
  69. },
  70. {label: '剪切板', code: 'shearplate', icon: 'icon-clipboard'},
  71. // {label: '音量 +', code: 'volumeUp', icon: 'icon-clipboard'},
  72. // {label: '音量 -', code: 'volumeDown', icon: 'icon-clipboard'},
  73. {label: '摇一摇', code: 'shake', icon: 'icon-shake'},
  74. {label: '吹一吹', code: 'blow', icon: 'icon-blow'},
  75. {label: '截图', code: 'screenshot', icon: 'icon-screenshot'},
  76. // {label: '重启', code: 'estart', icon: 'icon-restart'},
  77. ]
  78. }
  79. },
  80. methods: {
  81. hideOrShow(){
  82. this.functionMenuVisible = !this.functionMenuVisible;
  83. // 延迟触发避免父组件获取不到最新的值
  84. this.$nextTick(() => {
  85. // 触发父组件事件
  86. this.$emit('functionMenuVisible', this.functionMenuVisible);
  87. })
  88. },
  89. funcHandle(item){
  90. if(item.switch){
  91. // 触发父组件事件
  92. this.$emit('funcHandle', item.switch[+item.status]);
  93. this.$nextTick(() => {
  94. // 切换状态
  95. item.status = !item.status;
  96. });
  97. return;
  98. }
  99. // 触发父组件事件
  100. this.$emit('funcHandle', item);
  101. }
  102. }
  103. }
  104. </script>
  105. <style lang="scss" scoped>
  106. .menu-btn-wrap{
  107. color: #fff;
  108. font-size: 12px;
  109. padding: 6px 0;
  110. .menu-item{
  111. padding: 6px 0;
  112. .icon-bg{
  113. width: 36px;
  114. height: 36px;
  115. border-radius: 50%;
  116. overflow: hidden;
  117. }
  118. }
  119. .triger-menu-wrap{
  120. display: flex;
  121. justify-content: center;
  122. align-items: center;
  123. .triger-btn{
  124. color: #979797;
  125. font-size: 10px;
  126. }
  127. }
  128. }
  129. </style>