uni-goods-nav.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. <template>
  2. <view class="uni-goods-nav">
  3. <!-- 底部占位 -->
  4. <view class="uni-tab__seat"/>
  5. <view class="uni-tab__cart-box flex">
  6. <view class="flex uni-tab__cart-sub-left">
  7. <view v-for="(item,index) in options" :key="index" class="flex uni-tab__cart-button-left uni-tab__shop-cart"
  8. @click="onClick(index,item)">
  9. <view class="uni-tab__icon">
  10. <uni-icons :type="item.icon" size="20" color="#646566"></uni-icons>
  11. <!-- <image class="image" :src="item.icon" mode="widthFix" /> -->
  12. </view>
  13. <text class="uni-tab__text">{{ item.text }}</text>
  14. <view class="flex uni-tab__dot-box">
  15. <text v-if="item.info" :class="{ 'uni-tab__dots': item.info > 9 }" class="uni-tab__dot " :style="{'backgroundColor':item.infoBackgroundColor?item.infoBackgroundColor:'#ff0000',
  16. color:item.infoColor?item.infoColor:'#fff'
  17. }">{{ item.info }}
  18. </text>
  19. </view>
  20. </view>
  21. </view>
  22. <view :class="{'uni-tab__right':fill}" class="flex uni-tab__cart-sub-right ">
  23. <view v-for="(item,index) in buttonGroup" :key="index"
  24. :style="{background:item.backgroundColor,color:item.color}"
  25. class="flex uni-tab__cart-button-right" @click="buttonClick(index,item)">
  26. <text :style="{color:item.color}" class="uni-tab__cart-button-right-text">{{ item.text }}</text>
  27. </view>
  28. </view>
  29. </view>
  30. </view>
  31. </template>
  32. <script>
  33. import {initVueI18n} from '@dcloudio/uni-i18n'
  34. import messages from './i18n/index.js'
  35. const {t} = initVueI18n(messages)
  36. /**
  37. * GoodsNav 商品导航
  38. * @description 商品加入购物车、立即购买等
  39. * @tutorial https://ext.dcloud.net.cn/plugin?id=865
  40. * @property {Array} options 组件参数
  41. * @property {Array} buttonGroup 组件按钮组参数
  42. * @property {Boolean} fill = [true | false] 组件按钮组参数
  43. * @event {Function} click 左侧点击事件
  44. * @event {Function} buttonClick 右侧按钮组点击事件
  45. * @example <uni-goods-nav :fill="true" options="" buttonGroup="buttonGroup" @click="" @buttonClick="" />
  46. */
  47. export default {
  48. name: 'UniGoodsNav',
  49. emits: ['click', 'buttonClick'],
  50. props: {
  51. options: {
  52. type: Array,
  53. default() {
  54. return [{
  55. icon: 'shop',
  56. text: t("uni-goods-nav.options.shop"),
  57. }, {
  58. icon: 'cart',
  59. text: t("uni-goods-nav.options.cart")
  60. }]
  61. }
  62. },
  63. buttonGroup: {
  64. type: Array,
  65. default() {
  66. return [{
  67. text: t("uni-goods-nav.buttonGroup.addToCart"),
  68. backgroundColor: 'linear-gradient(90deg, #FFCD1E, #FF8A18)',
  69. color: '#fff'
  70. },
  71. {
  72. text: t("uni-goods-nav.buttonGroup.buyNow"),
  73. backgroundColor: 'linear-gradient(90deg, #FE6035, #EF1224)',
  74. color: '#fff'
  75. }
  76. ]
  77. }
  78. },
  79. fill: {
  80. type: Boolean,
  81. default: false
  82. }
  83. },
  84. methods: {
  85. onClick(index, item) {
  86. this.$emit('click', {
  87. index,
  88. content: item,
  89. })
  90. },
  91. buttonClick(index, item) {
  92. if (uni.report) {
  93. uni.report(item.text, item.text)
  94. }
  95. this.$emit('buttonClick', {
  96. index,
  97. content: item
  98. })
  99. }
  100. }
  101. }
  102. </script>
  103. <style lang="scss">
  104. .flex {
  105. /* #ifndef APP-NVUE */
  106. display: flex;
  107. /* #endif */
  108. flex-direction: row;
  109. }
  110. .uni-goods-nav {
  111. /* #ifndef APP-NVUE */
  112. display: flex;
  113. /* #endif */
  114. flex: 1;
  115. flex-direction: row;
  116. }
  117. .uni-tab__cart-box {
  118. flex: 1;
  119. height: 50px;
  120. background-color: #fff;
  121. z-index: 900;
  122. }
  123. .uni-tab__cart-sub-left {
  124. padding: 0 5px;
  125. }
  126. .uni-tab__cart-sub-right {
  127. flex: 1;
  128. }
  129. .uni-tab__right {
  130. margin: 5px 0;
  131. margin-right: 10px;
  132. border-radius: 100px;
  133. overflow: hidden;
  134. }
  135. .uni-tab__cart-button-left {
  136. /* #ifndef APP-NVUE */
  137. display: flex;
  138. /* #endif */
  139. // flex: 1;
  140. position: relative;
  141. justify-content: center;
  142. align-items: center;
  143. flex-direction: column;
  144. margin: 0 10px;
  145. /* #ifdef H5 */
  146. cursor: pointer;
  147. /* #endif */
  148. }
  149. .uni-tab__icon {
  150. width: 18px;
  151. height: 18px;
  152. }
  153. .image {
  154. width: 18px;
  155. height: 18px;
  156. }
  157. .uni-tab__text {
  158. margin-top: 3px;
  159. font-size: 12px;
  160. color: #646566;
  161. }
  162. .uni-tab__cart-button-right {
  163. /* #ifndef APP-NVUE */
  164. display: flex;
  165. flex-direction: column;
  166. /* #endif */
  167. flex: 1;
  168. justify-content: center;
  169. align-items: center;
  170. /* #ifdef H5 */
  171. cursor: pointer;
  172. /* #endif */
  173. }
  174. .uni-tab__cart-button-right-text {
  175. font-size: 14px;
  176. color: #fff;
  177. }
  178. .uni-tab__cart-button-right:active {
  179. opacity: 0.7;
  180. }
  181. .uni-tab__dot-box {
  182. /* #ifndef APP-NVUE */
  183. display: flex;
  184. flex-direction: column;
  185. /* #endif */
  186. position: absolute;
  187. right: -2px;
  188. top: 2px;
  189. justify-content: center;
  190. align-items: center;
  191. // width: 0;
  192. // height: 0;
  193. }
  194. .uni-tab__dot {
  195. // width: 30rpx;
  196. // height: 30rpx;
  197. padding: 0 4px;
  198. line-height: 15px;
  199. color: #ffffff;
  200. text-align: center;
  201. font-size: 12px;
  202. background-color: #ff0000;
  203. border-radius: 15px;
  204. }
  205. .uni-tab__dots {
  206. padding: 0 4px;
  207. // width: auto;
  208. border-radius: 15px;
  209. }
  210. </style>