set.vue 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. <template>
  2. <div>
  3. <div class="tag-box" v-if="brandId || filterId_name.length > 0">
  4. <div class="tag-title">已选择</div>
  5. <div class="brand-name" v-if="brandId">
  6. <div><span style="color: #b0b0b0;">品牌:</span>{{brandId_name}} <i @click="clearAll('brand')" class="iconfont icon-close11 finger-point" style="font-size: 12px;padding-left: 5px;"></i></div>
  7. </div>
  8. <div class="tag-name" v-if="filterId_name.length > 0">
  9. <div><span style="color: #b0b0b0;">标签:</span><span v-for="(item,i) in filterId_name" :key="i">{{item}} <em v-if="i!=filterId_name.length-1">,</em></span><i @click="clearAll('tag')" class="iconfont icon-close11 finger-point" style="font-size: 12px;padding-left: 5px;"></i></div>
  10. </div>
  11. </div>
  12. <div class="tag-box" v-if="brand.length > 0">
  13. <div class="tag-title">
  14. 品牌
  15. </div>
  16. <div id="brand-box" class="tag-scroll-content" :class="{'showMore':showMore}">
  17. <span class="tag-item" :class="{'active': brandId == brand_item.id}" v-for="(brand_item,index) in brand" :key="index" @click="selecbrand(brand_item)">{{brand_item.name}}</span>
  18. </div>
  19. <div class="tag-right" v-if="!showMore">
  20. <div class="tag-more finger-point" @click="showMore = true"><span>更多</span></div>
  21. </div>
  22. </div>
  23. <div class="tag-box" v-if="child && child.length>0 ">
  24. <div class="tag-title">
  25. 分类
  26. </div>
  27. <div id="brand-box" class="tag-scroll-content" >
  28. <span class="tag-item" :class="{'active': childId == classItem.id,'activeColor': childId == classItem.id}" v-for="(classItem,index) in child" :key="index" @click='selectTap(classItem)' >
  29. {{classItem.name}}</span>
  30. </div>
  31. </div>
  32. <div class="tag-box" v-if="tagname.length > 0">
  33. <div class="tag-title">
  34. 标签
  35. </div>
  36. <div class="tag-content">
  37. <div style="margin: 5px" v-for="(tag, index) in tagname" :key="index">
  38. <el-popover width="300" trigger="hover">
  39. <div class="tagname-item">
  40. <span class="tag-item" :class="{'active': filterId.includes(item.id)}" v-for="item in tag.value" :key="item.id" @click="selectname(item)">{{item.name}}</span>
  41. </div>
  42. <el-button slot="reference" size="mini">{{tag.name}}</el-button>
  43. </el-popover>
  44. </div>
  45. </div>
  46. </div>
  47. <div class="common_left flex flex-j-sb flex-a-c common_title">
  48. <div class="flex">
  49. <div class="select_box flex flex-a-c"
  50. :class="{ active: sort_name == 1, up: sort_status == 2, down: sort_status == 1 }"
  51. @click="changeStatus(1)"
  52. >
  53. 综合推荐
  54. <div class="img" v-if="sort_name == 1">
  55. <img v-if="sort_status == 2" src="~/assets/images/icon/up_price.png">
  56. <img v-if="sort_status == 1" src="~/assets/images/icon/down_price.png">
  57. </div>
  58. <div class="img" v-else>
  59. <img src="~/assets/images/icon/normal_price.png">
  60. </div>
  61. </div>
  62. <div class="select_box flex flex-a-c"
  63. :class="{ active: sort_name == 2, up: sort_status == 2, down: sort_status == 1 }"
  64. @click="changeStatus(2)"
  65. >
  66. 销量
  67. <div class="img" v-if="sort_name == 2">
  68. <img v-if="sort_status == 2" src="~/assets/images/icon/up_price.png">
  69. <img v-if="sort_status == 1" src="~/assets/images/icon/down_price.png">
  70. </div>
  71. <div class="img" v-else>
  72. <img src="~/assets/images/icon/normal_price.png">
  73. </div>
  74. </div>
  75. <div class="select_box flex flex-a-c"
  76. :class="{ active: sort_name == 3, up: sort_status == 2, down: sort_status == 1 }"
  77. @click="changeStatus(3)"
  78. >
  79. 价格
  80. <div class="img" v-if="sort_name == 3">
  81. <img v-if="sort_status == 2" src="~/assets/images/icon/up_price.png">
  82. <img v-if="sort_status == 1" src="~/assets/images/icon/down_price.png">
  83. </div>
  84. <div class="img" v-else>
  85. <img src="~/assets/images/icon/normal_price.png">
  86. </div>
  87. </div>
  88. </div>
  89. <div class="common_right">
  90. <i style="color: #fa0000" class="el-icon-success"></i><span>根据大部分用户选择的商品,为您推荐!</span>
  91. </div>
  92. </div>
  93. </div>
  94. </template>
  95. <script>
  96. import {mapState} from "vuex";
  97. export default {
  98. props:['child'],
  99. data() {
  100. return {
  101. sort_name: 1,
  102. sort_status: 1,
  103. brand: [],
  104. tagname: [],
  105. showMore: true,
  106. filterId: [],
  107. filterId_name: [],
  108. brandId: '',
  109. brandId_name: '',
  110. childId:''
  111. };
  112. },
  113. computed: {
  114. ...mapState(["basicSet"])
  115. },
  116. mounted() {
  117. this.$nextTick(()=> {
  118. if(this.basicSet.set.pc_temp == 2) {
  119. this.getBrand();
  120. this.getTag();
  121. }
  122. })
  123. },
  124. methods: {
  125. selectTap(item){
  126. console.log(item,'sssss')
  127. this.childId = item.id;
  128. this.$emit('changeCategory', item.id)
  129. },
  130. getBrand() {
  131. this.fun.$post("goods.brand.get-brand").then(res => {
  132. this.brand = res.data.data || [];
  133. this.$nextTick(()=>{
  134. if(document.querySelector('#brand-box') && document.querySelector('#brand-box').offsetHeight > 58){
  135. this.showMore = false;
  136. }
  137. })
  138. });
  139. },
  140. getTag() {
  141. this.fun.$get("goods.filtering.index")
  142. .then(res => {
  143. if (res.result == 1) {
  144. this.tagname = res.data || [];
  145. for (let i = 0; i < this.tagname.length; i++) {
  146. for (let y = 0; y < this.tagname[i].value.length; y++) {
  147. this.tagname[i].value[y].record = 1;
  148. }
  149. }
  150. }
  151. })
  152. .catch(error => {
  153. console.log(error);
  154. });
  155. },
  156. selecbrand(item) {
  157. if(this.brandId == item.id) {
  158. this.brandId = "";
  159. this.brandId_name = '';
  160. }else {
  161. this.brandId = item.id;
  162. this.brandId_name = item.name;
  163. }
  164. let obj = this.getAllStatus();
  165. this.$emit('changeStatus', obj)
  166. },
  167. selectname(item) {
  168. if (this.filterId.includes(item.id)) {
  169. this.filterId = this.filterId.filter((obj)=> {
  170. return obj != item.id
  171. });
  172. this.filterId_name = this.filterId_name.filter((obj)=> {
  173. return obj != item.name
  174. });
  175. } else {
  176. this.filterId.push(item.id);
  177. this.filterId_name.push(item.name);
  178. }
  179. let obj = this.getAllStatus();
  180. this.$emit('changeStatus', obj)
  181. },
  182. clearAll(flag) {
  183. if(flag === 'tag') {
  184. this.filterId = [];
  185. this.filterId_name = [];
  186. }
  187. if(flag === 'brand') {
  188. this.brandId = "";
  189. this.brandId_name = '';
  190. }
  191. let obj = this.getAllStatus();
  192. this.$emit('changeStatus', obj)
  193. },
  194. getAllStatus() {
  195. return {
  196. sort_name: this.sort_name,
  197. sort_status: this.sort_status,
  198. brandId: this.brandId,
  199. filterId: JSON.parse(JSON.stringify(this.filterId))
  200. }
  201. },
  202. changeStatus(n) {
  203. if(this.sort_name != n) {
  204. this.sort_status = 1
  205. }else {
  206. if (this.sort_status == 2) {
  207. this.sort_status = 1
  208. } else {
  209. this.sort_status = 2
  210. }
  211. }
  212. this.sort_name = n;
  213. let obj = this.getAllStatus();
  214. this.$emit('changeStatus', obj)
  215. }
  216. }
  217. };
  218. </script>
  219. <style lang="scss" scoped>
  220. .tag-box {
  221. display: flex;
  222. flex-wrap: wrap;
  223. align-items: center;
  224. margin: 15px 0;
  225. }
  226. .tag-title {
  227. font-size: 16px;
  228. }
  229. .tag-title, .tag-right{
  230. flex: 0 0 70px;
  231. }
  232. .brand-name, .tag-name {
  233. border: 1px solid var(--color);
  234. border-radius: 3px;
  235. padding: 2px 5px;
  236. margin: 5px;
  237. cursor: default;
  238. }
  239. .tag-more {
  240. border: 1px solid #ddd;
  241. border-radius: 3px;
  242. text-align: center;
  243. padding: 2px;
  244. margin-left: 10px;
  245. }
  246. .tag-more:hover {
  247. border: 1px solid var(--color);
  248. }
  249. .tag-scroll-content, .tag-content {
  250. flex: 1;
  251. display: flex;
  252. flex-wrap: wrap;
  253. }
  254. .tag-scroll-content {
  255. max-height: 60px;
  256. overflow: hidden;
  257. &.showMore {
  258. overflow-y: scroll;
  259. max-height: 120px;
  260. }
  261. }
  262. .tag-scroll-content::-webkit-scrollbar { width: 0 !important }
  263. .tag-scroll-content { overflow: -moz-scrollbars-none; }
  264. .tagname-item {
  265. display: flex;
  266. flex-wrap: wrap;
  267. }
  268. .tag-item {
  269. cursor: pointer;
  270. color: var(--color);
  271. margin: 5px 10px 5px 10px;
  272. }
  273. .activeColor{
  274. color: #fa0000 !important;
  275. }
  276. .tag-item:hover, .tag-item.active {
  277. color: #fa0000;
  278. }
  279. .common_left {
  280. margin-bottom: 30px;
  281. .select_box {
  282. font-size: 16px;
  283. margin-right: 80px;
  284. cursor: pointer;
  285. .img {
  286. margin: 5px 0 0 16px;
  287. }
  288. }
  289. .active {
  290. color: #fa0000;
  291. }
  292. }
  293. </style>