ReactNative 轮播图组件Banner的创建

本文介绍如何在ReactNative中创建一个轮播图组件Banner,使用ES5语法编写,依赖react-timer-mixin库实现定时切换。示例中展示了从本地json文件获取图片数据,如果使用网络图片则需要进行API请求。组件可直接导入并使用。

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

==================================================================

//这里是单独的一个js文件,到时直接导入就可以用  这里用的ES5的格式

//这里用的定时器导入计时器类库 react-timer-mixin 不过创建项目的时候就已经有了,可以在你项目的node_modules这个文件夹里面找一下有没有react-timer-mixin,如果没有就要自己导入  导入方法导入计时器方法

==================================================================

我这里用的轮播图图片时本地图片var datas= require('../data/banner.json')

如果你用的网络图片就要网络请求然后获得json对象

可以创建一个banner,js文件然后把代码考进去

然后用的时候直接导入这里用的ES5的格式写的所以导入方式./component/banner为你banner,js文件的路径

var BannerDemo= require('./component/banner')
然后直接使用
 

轮播图效果


===================================================================



import React, {Component} from 'react';
import {
    AppRegistry,
    StyleSheet,
    Text,
    View,
    ScrollView,
    Image
} from 'react-native';

var datas= require('../data/banner.json')
var Dimensions=require('Dimensions')
var windowwidth=Dimensions.get('window').width
var TimerMixin=require('react-timer-mixin')


var banner = React.createClass({

    getInitialState(){
        return{
            var:currcount=0,
            var:title=datas[currcount].title,
        }
    },

    
    render(){
        return (
            <View style={styles.container}>
                <ScrollView
                    ref="scrollView"
                    horizontal={true}
                    showsHorizontalScrollIndicator={false}
                    pagingEnabled={true}
                    onMomentumScrollEnd={ (e)=>this.onPageEnd(e)  }>
                    {this.creatitems()}
                </ScrollView>
                <View style={styles.viewstyle}>
                    {this.creatdot()}
                    <Text style={[{textAlign:'right',flex:1,marginRight:10,color:'red'}]}>{title}</Text>
                </View>
            </View>

        )
    },

    //定时器
    mixins:[TimerMixin],
    //生命周期  耗时操作  开启一个定时器
    componentDidMount(){
        //拿到对象
        var scrollView=this.refs.scrollView;

            this.setInterval(
               function () {
                   //alert("0000")
                   currcount+=1
                   if(currcount>=datas.length){
                       currcount=0
                   }
                   //计算位移的距离
                   var l=currcount*windowwidth
                   //设置滑动距离
                   scrollView.scrollResponderScrollTo({x:l,y:0, animated:true})
                   this.setState({
                       currcount:currcount,
                       title:datas[currcount].title,
                   })
               },2000)
    },
    //contentOffSet 滑动的x轴的距离
    //page当前的页数
    onPageEnd(e){
        var contentOffSet = e.nativeEvent.contentOffset.x
        var page = contentOffSet / windowwidth

        this.setState({
            var: currcount = page,
            var: title = datas[currcount].title,
            var: dotbg='red'
        })

    },


    creatitems(){
        var items=[]
        for(var i=0;i<datas.length;i++){
            var itemdata=datas[i];
            items.push(
                <Image key={i} style={styles.imagestyle} source={{uri:itemdata.icon}}></Image>
            )
        }
        return items

    },

    creatdot(){
        var dots=[]
        for(var i=0;i<datas.length;i++){
            var dotbg=currcount==i ? 'white' : 'red'
            dots.push(
                <Text key={i} style={[styles.textstyle,{backgroundColor:dotbg}]}></Text>
        )
        }
        return dots
    }
})


const styles = StyleSheet.create({
    container: {
        width:windowwidth,
        height:120,
    },
    imagestyle:{
        width:windowwidth,
        height:120
    },

    viewstyle:{
        width:windowwidth,
        height:25,
        backgroundColor:'rgba(255,255,255,0.5)',
        flexDirection:'row',
        alignItems:'center',
        position:'absolute',
        bottom:0,
        left:0
    },

    textstyle:{
        width:5,
        height:5,
        borderRadius:5,
        marginLeft:8
    }


});


module.exports = banner





### Vue.js 中实现轮播图Banner)效果的组件 为了创建一个功能齐全且易于使用的轮播图组件,在 `Vue` 应用程序中可以遵循如下方法: #### 创建轮播图组件结构 新建公共组件位于路径 `src/components/carousel/index.vue`,此文件定义了一个名为 `Carousel` 的自定义组件[^1]。 ```html <template> <div class="carousel"> <!-- 轮播容器 --> <transition-group tag="ul" name="fade" class="slides"> <li v-for="(slide, index) in slides" :key="index" v-show="index === currentIndex"> <img :src="slide.imageSrc" alt="Slide Image"/> </li> </transition-group> <!-- 控制按钮 --> <button @click="prev">Previous</button> <button @click="next">Next</button> <!-- 指示器 --> <div class="dots"> <span v-for="(dot, idx) in slides.length" :class="{ active: idx === currentIndex }" @click="goto(idx)" /> </div> </div> </template> <script setup> import { ref, onMounted } from 'vue'; const props = defineProps({ images: { type: Array, required: true } }); let currentIndex = ref(0); let intervalId; // 定义数据属性 const slides = props.images.map((imagePath, i) => ({ imageSrc: imagePath, })); function next() { currentIndex.value = (currentIndex.value + 1) % slides.length; } function prev() { currentIndex.value = (currentIndex.value - 1 + slides.length) % slides.length; } function goto(index) { currentIndex.value = index; } onMounted(() => { // 自动播放设置 intervalId = setInterval(next, 3000); // 每三秒切换到下一张幻灯片 }) defineExpose({ stopAutoPlay }); function stopAutoPlay(){ clearInterval(intervalId); } </script> <style scoped> .carousel .slides li { list-style-type: none; } .fade-enter-active, .fade-leave-active { transition: opacity 0.5s ease-in-out; } .fade-enter-from, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ { opacity: 0; } .dots span{ display:inline-block; width:1rem; height:1rem; background-color:#ccc; border-radius:50%; margin-right:.5rem; cursor:pointer; } .dots span.active{ background-color:red; } </style> ``` 上述代码展示了如何构建一个基础版本的轮播图组件。该组件接受一组图片 URL 并将其作为道具传递给子组件来展示一系列可交互式的幻灯片。 #### 注册并使用轮播图组件 对于多个组件的情况,推荐采用批量注册的方式简化流程。可以在项目根目录下的 `component/index.js` 文件内集中管理所有公用组件的导入与导出逻辑[^2]。 ```javascript export default (app) => { app.component('Carousel', CarouselComponent); }; ``` 之后只需在应用入口处调用一次即可完成全局可用性的配置。 #### 结合分类菜单和轮播图的设计模式 如果希望进一步增强用户体验,则可以考虑将左侧固定宽度的分类导航栏同右侧动态变化的内容区相结合形成更复杂的页面布局形式。这种设计不仅美观大方而且实用性强,特别适合电商类网站的商品展示需求[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值