keyboard.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <template>
  2. <div>
  3. <ul class="keyboard">
  4. <li v-for="key in keyList" track-by="$index" :class="{
  5. delete: key === 'Delete',
  6. tab: key === 'Tab',
  7. capslock: key === 'Caps',
  8. enter: key === 'Enter',
  9. shift: key === 'Shift',
  10. space: key === 'Space',
  11. shifted: (key === 'Shift') && hasShifted,
  12. capsed: (key === 'Caps') && hasCapsed }"
  13. v-text="key" @click="clickKey(key)"></li>
  14. </ul>
  15. </div>
  16. </template>
  17. <script>
  18. export default {
  19. data() {
  20. return {
  21. keyList: [],
  22. normalKeyList: [],
  23. shiftedKeyList: [],
  24. capsedKeyList: [],
  25. hasShifted: false,
  26. hasCapsed: false,
  27. keyboardtext: this.keyboardText
  28. }
  29. },
  30. props: ['keyboardText'],
  31. watch: {
  32. keyboardText(val) {
  33. this.keyboardtext = val;//新增result的watch,监听变更并同步到myResult上
  34. },
  35. keyboardtext(val){
  36. //xxcanghai 小小沧海 博客园
  37. this.$emit("on-result-change",val);//③组件内对myResult变更后向外部发送事件通知
  38. }
  39. },
  40. methods: {
  41. clickKey(key) {
  42. switch(key) {
  43. case "Delete":
  44. let kbt = this.keyboardText;
  45. this.keyboardText = kbt.length ? kbt.substring(0, kbt.length - 1) : kbt;
  46. break;
  47. case "Tab":
  48. this.keyboardText += "\t";
  49. break;
  50. case "Enter":
  51. this.keyboardText += "\n";
  52. break;
  53. case "Space":
  54. this.keyboardText += " ";
  55. break;
  56. case "Caps":
  57. this.hasCapsed = !this.hasCapsed;
  58. this.keyList = this.hasCapsed ? this.capsedKeyList : this.normalKeyList;
  59. break;
  60. case "Shift":
  61. this.hasShifted = !this.hasShifted;
  62. this.keyList = this.hasShifted ? this.shiftedKeyList : this.normalKeyList;
  63. break;
  64. default:
  65. this.keyboardText += key.toString();
  66. break;
  67. }
  68. }
  69. },
  70. mounted() {
  71. let normalKeyList = ['`', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 'Delete',
  72. 'Tab', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\\',
  73. 'Caps', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', "'", 'Enter',
  74. 'Shift', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 'Shift',
  75. 'Space'],
  76. shiftedKeyList = ['~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', 'Delete',
  77. 'Tab', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', '|',
  78. 'Caps', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', 'Enter',
  79. 'Shift', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?', 'Shift',
  80. 'Space'],
  81. capsedKeyList = ['`', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 'Delete',
  82. 'Tab', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '[', ']', '\\',
  83. 'Caps', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', "'", 'Enter',
  84. 'Shift', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', ',', '.', '/', 'Shift',
  85. 'Space'];
  86. this.keyList = this.normalKeyList = normalKeyList;
  87. this.shiftedKeyList = shiftedKeyList;
  88. this.capsedKeyList = capsedKeyList;
  89. }
  90. }
  91. </script>
  92. <style scoped>
  93. .keyboard {
  94. width: 688px;
  95. margin: 0;
  96. padding: 0;
  97. list-style: none;
  98. user-select: none;
  99. li {
  100. float: left;
  101. margin: 0 5px 5px 0;
  102. width: 40px;
  103. height: 40px;
  104. line-height: 40px;
  105. text-align: center;
  106. background: #fff;
  107. border: 1px solid #e5e5e5;
  108. border-radius: 5px;
  109. &:hover {
  110. position: relative;
  111. border-color: gray;
  112. cursor: pointer;
  113. }
  114. &:active {
  115. top: 1px;
  116. left: 1px;
  117. }
  118. }
  119. .tab, .delete {
  120. width: 70px;
  121. }
  122. .capslock {
  123. width: 80px;
  124. }
  125. .enter {
  126. width: 77px;
  127. }
  128. .shift {
  129. width: 102px;
  130. }
  131. .space {
  132. clear: left;
  133. width: 681px;
  134. }
  135. .shifted {
  136. position: relative;
  137. top: 1px;
  138. left: 1px;
  139. border-color: #e5e5e5;
  140. cursor: pointer;
  141. }
  142. .capsed {
  143. position: relative;
  144. top: 1px;
  145. left: 1px;
  146. border-color: #e5e5e5;
  147. cursor: pointer;
  148. }
  149. }
  150. </style>