mirror of
				https://gitee.com/vant-contrib/vant.git
				synced 2025-10-31 03:22:08 +08:00 
			
		
		
		
	* feat(Sku): 售罄sku支持点击 * feat(Sku): add disable-soldout-sku prop Co-authored-by: zhanglin_0715 <zhanglin_0715@youzan.com>
		
			
				
	
	
		
			273 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			273 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div class="van-doc-header">
 | |
|     <div class="van-doc-row">
 | |
|       <div class="van-doc-header__top">
 | |
|         <a class="van-doc-header__logo">
 | |
|           <img :src="config.logo" />
 | |
|           <span>{{ config.title }}</span>
 | |
|         </a>
 | |
| 
 | |
|         <search-input
 | |
|           v-if="searchConfig"
 | |
|           :lang="lang"
 | |
|           :search-config="searchConfig"
 | |
|         />
 | |
| 
 | |
|         <ul class="van-doc-header__top-nav">
 | |
|           <li v-for="item in config.links" class="van-doc-header__top-nav-item">
 | |
|             <a
 | |
|               class="van-doc-header__logo-link"
 | |
|               target="_blank"
 | |
|               :href="item.url"
 | |
|             >
 | |
|               <img :src="item.logo" />
 | |
|             </a>
 | |
|           </li>
 | |
| 
 | |
|           <li
 | |
|             ref="version"
 | |
|             v-if="versions"
 | |
|             class="van-doc-header__top-nav-item"
 | |
|           >
 | |
|             <span
 | |
|               class="van-doc-header__cube van-doc-header__version"
 | |
|               @click="toggleVersionPop"
 | |
|             >
 | |
|               {{ versions[0].label }}
 | |
|               <transition name="van-doc-dropdown">
 | |
|                 <div v-if="showVersionPop" class="van-doc-header__version-pop">
 | |
|                   <div
 | |
|                     v-for="item in versions"
 | |
|                     class="van-doc-header__version-pop-item"
 | |
|                     @click="onSwitchVersion(item)"
 | |
|                   >
 | |
|                     {{ item.label }}
 | |
|                   </div>
 | |
|                 </div>
 | |
|               </transition>
 | |
|             </span>
 | |
|           </li>
 | |
| 
 | |
|           <li v-if="langLabel && langLink" class="van-doc-header__top-nav-item">
 | |
|             <a class="van-doc-header__cube" :href="langLink">{{ langLabel }}</a>
 | |
|           </li>
 | |
|         </ul>
 | |
|       </div>
 | |
|     </div>
 | |
|   </div>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| import SearchInput from './SearchInput';
 | |
| 
 | |
| export default {
 | |
|   name: 'van-doc-header',
 | |
| 
 | |
|   components: {
 | |
|     SearchInput,
 | |
|   },
 | |
| 
 | |
|   props: {
 | |
|     lang: String,
 | |
|     config: Object,
 | |
|     versions: Array,
 | |
|     langConfigs: Array,
 | |
|   },
 | |
| 
 | |
|   data() {
 | |
|     return {
 | |
|       showVersionPop: false,
 | |
|     };
 | |
|   },
 | |
| 
 | |
|   computed: {
 | |
|     langLink() {
 | |
|       return `#${this.$route.path.replace(this.lang, this.anotherLang.lang)}`;
 | |
|     },
 | |
| 
 | |
|     langLabel() {
 | |
|       return this.anotherLang.label;
 | |
|     },
 | |
| 
 | |
|     anotherLang() {
 | |
|       const items = this.langConfigs.filter((item) => item.lang !== this.lang);
 | |
|       if (items.length) {
 | |
|         return items[0];
 | |
|       }
 | |
| 
 | |
|       return {};
 | |
|     },
 | |
| 
 | |
|     searchConfig() {
 | |
|       return this.config.searchConfig;
 | |
|     },
 | |
|   },
 | |
| 
 | |
|   methods: {
 | |
|     toggleVersionPop() {
 | |
|       const val = !this.showVersionPop;
 | |
| 
 | |
|       const action = val ? 'add' : 'remove';
 | |
|       document.body[`${action}EventListener`](
 | |
|         'click',
 | |
|         this.checkHideVersionPop
 | |
|       );
 | |
| 
 | |
|       this.showVersionPop = val;
 | |
|     },
 | |
| 
 | |
|     checkHideVersionPop(event) {
 | |
|       if (!this.$refs.version.contains(event.target)) {
 | |
|         this.showVersionPop = false;
 | |
|       }
 | |
|     },
 | |
| 
 | |
|     onSwitchLang(lang) {
 | |
|       this.$router.push(this.$route.path.replace(lang.from, lang.to));
 | |
|     },
 | |
| 
 | |
|     onSwitchVersion(version) {
 | |
|       if (version.link) {
 | |
|         location.href = version.link;
 | |
|       }
 | |
|     },
 | |
|   },
 | |
| };
 | |
