fix: 修复 carousel-item 无法嵌套 v-for 渲染
This commit is contained in:
		
							parent
							
								
									5701edd631
								
							
						
					
					
						commit
						ae96c341f0
					
				@ -118,6 +118,45 @@ export default {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
:::
 | 
					:::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					::: title 动态遍历
 | 
				
			||||||
 | 
					:::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					::: demo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <lay-carousel v-model="active">
 | 
				
			||||||
 | 
					    <lay-carousel-item :id="item.id" v-for="item in arrays">
 | 
				
			||||||
 | 
					      <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#79C48C;">{{ item.text }}</div>
 | 
				
			||||||
 | 
					    </lay-carousel-item>
 | 
				
			||||||
 | 
					  </lay-carousel>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import { ref } from 'vue'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  setup() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const active = ref("1")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const arrays = ref([
 | 
				
			||||||
 | 
					      {id: "1", text: ""},
 | 
				
			||||||
 | 
					      {id: "2", text: ""},
 | 
				
			||||||
 | 
					      {id: "3", text: ""},
 | 
				
			||||||
 | 
					      {id: "4", text: ""}
 | 
				
			||||||
 | 
					    ])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      active,
 | 
				
			||||||
 | 
					      arrays
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
::: title Carousel 属性
 | 
					::: title Carousel 属性
 | 
				
			||||||
:::
 | 
					:::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -23,6 +23,7 @@
 | 
				
			|||||||
          <li>[新增] page 分页组件 v-model 属性, 支持默认页设置。</li>
 | 
					          <li>[新增] page 分页组件 v-model 属性, 支持默认页设置。</li>
 | 
				
			||||||
          <li>[新增] date-picker 日期选择组件, 支持年月, 日期, 时间。</li>
 | 
					          <li>[新增] date-picker 日期选择组件, 支持年月, 日期, 时间。</li>
 | 
				
			||||||
          <li>[新增] transfer 穿梭框组件 showSearch 开启搜索属性。</li>
 | 
					          <li>[新增] transfer 穿梭框组件 showSearch 开启搜索属性。</li>
 | 
				
			||||||
 | 
					          <li>[修复] carousel-item 轮播项使用 v-for 无法渲染。</li>
 | 
				
			||||||
          <li>[修复] checkbox 复选框组件, 选中颜色丢失。</li>
 | 
					          <li>[修复] checkbox 复选框组件, 选中颜色丢失。</li>
 | 
				
			||||||
          <li>[修复] slider 滑块组件, 默认 step 值异常。</li>
 | 
					          <li>[修复] slider 滑块组件, 默认 step 值异常。</li>
 | 
				
			||||||
          <li>[升级] layer-vue 1.3.10 版本。</li>
 | 
					          <li>[升级] layer-vue 1.3.10 版本。</li>
 | 
				
			||||||
 | 
				
			|||||||
@ -1,278 +1,276 @@
 | 
				
			|||||||
@import "../../theme/variable.less";
 | 
					@import "../../theme/variable.less";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
.layui-carousel {
 | 
					.layui-carousel {
 | 
				
			||||||
    position: relative;
 | 
					  position: relative;
 | 
				
			||||||
    left: 0;
 | 
					  left: 0;
 | 
				
			||||||
    top: 0;
 | 
					  top: 0;
 | 
				
			||||||
    background-color: #f8f8f8;
 | 
					  background-color: #f8f8f8;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel > [carousel-item] {
 | 
					.layui-carousel > [carousel-item] {
 | 
				
			||||||
    position: relative;
 | 
					  position: relative;
 | 
				
			||||||
    width: 100%;
 | 
					  width: 100%;
 | 
				
			||||||
    height: 100%;
 | 
					  height: 100%;
 | 
				
			||||||
    overflow: hidden;
 | 
					  overflow: hidden;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel > [carousel-item]:before {
 | 
					.layui-carousel > [carousel-item]:before {
 | 
				
			||||||
    position: absolute;
 | 
					  position: absolute;
 | 
				
			||||||
    content: "\e63d";
 | 
					  content: "\e63d";
 | 
				
			||||||
    left: 50%;
 | 
					  left: 50%;
 | 
				
			||||||
    top: 50%;
 | 
					  top: 50%;
 | 
				
			||||||
    width: 100px;
 | 
					  width: 100px;
 | 
				
			||||||
    line-height: 20px;
 | 
					  line-height: 20px;
 | 
				
			||||||
    margin: -10px 0 0 -50px;
 | 
					  margin: -10px 0 0 -50px;
 | 
				
			||||||
    text-align: center;
 | 
					  text-align: center;
 | 
				
			||||||
    color: @global-neutral-color-8;
 | 
					  color: @global-neutral-color-8;
 | 
				
			||||||
    font-family: layui-icon !important;
 | 
					  font-family: layui-icon !important;
 | 
				
			||||||
    font-size: 30px;
 | 
					  font-size: 30px;
 | 
				
			||||||
    font-style: normal;
 | 
					  font-style: normal;
 | 
				
			||||||
    -webkit-font-smoothing: antialiased;
 | 
					  -webkit-font-smoothing: antialiased;
 | 
				
			||||||
    -moz-osx-font-smoothing: grayscale;
 | 
					  -moz-osx-font-smoothing: grayscale;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel > [carousel-item] > * {
 | 
					.layui-carousel > [carousel-item] > * {
 | 
				
			||||||
    display: none;
 | 
					  display: none;
 | 
				
			||||||
    position: absolute;
 | 
					  position: absolute;
 | 
				
			||||||
    left: 0;
 | 
					  left: 0;
 | 
				
			||||||
    top: 0;
 | 
					  top: 0;
 | 
				
			||||||
    width: 100%;
 | 
					  width: 100%;
 | 
				
			||||||
    height: 100%;
 | 
					  height: 100%;
 | 
				
			||||||
    background-color: #f8f8f8;
 | 
					  background-color: #f8f8f8;
 | 
				
			||||||
    transition-duration: 0.3s;
 | 
					  transition-duration: 0.3s;
 | 
				
			||||||
    -webkit-transition-duration: 0.3s;
 | 
					  -webkit-transition-duration: 0.3s;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel-updown > * {
 | 
					.layui-carousel-updown > * {
 | 
				
			||||||
    -webkit-transition: 0.3s ease-in-out up;
 | 
					  -webkit-transition: 0.3s ease-in-out up;
 | 
				
			||||||
    transition: 0.3s ease-in-out up;
 | 
					  transition: 0.3s ease-in-out up;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel-arrow {
 | 
					.layui-carousel-arrow {
 | 
				
			||||||
    display: none\9;
 | 
					  display: none\9;
 | 
				
			||||||
    opacity: 0;
 | 
					  opacity: 0;
 | 
				
			||||||
    position: absolute;
 | 
					  position: absolute;
 | 
				
			||||||
    left: 10px;
 | 
					  left: 10px;
 | 
				
			||||||
    top: 50%;
 | 
					  top: 50%;
 | 
				
			||||||
    margin-top: -18px;
 | 
					  margin-top: -18px;
 | 
				
			||||||
    width: 36px;
 | 
					  width: 36px;
 | 
				
			||||||
    height: 36px;
 | 
					  height: 36px;
 | 
				
			||||||
    line-height: 36px;
 | 
					  line-height: 36px;
 | 
				
			||||||
    text-align: center;
 | 
					  text-align: center;
 | 
				
			||||||
    font-size: 20px;
 | 
					  font-size: 20px;
 | 
				
			||||||
    border: 0;
 | 
					  border: 0;
 | 
				
			||||||
    border-radius: 50%;
 | 
					  border-radius: 50%;
 | 
				
			||||||
    background-color: rgba(0, 0, 0, 0.2);
 | 
					  background-color: rgba(0, 0, 0, 0.2);
 | 
				
			||||||
    color: #fff;
 | 
					  color: #fff;
 | 
				
			||||||
    -webkit-transition-duration: 0.3s;
 | 
					  -webkit-transition-duration: 0.3s;
 | 
				
			||||||
    transition-duration: 0.3s;
 | 
					  transition-duration: 0.3s;
 | 
				
			||||||
    cursor: pointer;
 | 
					  cursor: pointer;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel-arrow[lay-type="add"] {
 | 
					.layui-carousel-arrow[lay-type="add"] {
 | 
				
			||||||
    left: auto !important;
 | 
					  left: auto !important;
 | 
				
			||||||
    right: 10px;
 | 
					  right: 10px;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel:hover .layui-carousel-arrow[lay-type="add"],
 | 
					.layui-carousel:hover .layui-carousel-arrow[lay-type="add"],
 | 
				
			||||||
  .layui-carousel[lay-arrow="always"] .layui-carousel-arrow[lay-type="add"] {
 | 
					.layui-carousel[lay-arrow="always"] .layui-carousel-arrow[lay-type="add"] {
 | 
				
			||||||
    right: 20px;
 | 
					  right: 20px;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel[lay-arrow="always"] .layui-carousel-arrow {
 | 
					.layui-carousel[lay-arrow="always"] .layui-carousel-arrow {
 | 
				
			||||||
    opacity: 1;
 | 
					  opacity: 1;
 | 
				
			||||||
    left: 20px;
 | 
					  left: 20px;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel[lay-arrow="none"] .layui-carousel-arrow {
 | 
					.layui-carousel[lay-arrow="none"] .layui-carousel-arrow {
 | 
				
			||||||
    display: none;
 | 
					  display: none;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel-arrow:hover,
 | 
					.layui-carousel-arrow:hover,
 | 
				
			||||||
  .layui-carousel-ind ul:hover {
 | 
					.layui-carousel-ind ul:hover {
 | 
				
			||||||
    background-color: rgba(0, 0, 0, 0.35);
 | 
					  background-color: rgba(0, 0, 0, 0.35);
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel:hover .layui-carousel-arrow {
 | 
					.layui-carousel:hover .layui-carousel-arrow {
 | 
				
			||||||
    display: block\9;
 | 
					  display: block\9;
 | 
				
			||||||
    opacity: 1;
 | 
					  opacity: 1;
 | 
				
			||||||
    left: 20px;
 | 
					  left: 20px;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel-ind {
 | 
					.layui-carousel-ind {
 | 
				
			||||||
    position: relative;
 | 
					  position: relative;
 | 
				
			||||||
    top: -35px;
 | 
					  top: -35px;
 | 
				
			||||||
    width: 100%;
 | 
					  width: 100%;
 | 
				
			||||||
    line-height: 0 !important;
 | 
					  line-height: 0 !important;
 | 
				
			||||||
    text-align: center;
 | 
					  text-align: center;
 | 
				
			||||||
    font-size: 0;
 | 
					  font-size: 0;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel[lay-indicator="outside"] {
 | 
					.layui-carousel[lay-indicator="outside"] {
 | 
				
			||||||
    margin-bottom: 30px;
 | 
					  margin-bottom: 30px;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel[lay-indicator="outside"] .layui-carousel-ind {
 | 
					.layui-carousel[lay-indicator="outside"] .layui-carousel-ind {
 | 
				
			||||||
    top: 10px;
 | 
					  top: 10px;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel[lay-indicator="outside"] .layui-carousel-ind ul {
 | 
					.layui-carousel[lay-indicator="outside"] .layui-carousel-ind ul {
 | 
				
			||||||
    background-color: rgba(0, 0, 0, 0.5);
 | 
					  background-color: rgba(0, 0, 0, 0.5);
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel[lay-indicator="none"] .layui-carousel-ind {
 | 
					.layui-carousel[lay-indicator="none"] .layui-carousel-ind {
 | 
				
			||||||
    display: none;
 | 
					  display: none;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel-ind ul {
 | 
					.layui-carousel-ind ul {
 | 
				
			||||||
    display: inline-block;
 | 
					  display: inline-block;
 | 
				
			||||||
    padding: 5px;
 | 
					  padding: 5px;
 | 
				
			||||||
    background-color: rgba(0, 0, 0, 0.2);
 | 
					  background-color: rgba(0, 0, 0, 0.2);
 | 
				
			||||||
    border-radius: 10px;
 | 
					  border-radius: 10px;
 | 
				
			||||||
    -webkit-transition-duration: 0.3s;
 | 
					  -webkit-transition-duration: 0.3s;
 | 
				
			||||||
    transition-duration: 0.3s;
 | 
					  transition-duration: 0.3s;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel-ind li {
 | 
					.layui-carousel-ind li {
 | 
				
			||||||
    display: inline-block;
 | 
					  display: inline-block;
 | 
				
			||||||
    width: 10px;
 | 
					  width: 10px;
 | 
				
			||||||
    height: 10px;
 | 
					  height: 10px;
 | 
				
			||||||
    margin: 0 3px;
 | 
					  margin: 0 3px;
 | 
				
			||||||
    font-size: 14px;
 | 
					  font-size: 14px;
 | 
				
			||||||
    background-color: @global-neutral-color-3;
 | 
					  background-color: @global-neutral-color-3;
 | 
				
			||||||
    background-color: rgba(255, 255, 255, 0.5);
 | 
					  background-color: rgba(255, 255, 255, 0.5);
 | 
				
			||||||
    border-radius: 50%;
 | 
					  border-radius: 50%;
 | 
				
			||||||
    cursor: pointer;
 | 
					  cursor: pointer;
 | 
				
			||||||
    -webkit-transition-duration: 0.3s;
 | 
					  -webkit-transition-duration: 0.3s;
 | 
				
			||||||
    transition-duration: 0.3s;
 | 
					  transition-duration: 0.3s;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel-ind li:hover {
 | 
					.layui-carousel-ind li:hover {
 | 
				
			||||||
    background-color: rgba(255, 255, 255, 0.7);
 | 
					  background-color: rgba(255, 255, 255, 0.7);
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel-ind li.layui-this {
 | 
					.layui-carousel-ind li.layui-this {
 | 
				
			||||||
    background-color: #fff;
 | 
					  background-color: #fff;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel > [carousel-item] > .layui-carousel-next,
 | 
					.layui-carousel > [carousel-item] > .layui-carousel-next,
 | 
				
			||||||
  .layui-carousel > [carousel-item] > .layui-carousel-prev,
 | 
					.layui-carousel > [carousel-item] > .layui-carousel-prev,
 | 
				
			||||||
  .layui-carousel > [carousel-item] > .layui-this {
 | 
					.layui-carousel > [carousel-item] > .layui-this {
 | 
				
			||||||
    display: block;
 | 
					  display: block;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel > [carousel-item] > .layui-this {
 | 
					.layui-carousel > [carousel-item] > .layui-this {
 | 
				
			||||||
    left: 0;
 | 
					  left: 0;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel > [carousel-item] > .layui-carousel-prev {
 | 
					.layui-carousel > [carousel-item] > .layui-carousel-prev {
 | 
				
			||||||
    left: -100%;
 | 
					  left: -100%;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel > [carousel-item] > .layui-carousel-next {
 | 
					.layui-carousel > [carousel-item] > .layui-carousel-next {
 | 
				
			||||||
    left: 100%;
 | 
					  left: 100%;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel > [carousel-item] > .layui-carousel-next.layui-carousel-left,
 | 
					.layui-carousel > [carousel-item] > .layui-carousel-next.layui-carousel-left,
 | 
				
			||||||
  .layui-carousel > [carousel-item] > .layui-carousel-prev.layui-carousel-right {
 | 
					.layui-carousel > [carousel-item] > .layui-carousel-prev.layui-carousel-right {
 | 
				
			||||||
    left: 0;
 | 
					  left: 0;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel > [carousel-item] > .layui-this.layui-carousel-left {
 | 
					.layui-carousel > [carousel-item] > .layui-this.layui-carousel-left {
 | 
				
			||||||
    left: -100%;
 | 
					  left: -100%;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel > [carousel-item] > .layui-this.layui-carousel-right {
 | 
					.layui-carousel > [carousel-item] > .layui-this.layui-carousel-right {
 | 
				
			||||||
    left: 100%;
 | 
					  left: 100%;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel[lay-anim="updown"] .layui-carousel-arrow {
 | 
					.layui-carousel[lay-anim="updown"] .layui-carousel-arrow {
 | 
				
			||||||
    left: 50% !important;
 | 
					  left: 50% !important;
 | 
				
			||||||
    top: 20px;
 | 
					  top: 20px;
 | 
				
			||||||
    margin: 0 0 0 -18px;
 | 
					  margin: 0 0 0 -18px;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel[lay-anim="updown"] > [carousel-item] > *,
 | 
					.layui-carousel[lay-anim="updown"] > [carousel-item] > *,
 | 
				
			||||||
  .layui-carousel[lay-anim="fade"] > [carousel-item] > * {
 | 
					.layui-carousel[lay-anim="fade"] > [carousel-item] > * {
 | 
				
			||||||
    left: 0 !important;
 | 
					  left: 0 !important;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel[lay-anim="updown"] .layui-carousel-arrow[lay-type="add"] {
 | 
					.layui-carousel[lay-anim="updown"] .layui-carousel-arrow[lay-type="add"] {
 | 
				
			||||||
    top: auto !important;
 | 
					  top: auto !important;
 | 
				
			||||||
    bottom: 20px;
 | 
					  bottom: 20px;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel[lay-anim="updown"] .layui-carousel-ind {
 | 
					.layui-carousel[lay-anim="updown"] .layui-carousel-ind {
 | 
				
			||||||
    position: absolute;
 | 
					  position: absolute;
 | 
				
			||||||
    top: 50%;
 | 
					  top: 50%;
 | 
				
			||||||
    right: 20px;
 | 
					  right: 20px;
 | 
				
			||||||
    width: auto;
 | 
					  width: auto;
 | 
				
			||||||
    height: auto;
 | 
					  height: auto;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel[lay-anim="updown"] .layui-carousel-ind ul {
 | 
					.layui-carousel[lay-anim="updown"] .layui-carousel-ind ul {
 | 
				
			||||||
    padding: 3px 5px;
 | 
					  padding: 3px 5px;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel[lay-anim="updown"] .layui-carousel-ind li {
 | 
					.layui-carousel[lay-anim="updown"] .layui-carousel-ind li {
 | 
				
			||||||
    display: block;
 | 
					  display: block;
 | 
				
			||||||
    margin: 6px 0;
 | 
					  margin: 6px 0;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel[lay-anim="updown"] > [carousel-item] > .layui-this {
 | 
					.layui-carousel[lay-anim="updown"] > [carousel-item] > .layui-this {
 | 
				
			||||||
    top: 0;
 | 
					  top: 0;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel[lay-anim="updown"] > [carousel-item] > .layui-carousel-prev {
 | 
					.layui-carousel[lay-anim="updown"] > [carousel-item] > .layui-carousel-prev {
 | 
				
			||||||
    top: -100%;
 | 
					  top: -100%;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel[lay-anim="updown"] > [carousel-item] > .layui-carousel-next {
 | 
					.layui-carousel[lay-anim="updown"] > [carousel-item] > .layui-carousel-next {
 | 
				
			||||||
    top: 100%;
 | 
					  top: 100%;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel[lay-anim="updown"]
 | 
					.layui-carousel[lay-anim="updown"]
 | 
				
			||||||
    > [carousel-item]
 | 
					  > [carousel-item]
 | 
				
			||||||
    > .layui-carousel-next.layui-carousel-left,
 | 
					  > .layui-carousel-next.layui-carousel-left,
 | 
				
			||||||
  .layui-carousel[lay-anim="updown"]
 | 
					.layui-carousel[lay-anim="updown"]
 | 
				
			||||||
    > [carousel-item]
 | 
					  > [carousel-item]
 | 
				
			||||||
    > .layui-carousel-prev.layui-carousel-right {
 | 
					  > .layui-carousel-prev.layui-carousel-right {
 | 
				
			||||||
    top: 0;
 | 
					  top: 0;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel[lay-anim="updown"]
 | 
					.layui-carousel[lay-anim="updown"]
 | 
				
			||||||
    > [carousel-item]
 | 
					  > [carousel-item]
 | 
				
			||||||
    > .layui-this.layui-carousel-left {
 | 
					  > .layui-this.layui-carousel-left {
 | 
				
			||||||
    top: -100%;
 | 
					  top: -100%;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel[lay-anim="updown"]
 | 
					.layui-carousel[lay-anim="updown"]
 | 
				
			||||||
    > [carousel-item]
 | 
					  > [carousel-item]
 | 
				
			||||||
    > .layui-this.layui-carousel-right {
 | 
					  > .layui-this.layui-carousel-right {
 | 
				
			||||||
    top: 100%;
 | 
					  top: 100%;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel[lay-anim="fade"] > [carousel-item] > .layui-carousel-next,
 | 
					.layui-carousel[lay-anim="fade"] > [carousel-item] > .layui-carousel-next,
 | 
				
			||||||
  .layui-carousel[lay-anim="fade"] > [carousel-item] > .layui-carousel-prev {
 | 
					.layui-carousel[lay-anim="fade"] > [carousel-item] > .layui-carousel-prev {
 | 
				
			||||||
    opacity: 0;
 | 
					  opacity: 0;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel[lay-anim="fade"]
 | 
					.layui-carousel[lay-anim="fade"]
 | 
				
			||||||
    > [carousel-item]
 | 
					  > [carousel-item]
 | 
				
			||||||
    > .layui-carousel-next.layui-carousel-left,
 | 
					  > .layui-carousel-next.layui-carousel-left,
 | 
				
			||||||
  .layui-carousel[lay-anim="fade"]
 | 
					.layui-carousel[lay-anim="fade"]
 | 
				
			||||||
    > [carousel-item]
 | 
					  > [carousel-item]
 | 
				
			||||||
    > .layui-carousel-prev.layui-carousel-right {
 | 
					  > .layui-carousel-prev.layui-carousel-right {
 | 
				
			||||||
    opacity: 1;
 | 
					  opacity: 1;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
  .layui-carousel[lay-anim="fade"]
 | 
					.layui-carousel[lay-anim="fade"]
 | 
				
			||||||
    > [carousel-item]
 | 
					  > [carousel-item]
 | 
				
			||||||
    > .layui-this.layui-carousel-left,
 | 
					  > .layui-this.layui-carousel-left,
 | 
				
			||||||
  .layui-carousel[lay-anim="fade"]
 | 
					.layui-carousel[lay-anim="fade"]
 | 
				
			||||||
    > [carousel-item]
 | 
					  > [carousel-item]
 | 
				
			||||||
    > .layui-this.layui-carousel-right {
 | 
					  > .layui-this.layui-carousel-right {
 | 
				
			||||||
    opacity: 0;
 | 
					  opacity: 0;
 | 
				
			||||||
  }
 | 
					}
 | 
				
			||||||
  
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -5,4 +5,4 @@ Component.install = (app: App) => {
 | 
				
			|||||||
  app.component(Component.name, Component);
 | 
					  app.component(Component.name, Component);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default Component;
 | 
					export default Component;
 | 
				
			||||||
@ -6,7 +6,8 @@ export default {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
<script setup lang="ts">
 | 
					<script setup lang="ts">
 | 
				
			||||||
import "./index.less";
 | 
					import "./index.less";
 | 
				
			||||||
import { withDefaults, provide, useSlots, ref, computed } from "vue";
 | 
					import { withDefaults, provide, useSlots, ref, computed, VNode, Ref, Component, watch, onMounted } from "vue";
 | 
				
			||||||
 | 
					import CarouselItem from "../carouselItem"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const slot = useSlots() as any;
 | 
					const slot = useSlots() as any;
 | 
				
			||||||
const slots = slot.default && (slot.default() as any[]);
 | 
					const slots = slot.default && (slot.default() as any[]);
 | 
				
			||||||
@ -17,14 +18,18 @@ const props = withDefaults(
 | 
				
			|||||||
    height?: string;
 | 
					    height?: string;
 | 
				
			||||||
    modelValue: string;
 | 
					    modelValue: string;
 | 
				
			||||||
    anim?: string;
 | 
					    anim?: string;
 | 
				
			||||||
 | 
					    autoplay?: boolean;
 | 
				
			||||||
    arrow?: string;
 | 
					    arrow?: string;
 | 
				
			||||||
 | 
					    interval?: number;
 | 
				
			||||||
    indicator?: string;
 | 
					    indicator?: string;
 | 
				
			||||||
  }>(),
 | 
					  }>(),
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    width: "100%",
 | 
					    width: "100%",
 | 
				
			||||||
    height: "280px",
 | 
					    height: "280px",
 | 
				
			||||||
    anim: "default",
 | 
					    anim: "default",
 | 
				
			||||||
 | 
					    autoplay: true,
 | 
				
			||||||
    arrow: "hover",
 | 
					    arrow: "hover",
 | 
				
			||||||
 | 
					    interval: 3000,
 | 
				
			||||||
    indicator: "inside",
 | 
					    indicator: "inside",
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
@ -45,27 +50,55 @@ const change = function (id: any) {
 | 
				
			|||||||
  active.value = id;
 | 
					  active.value = id;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
provide("active", active);
 | 
					const childrens: Ref<VNode[]> = ref([]);
 | 
				
			||||||
 | 
					const slotsChange = ref(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const setItemInstanceBySlot = function (nodeList: VNode[]) {
 | 
				
			||||||
 | 
					  nodeList?.map((item) => {
 | 
				
			||||||
 | 
					    let component = item.type as Component;
 | 
				
			||||||
 | 
					    if (component.name != CarouselItem.name) {
 | 
				
			||||||
 | 
					      setItemInstanceBySlot(item.children as VNode[]);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      childrens.value.push(item);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					watch(slotsChange, function () {
 | 
				
			||||||
 | 
					  childrens.value = [];
 | 
				
			||||||
 | 
					  setItemInstanceBySlot((slot.default && slot.default()) as VNode[]);
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					provide("active", active);
 | 
				
			||||||
 | 
					provide("slotsChange", slotsChange);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 上一页
 | 
				
			||||||
const prev = function () {
 | 
					const prev = function () {
 | 
				
			||||||
  for (var i = 0; i < slots.length; i++) {
 | 
					  for (var i = 0; i < childrens.value.length; i++) {
 | 
				
			||||||
    if (slots[i].props.id === active.value) {
 | 
					    // @ts-ignore
 | 
				
			||||||
 | 
					    if (childrens.value[i].props.id === active.value) {
 | 
				
			||||||
      if (i === 0) {
 | 
					      if (i === 0) {
 | 
				
			||||||
        active.value = slots[slots.length - 1].props.id;
 | 
					        // @ts-ignore
 | 
				
			||||||
 | 
					        active.value = childrens.value[slots.length - 1].props.id;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      active.value = slots[i - 1].props.id;
 | 
					      // @ts-ignore
 | 
				
			||||||
 | 
					      active.value = childrens.value[i - 1].props.id;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 下一页
 | 
				
			||||||
const next = function () {
 | 
					const next = function () {
 | 
				
			||||||
  for (var i = 0; i < slots.length; i++) {
 | 
					  for (var i = 0; i < childrens.value.length; i++) {
 | 
				
			||||||
    if (slots[i].props.id === active.value) {
 | 
					    // @ts-ignore
 | 
				
			||||||
      if (i === slots.length - 1) {
 | 
					    if (childrens.value[i].props.id === active.value) {
 | 
				
			||||||
        active.value = slots[0].props.id;
 | 
					      if (i === childrens.value.length - 1) {
 | 
				
			||||||
 | 
					        // @ts-ignore
 | 
				
			||||||
 | 
					        active.value = childrens.value[0].props.id;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      active.value = slots[i + 1].props.id;
 | 
					      // @ts-ignore
 | 
				
			||||||
 | 
					      active.value = childrens.value[i + 1].props.id;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@ -86,7 +119,7 @@ const next = function () {
 | 
				
			|||||||
    <div class="layui-carousel-ind">
 | 
					    <div class="layui-carousel-ind">
 | 
				
			||||||
      <ul>
 | 
					      <ul>
 | 
				
			||||||
        <li
 | 
					        <li
 | 
				
			||||||
          v-for="ss in slots"
 | 
					          v-for="ss in childrens"
 | 
				
			||||||
          :key="ss"
 | 
					          :key="ss"
 | 
				
			||||||
          :class="[ss.props.id === active ? 'layui-this' : '']"
 | 
					          :class="[ss.props.id === active ? 'layui-this' : '']"
 | 
				
			||||||
          @click.stop="change(ss.props.id)"
 | 
					          @click.stop="change(ss.props.id)"
 | 
				
			||||||
 | 
				
			|||||||
@ -5,13 +5,16 @@ export default {
 | 
				
			|||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script setup lang="ts">
 | 
					<script setup lang="ts">
 | 
				
			||||||
import { inject } from "vue";
 | 
					import { inject, Ref } from "vue";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const props = defineProps<{
 | 
					const props = defineProps<{
 | 
				
			||||||
  id: string;
 | 
					  id: string;
 | 
				
			||||||
}>();
 | 
					}>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const active = inject("active");
 | 
					const active = inject("active");
 | 
				
			||||||
 | 
					const slotsChange: Ref<boolean> = inject("slotsChange") as Ref<boolean>;
 | 
				
			||||||
 | 
					slotsChange.value = !slotsChange.value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
 | 
				
			|||||||
@ -29,6 +29,7 @@ export interface LayTabProps {
 | 
				
			|||||||
const slot = useSlots();
 | 
					const slot = useSlots();
 | 
				
			||||||
const slots = slot.default && slot.default();
 | 
					const slots = slot.default && slot.default();
 | 
				
			||||||
const childrens: Ref<VNode[]> = ref([]);
 | 
					const childrens: Ref<VNode[]> = ref([]);
 | 
				
			||||||
 | 
					const slotsChange = ref(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const setItemInstanceBySlot = function (nodeList: VNode[]) {
 | 
					const setItemInstanceBySlot = function (nodeList: VNode[]) {
 | 
				
			||||||
  nodeList?.map((item) => {
 | 
					  nodeList?.map((item) => {
 | 
				
			||||||
@ -53,7 +54,6 @@ const active = computed({
 | 
				
			|||||||
    emit("update:modelValue", val);
 | 
					    emit("update:modelValue", val);
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
const slotsChange = ref(true);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
const change = function (id: any) {
 | 
					const change = function (id: any) {
 | 
				
			||||||
  // 回调切换标签之前的回调钩子函数,只要不是return false, 则进行切换该tab
 | 
					  // 回调切换标签之前的回调钩子函数,只要不是return false, 则进行切换该tab
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user