Swiper之onClick触发自定义的url

本文介绍如何使用Swiper轮播图组件触发点击事件,并通过设置自定义属性实现页面跳转。具体实现中,为每个轮播项添加了url-val属性,并在Swiper的onClick事件中读取此属性值来完成跳转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:

Swiper轮番图触发onClick事件,然后触发Slide自定义的url或者获取其属性

实现:

<div class="swiper-container">
    <ul class="swiper-wrapper">
        <li class="swiper-slide" url-val="${basePath}/cms/article/list">
            <img src="${basePath}static/common/images/home_img.jpg" alt="" />
        </li>
        <li class="swiper-slide" url-val="${basePath}">
            <img src="${basePath}static/common/images/home_img_index.jpg" alt="" />
        </li>
        <li class="swiper-slide" url-val="${basePath}/itemTm/list">
            <img src="${basePath}static/common/images/home_img_tmh.jpg" alt="" />
        </li>
        <li class="swiper-slide" url-val="${basePath}/cms/article/list">
            <img src="${basePath}static/common/images/home_img.jpg" alt="" />
        </li>
    </ul>
    <div class="swiper-pagination">
    </div>
</div>

对应的js操作:

<script type="text/javascript">
    (function($) {
        var swiper = new Swiper('#home_page .swiper-container', {
            autoplay: 3000,
            pagination: '#home_page .swiper-pagination',
            loop: true,
            onClick: function(swiper) {
                window.location.href = swiper.clickedSlide.attributes["url-val"].nodeValue;
            }
        });

    })(jQuery)
</script>

更多优质资源请访问http://www.someabcd.com