| </script>
 | |
| 
 | |
| <style lang="less">
 | |
| @import '../../common/style/var';
 | |
| 
 | |
| .van-doc-header {
 | |
|   width: 100%;
 | |
|   background-color: #001938;
 | |
|   user-select: none;
 | |
| 
 | |
|   &__top {
 | |
|     display: flex;
 | |
|     align-items: center;
 | |
|     height: @van-doc-header-top-height;
 | |
|     padding: 0 @van-doc-padding;
 | |
|     line-height: @van-doc-header-top-height;
 | |
| 
 | |
|     &-nav {
 | |
|       flex: 1;
 | |
|       font-size: 0;
 | |
|       text-align: right;
 | |
| 
 | |
|       > li {
 | |
|         position: relative;
 | |
|         display: inline-block;
 | |
|         vertical-align: middle;
 | |
|       }
 | |
| 
 | |
|       &-item {
 | |
|         margin-left: 20px;
 | |
|       }
 | |
| 
 | |
|       &-title {
 | |
|         display: block;
 | |
|         font-size: 15px;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   &__cube {
 | |
|     position: relative;
 | |
|     display: block;
 | |
|     padding: 0 12px;
 | |
|     color: #fff;
 | |
|     font-size: 14px;
 | |
|     line-height: 24px;
 | |
|     text-align: center;
 | |
|     border: 1px solid rgba(255, 255, 255, 0.7);
 | |
|     border-radius: 20px;
 | |
|     cursor: pointer;
 | |
|     transition: 0.3s ease-in-out;
 | |
|   }
 | |
| 
 | |
|   &__version {
 | |
|     padding-right: 20px;
 | |
| 
 | |
|     &::after {
 | |
|       position: absolute;
 | |
|       top: 7px;
 | |
|       right: 7px;
 | |
|       width: 5px;
 | |
|       height: 5px;
 | |
|       color: rgba(255, 255, 255, 0.9);
 | |
|       border: 1px solid;
 | |
|       border-color: transparent transparent currentColor currentColor;
 | |
|       transform: rotate(-45deg);
 | |
|       content: '';
 | |
|     }
 | |
| 
 | |
|     &-pop {
 | |
|       position: absolute;
 | |
|       top: 30px;
 | |
|       right: 0;
 | |
|       left: 0;
 | |
|       z-index: 99;
 | |
|       color: #333;
 | |
|       line-height: 36px;
 | |
|       text-align: left;
 | |
|       background-color: #fff;
 | |
|       border-radius: @van-doc-border-radius;
 | |
|       box-shadow: 0 4px 12px #ebedf0;
 | |
|       transform-origin: top;
 | |
|       transition: 0.2s cubic-bezier(0.215, 0.61, 0.355, 1);
 | |
| 
 | |
|       &-item {
 | |
|         padding-left: 12px;
 | |
|         transition: 0.2s;
 | |
| 
 | |
|         &:hover {
 | |
|           color: @van-doc-blue;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   &__logo {
 | |
|     display: block;
 | |
| 
 | |
|     img,
 | |
|     span {
 | |
|       display: inline-block;
 | |
|       vertical-align: middle;
 | |
|     }
 | |
| 
 | |
|     img {
 | |
|       width: 24px;
 | |
|       margin-right: 10px;
 | |
|     }
 | |
| 
 | |
|     span {
 | |
|       color: #fff;
 | |
|       font-size: 22px;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   &__logo-link {
 | |
|     img {
 | |
|       display: block;
 | |
|       width: 26px;
 | |
|       height: 26px;
 | |
|       transition: 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
 | |
| 
 | |
|       &:hover {
 | |
|         transform: scale(1.2);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| .van-doc-dropdown {
 | |
|   &-enter,
 | |
|   &-leave-active {
 | |
|     transform: scaleY(0);
 | |
|     opacity: 0;
 | |
|   }
 | |
| }
 | |
| </style>
 |