Stenciljs:当我更改范围时 Carousel 第三方库被破坏:'true' 用于阴影:'true'
Stenciljs: Carousel third-party library destroyed when I change scope: 'true' for shadow: 'true'
我有一个基于 Swiperjs 第三方库的轮播。问题是,当我使用 scope: true 时,我没有问题并且工作正常,但是,当我尝试使用 shadow: true 配置组件时,它被破坏并且没有任何效果。我使用的库如下:
...
import Swiper, { SwiperOptions } from 'swiper';
...
@Component({
tag: 'my-swiper-slider',
styleUrl: './styles.css',
assetsDirs: ['assets'],
shadow: true,
})
export class Carousel {
@Prop() options: SwiperOptions = {
slidesPerView: 3,
spaceBetween: 40,
autoplay: false,
loop: false,
autoHeight: true,
breakpoints: {
640: {
slidesPerView: 5,
spaceBetween: 20,
},
768: {
slidesPerView: 5,
spaceBetween: 40,
},
1024: {
slidesPerView: 5,
spaceBetween: 50,
},
}
}
private setSwiper() {
this.swiper = new Swiper('.swiper-container', this.options);
}
componentDidLoad() {
this.setSwiper();
}
render() {
return (
<Host class={{"container": true}}>
<PrevBtn
goBack={this.goBack.bind(this)} />
<div class="swiper-container">
<div class="swiper-wrapper">
<slot></slot>
</div>
</div>
<NextBtn
goForward={this.goForward.bind(this)} />
</Host>
);
}
}
出于某种原因,当我将组件配置为 "shadow: true" 时,它无法访问 stencil 或者是我的想法。
当您启用 shadow
时,组件的所有子元素都将移动到它的影子 DOM 中,因此作为实现细节被隐藏。这意味着您将无法再使用 .swiper-container
查询选择器找到您的容器。
但是,Swiper
构造函数也可以采用 HTML 元素而不是查询选择器,因此您可以在容器元素上使用 ref
:
@Component({ tag: 'my-swiper-slider', shadow: true })
export class Carousel {
@Prop() options: SwiperOptions;
@State() swiper?: Swiper;
@State() swiperContainerRef?: HTMLDivElement;
componentDidLoad() {
if (this.swiperContainerRef) {
this.swiper = new Swiper(this.swiperContainerRef, this.options);
}
}
render() {
return (
<Host>
<div ref={el => this.swiperContainerRef = el)} />
</Host>
);
}
}
容器引用在 componentDidLoad
生命周期挂钩中应该始终可用,但您也可以使用 requestAnimationFrame
等待它可用。
我有一个基于 Swiperjs 第三方库的轮播。问题是,当我使用 scope: true 时,我没有问题并且工作正常,但是,当我尝试使用 shadow: true 配置组件时,它被破坏并且没有任何效果。我使用的库如下:
...
import Swiper, { SwiperOptions } from 'swiper';
...
@Component({
tag: 'my-swiper-slider',
styleUrl: './styles.css',
assetsDirs: ['assets'],
shadow: true,
})
export class Carousel {
@Prop() options: SwiperOptions = {
slidesPerView: 3,
spaceBetween: 40,
autoplay: false,
loop: false,
autoHeight: true,
breakpoints: {
640: {
slidesPerView: 5,
spaceBetween: 20,
},
768: {
slidesPerView: 5,
spaceBetween: 40,
},
1024: {
slidesPerView: 5,
spaceBetween: 50,
},
}
}
private setSwiper() {
this.swiper = new Swiper('.swiper-container', this.options);
}
componentDidLoad() {
this.setSwiper();
}
render() {
return (
<Host class={{"container": true}}>
<PrevBtn
goBack={this.goBack.bind(this)} />
<div class="swiper-container">
<div class="swiper-wrapper">
<slot></slot>
</div>
</div>
<NextBtn
goForward={this.goForward.bind(this)} />
</Host>
);
}
}
出于某种原因,当我将组件配置为 "shadow: true" 时,它无法访问 stencil 或者是我的想法。
当您启用 shadow
时,组件的所有子元素都将移动到它的影子 DOM 中,因此作为实现细节被隐藏。这意味着您将无法再使用 .swiper-container
查询选择器找到您的容器。
但是,Swiper
构造函数也可以采用 HTML 元素而不是查询选择器,因此您可以在容器元素上使用 ref
:
@Component({ tag: 'my-swiper-slider', shadow: true })
export class Carousel {
@Prop() options: SwiperOptions;
@State() swiper?: Swiper;
@State() swiperContainerRef?: HTMLDivElement;
componentDidLoad() {
if (this.swiperContainerRef) {
this.swiper = new Swiper(this.swiperContainerRef, this.options);
}
}
render() {
return (
<Host>
<div ref={el => this.swiperContainerRef = el)} />
</Host>
);
}
}
容器引用在 componentDidLoad
生命周期挂钩中应该始终可用,但您也可以使用 requestAnimationFrame
等待它可用。