react-native 横向滚动的商品展示
在app中会有这种页面
像这样商品是横向的,而且要滚动,思路是利用 ScrollView 横向的滚动
思路:
(a): 横向滚动的整体作为一个组件 ShopCenter
{/*** 横向滚动 ***/}
<ShopCenter
popToHomeView = {(smid) => this.pushToShopCenterDetail(smid)}
/>
其中:(讨论梳理整体的链接跳转方法)
popToHomeView 这个函数是从组建中一级级传出来到父页面的,在父页面中让这个函数等价于 函数
pushToShopCenterDetail
// 横向滚动 跳转到购物中心详情页
pushToShopCenterDetail(smid){
const { navigate } = this.props.navigation;
navigate('Detail', {id: smid})
}
这些都是在父页面中写的。
(b):在组件页面中
es6写法代码
/* 组件 cell */
import React from 'react';
import {
StyleSheet,
Text,
View,
Image,
TouchableOpacity,
ScrollView
} from 'react-native'; // navigator
import { StackNavigator } from 'react-navigation'; // 获取设备宽高
var Dimensions = require('Dimensions');
var {width, height} = Dimensions.get('window'); // 引入外部的json数据
import Home_D5 from '../../../date/scrollCenter.json'; export default class ShopCenter extends React.Component { // props 传值,默认传的值 默认商品 id 为1.
static defaultProps = {
popToHomeView:
} render() {
return (
<View style={styles.container}>
<ScrollView
style={styles.scrollViewStyle}
horizontal={true} // 横向
showsHorizontalScrollIndicator={false} // 此属性为true的时候,显示一个水平方向的滚动条。
>
{this.renderAllItem()}
</ScrollView>
</View>
);
} // 返回下部分所有的Item
renderAllItem(){
// 定义组件数组
var itemArr = [];
// 取出数据
var shopData= Home_D5.data;
// 遍历
for (var i=; i<shopData.length; i++){
// 取出单个数据
var data = shopData[i];
// 创建组件装入数组
itemArr.push(
<ShopCenterItem
shopImage = {data.img}
shopSale = {data.showtext.text}
shopName = {data.name}
detailurl = {data.detailurl}
smid = {data.smid}
key={i}
// 将id再次封装传递下去
popTopShopCenter = {(smid)=>this.popTopHome(smid)}
/>
);
}
// 返回
return itemArr;
} popTopHome(smid){
// 判断
//if (this.props.smid == null) return; // 执行回调函数 将跳转地址传递下去
this.props.popToHomeView(smid);
} } // 每一个商场
export class ShopCenterItem extends React.Component{ static defaultProps = {
shopImage: '',
shopSale:'',
shopName: '',
detailurl: '',
smid: '',
popTopShopCenter: null
} render(){
return(
<TouchableOpacity
onPress={()=>this.clickItem(this.props.smid)}
>
<View style={styles.itemViewStyle}>
<Image source={{uri: this.props.shopImage}} style={styles.imageStyle}/>
<Text style={styles.shopSaleStyle}>{this.props.shopSale}</Text>
<Text style={styles.shopNameStyle}>{this.props.shopName}</Text>
</View>
</TouchableOpacity>
);
} clickItem(smid){
// 判断
if (this.props.smid == null) return; // 执行回调函数 再次接受传递的id
this.props.popTopShopCenter(smid);
} };
这种组件中又拆分,跳转的时候带过去参数方法思路:一直将要传递的参数进行传递,最后在父页面中进行控制跳转传递参数就行。
es5写法
import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View,
ScrollView,
Image,
TouchableOpacity
} from 'react-native'; // 引入外部的组件类
var CommonCell = require('./XMGBottomCommonCell'); // 引入外部的json数据
var Home_D5 = require('../../LocalData/XMG_Home_D5.json'); var ShopCenter = React.createClass({ // es5 默认数据处理
getDefaultProps(){
// 回调函数
return{
popToHomeView: null
}
}, render() {
return (
<View style={styles.container}>
{/*上部分*/}
<CommonCell
leftIcon="gw"
leftTitle="购物中心"
rightTitle={Home_D5.tips}
/>
{/*下部分*/}
<ScrollView
style={styles.scrollViewStyle}
horizontal={true} // 横向
showsHorizontalScrollIndicator={false}
>
{this.renderAllItem()}
</ScrollView>
</View>
);
}, // 返回下部分所有的Item
renderAllItem(){
// 定义组件数组
var itemArr = [];
// 取出数据
var shopData= Home_D5.data;
// 遍历
for (var i=; i<shopData.length; i++){
// 取出单个数据
var data = shopData[i];
// 创建组件装入数组
itemArr.push(
<ShopCenterItem
shopImage = {data.img}
shopSale = {data.showtext.text}
shopName = {data.name}
detailurl = {data.detailurl}
key={i}
popTopShopCenter = {(url)=>this.popTopHome(url)}
/>
);
}
// 返回
return itemArr;
}, popTopHome(url){
// 判断
if (this.props.popToHomeView == null) return; // 执行回调函数
this.props.popToHomeView(url);
}
}); // 每一个商场
var ShopCenterItem = React.createClass({
getDefaultProps(){
return{
shopImage: '',
shopSale:'',
shopName: '',
detailurl: '',
popTopShopCenter: null
}
}, render(){
return(
<TouchableOpacity onPress={()=>this.clickItem(this.props.detailurl)}>
<View style={styles.itemViewStyle}>
<Image source={{uri: this.props.shopImage}} style={styles.imageStyle}/>
<Text style={styles.shopSaleStyle}>{this.props.shopSale}</Text>
<Text style={styles.shopNameStyle}>{this.props.shopName}</Text>
</View>
</TouchableOpacity>
);
}, clickItem(url){
// 判断
if (this.props.detailurl == null) return; // 执行回调函数
this.props.popTopShopCenter(url);
} }); const styles = StyleSheet.create({
container: {
marginTop:
},
welcome: {
fontSize: ,
textAlign: 'center',
margin: ,
}, imageStyle:{
width:,
height:,
borderRadius:
}, scrollViewStyle:{
flexDirection:'row',
backgroundColor:'white',
padding:
}, itemViewStyle:{
margin:
}, shopSaleStyle:{
// 绝对定位
position:'absolute',
left:,
bottom:,
backgroundColor:'red',
color:'white',
padding:
}, shopNameStyle:{
textAlign:'center',
marginTop:
}
}); // 输出组件类
module.exports = ShopCenter;
使用的时候导入一个Json数据就可以直接使用
json
{
"count": ,
"data": [
{
"detailurl": "imeituan://www.meituan.com/web/?url=http://i.meituan.com/shoppingmall/smDetail/4374715",
"promotionIcon": "",
"name": "依诺♔大长腿",
"img": "https://vi3.6rooms.com/live/2017/02/11/23/1010v1486825491140350116_s.jpg",
"showtext": {
"text": "离我最近",
"count": ,
"color": ""
},
"longitude": 113.327086,
"latitude": 23.131909,
"smid": ,
"promotionText": "送福利 商品低至1.5折"
},
{
"detailurl": "imeituan://www.meituan.com/web/?url=http://i.meituan.com/shoppingmall/smDetail/50606658",
"promotionIcon": "",
"name": "依诺♔小蛮腰",
"img": "https://vi3.6rooms.com/live/2017/07/20/12/1010v1500526250183630933_s.jpg",
"showtext": {
"text": "熊孩纸♫允熙",
"count": ,
"color": ""
},
"longitude": 113.26605,
"latitude": 23.17151,
"smid": ,
"promotionText": "春来花开 满100最高减60"
},
{
"detailurl": "imeituan://www.meituan.com/web/?url=http://i.meituan.com/shoppingmall/smDetail/75813274",
"promotionIcon": "",
"name": "大蓒晚上见",
"img": "https://vi0.6rooms.com/live/2017/03/26/23/1010v1490542518707536335_s.jpg",
"showtext": {
"text": "漂亮dancer",
"count": ,
"color": ""
},
"longitude": 113.269668,
"latitude": 23.1818,
"smid": ,
"promotionText": "新春送福利 购物满额有好礼"
},
"longitude": 113.232008,
"latitude": 23.397758,
"smid": ,
"promotionText": "48家品牌优惠中:瑞可爷爷的店每满30减5,全单9折(买单立享)"
}
],
"tips": "全部5家",
"jumpto": "imeituan://www.meituan.com/web/?url=http://i.meituan.com/shoppingmall/smList?sid=@geodist:asc"
}
react-native 横向滚动的商品展示的更多相关文章
- [RN] React Native 自定义导航栏随滚动渐变
React Native 自定义导航栏随滚动渐变 实现效果预览: 代码实现: 1.定义导航栏 NavPage.js import React, {Component} from 'react'; im ...
- [RN] React Native 滚动跳转到指定位置
React Native 滚动跳转到指定位置 一.结构 <ScrollView horizontal={true} ref={(view) => { this.myScrollView = ...
- React Native学习(七)—— FlatList实现横向滑动列表效果
本文基于React Native 0.52 Demo上传到Git了,有需要可以看看,写了新内容会上传的.Git地址 https://github.com/gingerJY/React-Native-D ...
- React Native之ListView使用
前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所 ...
- React Native组件之ScrollView 和 StatusBar和TabBarIos
React Native中的组件ScrollView类似于iOS中的UIScrollView,其基本的使用方法和熟悉如下: /** * Sample React Native App * https: ...
- 腾讯优测优分享 | 探索react native首屏渲染最佳实践
腾讯优测是专业的移动云测试平台,旗下的优分享不定时提供大量移动研发及测试相关的干货~ 此文主要与以下内容相关,希望对大家有帮助. react native给了我们使用javascript开发原生app ...
- 探索react native首屏渲染最佳实践
文 / 腾讯 龚麒 0.前言 react native给了我们使用javascript开发原生app的能力,在使用react native完成兴趣部落安卓端发现tab改造后,我们开始对由react n ...
- Qzone React Native改造
Android Qzone 6.1版本在情侣空间涉水React Native,以动态插件方式将情侣空间进行React Natived的改造.在情侣空间基础上,Android Qzone 6.2版本以融 ...
- React Native常用组件之ScrollView
1. 两个要点 1.1 ScrollView必须有一个确定的高度才能正常工作 它实际上所做的就是将一系列不确定高度的子组件装进一个确定高度的容器(通过滚动操作) 通常有两种做法: 第一种: 直接给该S ...
随机推荐
- printf 打印字符串的任意一部分
使用printf()函数打印字符串的任意部分,请看下例: <span style="font-size:16px;">#include <stdio.h> ...
- J - Simpsons’ Hidden Talents
Homer: Marge, I just figured out a way to discover some of the talents we weren’t aware we had. Marg ...
- Linux: 统计代码行数和SVN修改行数的命令
Mac下同样有效. 1. 统计目录下所有js文件的代码行数. find . -name '*.js' | xargs wc -l 2. 统计SVN的修改行数. svn diff -rBeginRev: ...
- [Mini Program] 尺寸单位 rpx
So each phone's width is 750rpx. And according to the device ratio (width:height), we can calucalate ...
- 在Cocos2d-X中玩转精灵
创建一个Cocos2d-Xproject,project的文件夹例如以下图所看到的: 在Resourcees目录中加入一张png格式的图片 在HelloWorldScene.cpp文件里的bool H ...
- Python常用模块【sys】
sys.argv 参数 「argv」是「argument variable」参数变量的简写形式.一般在命令行调用的时候由系统传递给程序.这个变量其实是一个List列表,argv[0] 一般是“被 ...
- 为什么是kafka?
MQ在分布式场景下的应用已经非常广泛了.可是在全部的MQ使用场景中,大多都要求不能丢消息.意味着必须有持久化的能力,传统行业经常使用的activemq.rabbitmq尽管有持久化能力,无奈的是性能太 ...
- jquery选中表格的某行变色
<tr ng-click="+"selectRow("+i+");"+" ng-mouseover="+"chan ...
- Android系统升级那些事儿【转】
本文转载自:http://blog.csdn.net/chenyufei1013/article/details/12705719 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?) ...
- Detach a Database
https://msdn.microsoft.com/en-us/library/ms191491.aspx 方法一:Using SQL Server Management Studio To det ...