// Index.ets import { Book } from '../model/Book'; import { getBooks } from '../model/DataSource'; import router from '@ohos.router'; import { BookItem } from '../components/BookItem'; @Entry @Component struct Index { @State books: Book[] = getBooks(); @State isRefreshing: boolean = false; @State isLoggedIn: boolean = false; @State userName: string = ''; onPageShow() { this.isLoggedIn = true; this.userName = 'John Doe'; } refreshData() { this.isRefreshing = true; setTimeout(() => { this.books = getBooks(); this.isRefreshing = false; }, 1500); } navigateToDetail(book: Book) { router.pushUrl({ url: 'pages/Detail', params: { bookId: book.id } }); } navigateToLogin() { router.pushUrl({ url: 'pages/Login' }); } navigateToCart() { router.pushUrl({ url: 'pages/Cart' }); } navigateToSearch() { router.pushUrl({ url: 'pages/Search' }); } build() { Column() { // 顶部导航栏 Row({ space: 8 }) { if (this.isLoggedIn) { Text(`欢迎, ${this.userName}`) .fontSize(16) .fontColor(Color.White) .margin({ left: 12 }) } else { Button('登录', { type: ButtonType.Normal, stateEffect: true }) .width(80) .height(36) .fontSize(14) .onClick(() => this.navigateToLogin()) } Blank() // 搜索框 Row() { Image($r('app.media.search')) .width(20) .height(20) .margin({ left: 8 }) Text('搜索图书') .fontSize(16) .fontColor('#999') .margin({ left: 8 }) } .height(40) .borderRadius(20) .backgroundColor(Color.White) .padding({ left: 12, right: 12 }) .width('60%') .onClick(() => this.navigateToSearch()) // 购物车图标 Image($r('app.media.cart')) .width(28) .height(28) .margin({ right: 16 }) .onClick(() => this.navigateToCart()) } .width('100%') .height(56) .padding(8) .backgroundColor('#ff5722') .alignItems(VerticalAlign.Center) // 轮播图 Swiper() { ForEach([1, 2, 3], (index: number) => { Image($r(`app.media.banner${index}`)) .width('100%') .height(180) .borderRadius(8) .objectFit(ImageFit.Cover) }) } .autoPlay(true) .interval(3000) .indicator(true) .loop(true) .height(180) .padding(12) // 分类标签 Scroll() { Row({ space: 12 }) { ForEach(['推荐', '小说', '文学', '历史', '科技', '教育', '生活', '艺术'], (category: string) => { Text(category) .fontSize(16) .padding({ left: 16, right: 16, top: 8, bottom: 8 }) .borderRadius(20) .backgroundColor('#f5f5f5') }) } .padding({ left: 16, right: 16 }) } .scrollable(ScrollDirection.Horizontal) .height(50) // 热门图书标题 Row() { Text('热门图书') .fontSize(20) .fontWeight(FontWeight.Bold) .margin({ left: 16 }) Blank() Text('更多') .fontSize(14) .fontColor('#999') .margin({ right: 16 }) } .width('100%') .margin({ top: 16 }) // 图书列表 Refresh({ refreshing: this.isRefreshing }) { Grid() { ForEach(this.books, (book: Book, index: number) => { GridItem() { BookItem({ book: this.books[index], onItemClick: (book: Book): void => this.navigateToDetail(book) }) } }, (book: Book) => book.id.toString()) } .columnsTemplate('1fr 1fr') .columnsGap(8) .rowsGap(16) .padding(16) } .onRefreshing(() => { this.refreshData(); }) } .width('100%') .height('100%') .backgroundColor('#f5f5f5') } } // BookItem.ets (自定义组件) import { Book } from '../model/Book'; @Component export struct BookItem { @Link book: Book; // 使用@Link装饰器 @Prop onItemClick: (book: Book) => void; build() { Column({ space: 8 }) { // 图书封面 Image(this.book.cover) .width(120) .height(160) .borderRadius(8) .objectFit(ImageFit.Cover) // 图书信息 Column({ space: 4 }) { Text(this.book.title) .fontSize(16) .fontWeight(FontWeight.Bold) .maxLines(1) .textOverflow({ overflow: TextOverflow.Ellipsis }) Text(this.book.author) .fontSize(12) .fontColor(Color.Gray) Row() { Text('¥' + this.book.price.toFixed(2)) .fontSize(14) .fontColor('#ff5722') .fontWeight(FontWeight.Bold) Text(this.book.press) .fontSize(12) .fontColor(Color.Gray) .margin({ left: 8 }) .maxLines(1) .textOverflow({ overflow: TextOverflow.Ellipsis }) } .width('100%') .justifyContent(FlexAlign.SpaceBetween) } .padding(8) .width('100%') } .width(140) .padding(8) .onClick(() => { this.onItemClick(this.book); }) } } 在上述代码中出现这种问题怎么解决? Error message:is not callable Stacktrace: at SynchedPropertyTwoWayPU (/usr1/hmos_for_system/src/increment/sourcecode/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:5808:1) at SynchedPropertyObjectTwoWayPU (/usr1/hmos_for_system/src/increment/sourcecode/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:0:1) at BookItem (entry/src/main/ets/components/BookItem.ets:4:1) at anonymous (entry/src/main/ets/pages/Index.ets:150:57) at updateFunc (/usr1/hmos_for_system/src/increment/sourcecode/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:6813:1) at observeComponentCreation2 (/usr1/hmos_for_system/src/increment/sourcecode/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:6840:1) at observedDeepRender (entry/src/main/ets/pages/Index.ets:150:57) at forEachItemGenFunction (entry/src/main/ets/pages/Index.ets:151:21) at anonymous (/usr1/hmos_for_system/src/increment/sourcecode/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:4383:1) at forEachUpdateFunction (/usr1/hmos_for_system/src/increment/sourcecode/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:4380:1) at anonymous (entry/src/main/ets/pages/Index.ets:151:21) at updateFunc (/usr1/hmos_for_system/src/increment/sourcecode/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:6813:1) at observeComponentCreation2 (/usr1/hmos_for_system/src/increment/sourcecode/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:6840:1) at initialRender (entry/src/main/ets/pages/Index.ets:162:20) at initialRenderView (/usr1/hmos_for_system/src/increment/sourcecode/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:6492:1)
最新发布
06-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值