jlk-week.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. <template>
  2. <view class="weeks-outer" :style="{backgroundColor:bgcolor}">
  3. <view class="weeks-title" v-if="!!title" :style="titleStyles">
  4. {{title}}
  5. </view>
  6. <view class="weeks" :class="{'weeks-vertical':vertical}">
  7. <template v-for="item in weeks">
  8. <view :key="item.value" class="weeks-item" :style="{
  9. background: item.checked ? selectedColor : defaultColor,
  10. width: `${size}rpx`,
  11. height: `${size}rpx`,
  12. lineHeight: `${size}rpx`,
  13. fontSize: `${fontSize}rpx`,
  14. color:`${color}`,
  15. borderRadius: `${radius.indexOf('%') > 0 ? radius : (radius+'rpx')}`
  16. }" @tap="tapWeek(item)">
  17. {{item.text}}
  18. <jlk-icon name="jinzhi" color="red" size="48" class="icon-position" v-if="item.disabled"></jlk-icon>
  19. </view>
  20. </template>
  21. </view>
  22. </view>
  23. </template>
  24. <script>
  25. import messages from './i18n/index.js'
  26. import Vue from 'vue'
  27. import VueI18n from 'vue-i18n'
  28. Vue.use(VueI18n)
  29. // let lang = navigator.language.toLowerCase().includes('en')?'en':'zh'
  30. let lang = 'zh'
  31. const i18n = new VueI18n({
  32. locale: lang === 'zh' ? 'zh-CN' : 'en-US',
  33. messages: messages
  34. })
  35. export default {
  36. props: {
  37. title: {
  38. type: String,
  39. default: ''
  40. },
  41. titleStyles: {
  42. type: String,
  43. default: ''
  44. },
  45. value: {
  46. type: Array,
  47. default: () => {
  48. return []
  49. }
  50. },
  51. forbidden: {
  52. type: Array,
  53. default: () => {
  54. return []
  55. }
  56. },
  57. color: {
  58. type: String,
  59. default: '#FFFFFF'
  60. },
  61. bgcolor: {
  62. type: String,
  63. default: '#FFFFFF'
  64. },
  65. defaultColor: {
  66. type: String,
  67. default: '#BBBBBB'
  68. },
  69. selectedColor: {
  70. type: String,
  71. default: '#2A82E4'
  72. },
  73. size: {
  74. type: [String, Number],
  75. default: 72
  76. },
  77. fontSize: {
  78. type: [String, Number],
  79. default: 24
  80. },
  81. disabled: {
  82. type: Boolean,
  83. default: false
  84. },
  85. radius: {
  86. type: [String, Number],
  87. default: '100%'
  88. },
  89. vertical: {
  90. type: Boolean,
  91. default: false
  92. }
  93. },
  94. data() {
  95. return {
  96. weeks: [],
  97. selectedWeeks: [],
  98. }
  99. },
  100. mounted() {
  101. this.weeks = [{
  102. text: i18n.t('Week.Mon'),
  103. value: 1,
  104. checked: false,
  105. disabled: false
  106. },
  107. {
  108. text: i18n.t('Week.Tue'),
  109. value: 2,
  110. checked: false,
  111. disabled: false
  112. },
  113. {
  114. text: i18n.t('Week.Wed'),
  115. value: 3,
  116. checked: false,
  117. disabled: false
  118. },
  119. {
  120. text: i18n.t('Week.Thu'),
  121. value: 4,
  122. checked: false,
  123. disabled: false
  124. },
  125. {
  126. text: i18n.t('Week.Fri'),
  127. value: 5,
  128. checked: false,
  129. disabled: false
  130. },
  131. {
  132. text: i18n.t('Week.Sat'),
  133. value: 6,
  134. checked: false,
  135. disabled: false
  136. },
  137. {
  138. text: i18n.t('Week.Sun'),
  139. value: 0,
  140. checked: false,
  141. disabled: false
  142. }
  143. ]
  144. for (let i = 0; i < this.forbidden.length; i++) {
  145. for (let j = 0; j < this.weeks.length; j++) {
  146. if (this.forbidden[i] === this.weeks[j].value) {
  147. this.weeks[j].disabled = true
  148. }
  149. }
  150. }
  151. this.selectedWeeks = this.value
  152. this.initWeek()
  153. },
  154. methods: {
  155. // 初始化week
  156. initWeek() {
  157. this.weeks.forEach(item => {
  158. this.selectedWeeks.forEach(pro => {
  159. if (item.value === pro) {
  160. item.checked = true
  161. }
  162. })
  163. })
  164. },
  165. //修改week样式
  166. tapWeek(item) {
  167. // 禁用插件
  168. if (this.disabled) return
  169. // 禁用某几个
  170. for (let i = 0; i < this.forbidden.length; i++) {
  171. if (this.forbidden[i] === item.value) {
  172. item.disabled = true
  173. return
  174. }
  175. }
  176. item.checked = !item.checked
  177. if (item.checked) {
  178. if (this.selectedWeeks.indexOf(item.value) === -1) {
  179. this.selectedWeeks.push(item.value)
  180. }
  181. } else {
  182. let index = this.selectedWeeks.indexOf(item.value)
  183. if (index !== -1) {
  184. this.selectedWeeks.splice(index, 1)
  185. }
  186. }
  187. this.$emit('change', this.selectedWeeks)
  188. },
  189. }
  190. }
  191. </script>
  192. <style lang="scss" scoped>
  193. .weeks-outer {
  194. width: 100%;
  195. padding: 20rpx 0;
  196. }
  197. .weeks-title {
  198. text-align: center;
  199. padding: 40rpx 32rpx;
  200. color: #666666;
  201. }
  202. .weeks {
  203. display: flex;
  204. flex-direction: row;
  205. justify-content: space-evenly;
  206. align-items: center;
  207. }
  208. .weeks .weeks-item {
  209. position: relative;
  210. text-align: center;
  211. }
  212. .weeks-vertical {
  213. flex-direction: column;
  214. }
  215. .weeks-vertical .weeks-item {
  216. margin: 10rpx 0;
  217. }
  218. .icon-position {
  219. position: absolute;
  220. top: 0;
  221. right: 0;
  222. bottom: 0;
  223. left: 0;
  224. margin: auto;
  225. opacity: 0.5;
  226. }
  227. </style>