您好,欢迎访问一九零五行业门户网

React-Native实现左右联动(附代码)

这次给大家带来react-native实现左右联动(附代码),react-native实现左右联动的注意事项有哪些,下面就是实战案例,一起来看一下。
react native的使用对于一些从事react native开发的人来说也是非常重要的,这次文章就给大家介绍下react native怎么实现list左右联动,相信这也是困扰很多人的问题,下面我们具体来看看示例代码。
一:左右联动list,在工作中很常见。
今天分享一个同事写的例子,本人只做了简单修改。
注意:本例子必须修改源码,参考本文第三条。
二:coding
parcelpage.js:
import react, { component } from 'react'; import {   appregistry,   stylesheet,   text,   view,   flatlist,   sectionlist,   dimensions,   touchableopacity,   image, } from 'react-native'; import parceldata from './parceldata.json' var { width, height } = dimensions.get('window'); let headers = []; export default class parcelpage extends component {   static navigationoptions = ({ navigation }) => ({     headertitle : '联动list',   });   componentdidmount() {     parceldata.map((item, i) => {       headers.push(item.section);     });   };   componentwillunmount() {     headers = [];   };   renderlrow = (item) => {     return (       <touchableopacity style={[ styles.litem, {backgroundcolor: item.index == this.state.cell ? 'white' : null} ]} onpress={()=>this.cellaction(item)}>         <text style={styles.ltext}>{ item.item.section }</text>       </touchableopacity>     )   };   cellaction = (item) => {     if (item.index <= parceldata.length) { this.setstate({ cell : item.index }); if (item.index > 0) {         var count = 0;         for (var i = 0;           i < item.index; i++) { count += parceldata[ i ].data.length + 1 } this.refs.sectionlist.scrolltoindex({ animated : false, index : count }) } else { this.refs.sectionlist.scrolltoindex({ animated : false, index : 0 }); } } }; itemchange = (info) => {     let section = info.viewableitems[ 0 ].section.section;     if (section) {       let index = headers.indexof(section);       if (index < 0) { index = 0; } this.setstate({ cell : index }); } }; state = { cell : 0 }; renderrrow = (item) => {     return (       <view style={ styles.ritem }>         <image style={ styles.icon } source={{ uri : item.item.img }}/>         <view style={ styles.ritemdetail }>           <text style={ styles.foodname }>{ item.item.name }</text>           <view style={ styles.salefavorite }>             <text style={ styles.salefavoritetext }>{ item.item.sale }</text>             <text style={ [styles.salefavoritetext,{ marginleft:15 }]}>{ item.item.favorite }</text>           </view>           <text style={ styles.moneytext }>¥{ item.item.money }</text>         </view>       </view>     )   };   sectioncomp = (section) => {     return (       <view style={{height:30,backgroundcolor:'#dedede',justifycontent:'center',alignitems:'center'}}>         <text >{section.section.section}</text>       </view>     )   };   separator = () => {     return (       <view style={{height:1,backgroundcolor:'gray'}}/>     )   };   render() {     return (       <view style={ styles.container }>         <flatlist ref='flatlist' style={ styles.leftlist } data={ parceldata } renderitem={(item) => this.renderlrow(item)}           itemseparatorcomponent={ () => this.separator() }           keyextractor={ (item) => item.section }         />         <sectionlist ref='sectionlist' style={ styles.rightlist } rendersectionheader={ (section) => this.sectioncomp(section) }           renderitem={ (item) => this.renderrrow(item) }           sections={ parceldata }           keyextractor={ (item) => item.name }           onviewableitemschanged={ (info) => this.itemchange(info) }         />       </view>     );   } } const styles = stylesheet.create({   container : {     flexdirection : 'row'   },   leftlist : {     width : 1 * width / 4,     backgroundcolor : '#e9e9ef'   },   litem : {     minheight : 44,     justifycontent : 'center',   },   ltext : {     marginleft : 10,     marginright : 10,     fontsize : 16,   },   rightlist : {     width : 3 * width / 4   },   ritem : {     flexdirection : 'row'   },   ritemdetail : {     flex : 1,     margintop : 10,     marginleft : 5   },   icon : {     height : 60,     width : 60,     margintop : 10,     marginbottom : 10,     marginleft : 8,     borderwidth : 1,     bordercolor : '#999999'   },   foodname : {     fontsize : 18,   },   salefavorite : {     flexdirection : 'row',     margintop : 5,     marginbottom : 5,   },   salefavoritetext : {     fontsize : 13,   },   moneytext : {     color : 'orange'   }, });
parceldata.js
[  {   section : 热销,   data : [    {     name : 蟹黄汤包,     sale : 月售875,     favorite : 赞31,     money : 20,     img:http://p1.meituan.net/deal/392303113449301.jpg    },    {     name : 小馄饨,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p1.meituan.net/deal/849d8b59a2d9cc5864d65784dfd6fdc6105232.jpg    },    {     name : 蟹黄汤包+牛杂粉丝汤套餐,     sale : 月售875,     favorite : 赞31,     money : 35,     img:http://p0.meituan.net/deal/ed3025663342b126eaae24764704b017136487.jpg    },    {     name : 鸭血粉丝汤,     sale : 月售875,     favorite : 赞31,     money : 15,     img:http://p0.meituan.net/deal/ed3025663342b126eaae24764704b017136487.jpg    }   ]  },  {   section : 介绍我们,   data : [    {     name : 慎用差评!任何问题联系我们就可解决哦,     sale : 月售1,     favorite : 赞0,     money : 0,     img:http://p1.meituan.net/deal/392303113449301.jpg    }   ]  },  {   section : 折扣套餐,   data : [    {     name : 特色蟹黄汤包+鸭血粉丝汤+果汁套餐,     sale : 月售875,     favorite : 赞31,     money : 50,     img:http://p1.meituan.net/deal/392303113449301.jpg    },    {     name : 蟹黄汤包+牛杂粉丝汤套餐,     sale : 月售875,     favorite : 赞31,     money : 35,     img:http://p1.meituan.net/deal/849d8b59a2d9cc5864d65784dfd6fdc6105232.jpg    },    {     name : 蟹黄汤包+南瓜粥+果汁套餐,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p0.meituan.net/deal/ed3025663342b126eaae24764704b017136487.jpg    },    {     name : 金牌蟹黄汤包+紫米粥+柠檬果汁套餐,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p0.meituan.net/deal/ed3025663342b126eaae24764704b017136487.jpg    },    {     name : 台式卤肉饭+南瓜粥套餐,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p0.meituan.net/deal/ed3025663342b126eaae24764704b017136487.jpg    }   ]  },  {   section : 纯手工汤宝,   data : [    {     name : 金牌蟹黄汤包,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p1.meituan.net/deal/392303113449301.jpg    },    {     name : 蟹庭丰特色蟹黄汤包,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p1.meituan.net/deal/849d8b59a2d9cc5864d65784dfd6fdc6105232.jpg    },    {     name : 蟹黄汤包,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p0.meituan.net/deal/ed3025663342b126eaae24764704b017136487.jpg    },    {     name : 干贝汤包,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p0.meituan.net/deal/ed3025663342b126eaae24764704b017136487.jpg    },    {     name : 鲍鱼汤包,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p0.meituan.net/deal/ed3025663342b126eaae24764704b017136487.jpg    },    {     name : 全家福汤包,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p0.meituan.net/deal/ed3025663342b126eaae24764704b017136487.jpg    },    {     name : 虾仁汤包,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p0.meituan.net/deal/ed3025663342b126eaae24764704b017136487.jpg    }   ]  },  {   section : 汤、粥类,   data : [    {     name : 紫米粥,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p1.meituan.net/deal/392303113449301.jpg    },    {     name : 金丝南瓜粥,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p1.meituan.net/deal/849d8b59a2d9cc5864d65784dfd6fdc6105232.jpg    },    {     name : 小米粥,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p0.meituan.net/deal/ed3025663342b126eaae24764704b017136487.jpg    },    {     name : 白粥,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p0.meituan.net/deal/ed3025663342b126eaae24764704b017136487.jpg    }   ]  },  {   section : 面食类,   data : [    {     name : 鸡汤面,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p1.meituan.net/deal/392303113449301.jpg    },    {     name : 红烧小排面,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p1.meituan.net/deal/849d8b59a2d9cc5864d65784dfd6fdc6105232.jpg    },    {     name : 红烧牛肉面,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p0.meituan.net/deal/ed3025663342b126eaae24764704b017136487.jpg    }   ]  },  {   section : 调味小菜,   data : [    {     name : 肉松,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p1.meituan.net/deal/392303113449301.jpg    },    {     name : 辣椒包,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p1.meituan.net/deal/849d8b59a2d9cc5864d65784dfd6fdc6105232.jpg    },    {     name : 泡菜,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p0.meituan.net/deal/ed3025663342b126eaae24764704b017136487.jpg    },    {     name : 酱黄瓜,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p0.meituan.net/deal/ed3025663342b126eaae24764704b017136487.jpg    },    {     name : 萝卜干,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p0.meituan.net/deal/ed3025663342b126eaae24764704b017136487.jpg    }   ]  },  {   section : 饮料,   data : [    {     name : 可乐,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p1.meituan.net/deal/392303113449301.jpg    },    {     name : 雪碧,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p1.meituan.net/deal/849d8b59a2d9cc5864d65784dfd6fdc6105232.jpg    },    {     name : 王老吉,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p0.meituan.net/deal/ed3025663342b126eaae24764704b017136487.jpg    },    {     name : 橙汁,     sale : 月售875,     favorite : 赞31,     money : 10,     img:http://p0.meituan.net/deal/ed3025663342b126eaae24764704b017136487.jpg    }   ]  } ]
三:修改源码
1-:sectionlist
node_modules/react-native/libraries/lists/sectionlist.js,代码格式化后大概在187行的位置,修改如下  class sectionlist<sectiont: sectionbase&llt;any>>   extends react.purecomponent<defaultprops, props<sectiont>, void> {   props: props<sectiont>;   static defaultprops: defaultprops = defaultprops;   render() {     const list = this.props.legacyimplementation ? metrolistview : virtualizedsectionlist;     return <list ref={this._captureref} {...this.props} />;   }   _captureref = (ref) => {     this._listref = ref;   };   scrolltoindex = (params: { animated?: ?boolean, index: number, viewposition?: number }) => {     this._listref.scrolltoindex(params);   } }
2-:virtualizedsectionlist
路径在node_modules/react-native/libraries/lists/virtualizedsectionlist.js,大概253行处修改如下:
render() {     return <virtualizedlist ref={this._captureref} {...this.state.childprops} />;   }   _captureref = (ref) => {     this._listref = ref;   };   scrolltoindex = (params: { animated?: ?boolean, index: number, viewposition?: number }) => {     this._listref.scrolltoindex(params);   }
相信看了本文案例你已经掌握了方法,更多精彩请关注其它相关文章!
推荐阅读:
shiro授权实现详解
vue proxytable怎么实现接口跨域请求调试
以上就是react-native实现左右联动(附代码)的详细内容。
其它类似信息

推荐信息