UNPKG

weex-nuke

Version:

基于 Rax 、Weex 的高性能组件体系 ~~

316 lines (289 loc) 11.6 kB
/** @jsx createElement */ import { createElement, Component, render } from 'rax'; import View from 'nuke-view'; import Text from 'nuke-text'; import Image from 'nuke-image'; import Touchable from 'nuke-touchable'; import Button from 'nuke-button'; import QAPCaller from '@weex-module/qapcaller'; import Icon from 'nuke-icon'; import Tabbar from 'nuke-tabbar'; import ListView from 'nuke-list-view'; import Iconfont from 'nuke-iconfont'; const uuid = function () { let begin = Date.now(); return function (prefix) { return `${prefix || 'UUID'}-${(begin++).toString(16).toUpperCase()}`; }; }; const listData = []; for (var i = 0; i < 300; i++) { listData.push({ key: i, pic: '//img.alicdn.com/bao/uploaded/i1/TB1gdT4KVXXXXcpXFXXwu0bFXXX.png', text: `近三个月订单${i}` }); } const listData1 = []; for (var i = 0; i < 300; i++) { listData1.push({ key: i, pic: '//img.alicdn.com/bao/uploaded/i1/TB1gdT4KVXXXXcpXFXXwu0bFXXX.png', text: `已完成订单${i}` }); } const styles = { icon1: { fontFamily: 'iconfont1', fontSize: '36rem', color: 'blue', alignItems: 'center' }, tabContent: { flex: 1, alignItems: 'center' }, tabText: { color: 'white', margin: 50 }, container: { flex: 1 }, text: { color: 'white', margin: 50 }, customRender: { fontSize: '10rem', color: 'blue' }, view: { flex: 1 }, top: { height: 60, paddingLeft: 10, paddingRight: 10, marginBottom: 20, flexDirection: 'row' }, }; const app = { activeBorder: { borderBottomWidth: '4rem', borderBottomStyle: 'solid', borderBottomColor: '#454545' }, inactiveBorder: { borderBottomWidth: '4rem', borderBottomStyle: 'solid', borderBottomColor: '#eeeeee' }, listHeader: { height: '300rem', display: 'flex', alignItems: 'center', flexDirection: 'column', justifyContent: 'center' }, listHeaderText: { fontSize: '60rem', color: '#333333' }, listHeaderSub: { fontSize: '30rem', color: '#888888' }, listContainer: { flex: 1, backgroundColor: '#f8f8f8' }, footer: { paddingTop: '50rem', paddingBottom: '50rem', backgroundColor: '#efefef', textAlign: 'center' }, link: { fontSize: '32rem' }, titleLink: { backgroundColor: '#ff4200', display: 'block', padding: '10rem' }, img: { width: '100rem', height: '100rem', backgroundColor: '#ff4200' }, cellItemIndex: { backgroundColor: '#ffffff', height: '130rem', display: 'flex', paddingLeft: '20px', alignItems: 'center', flexDirection: 'row' }, cellItemList: { flex: 1, backgroundColor: '#ffffff', height: '110rem', borderBottom: '1px solid #e8e8e8', display: 'flex', alignItems: ' center', flexDirection: 'row' }, itemTextList: { flex: 13, fontSize: '30rem', color: '#333333' }, itemIcon: { width: '60rem', height: '60rem', flex: 2, justifyContent: 'center' }, cellTextView: { flex: 13, display: 'flex' }, itemMainTitle: { fontSize: '34rem', color: '#333333', marginBottom: '10px' }, itemSubTitle: { fontSize: '24rem', color: '#333333' }, itemArrow: { flex: 1, width: '18px', height: '18px' }, customTitle: { width: 200 }, }; class Gray extends Component { press() { this.changeTo('3'); } onFocus(status) { console.log('gray:', status); } render() { return ( <View style={[styles.tabContent, { backgroundColor: '#888888' }]}> <Text style={styles.text}>Blue Tab 大家好我是nv色的区域</Text> <Button onPress={this.press.bind(this)} type="normal">切换为m3</Button> </View> ); } } class Sub extends Component { press() { this.props.change('m3'); } render() { return ( <View style={[{ backgroundColor: '#eeeeee', height: '200rem' }]}> <Text>子容器</Text> <Button onPress={this.press.bind(this)} type="normal">切换为m3</Button> </View> ); } } class Green extends Component { constructor(props) { super(props); console.log('green constructor'); } } class App extends Component { constructor() { super(); this.state = { notifCount: 3, presses: 0, data: listData, data1: listData1, stop: false, activeKey: { key: '0' }, test: 1, }; this.index = 0; this.tracker = { startTime: 0, transferTime: 0, nativeStartTime: 0, nativeEndTime: 0, endTime: 0, uuid: '', }; Iconfont({ name: 'iconfont1', url: 'http://at.alicdn.com/t/font_1474198576_7440977.ttf' }); } getFocus(status) { // console.log('green:', status, this) // Modal.toast(status) } componentWillReceiveProps(nextProps) { // console.log(nextProps) } shouldComponentUpdate(nextProps, nextState) { if (this.hasInit) { // console.log('green: shouldComponentUpdate', this) return true; } return false; // console.log('QAPCaller constructor') } render() { return ( <View style={[styles.tabContent, { backgroundColor: '#ffffff' }]}> <Sub change={this.press.bind(this)} /> <Text style={styles.text}>Blue Tab 大家好我是nv色的区域</Text> <Button onPress={this.press.bind(this, 'm4')} type="normal">切换为m4</Button> </View> ); } endSuccess(args) { console.log('endSuccess'); console.log(args); this.tracker.nativeEndTime = args.ti; this.tracker.endTime = Date.now(); // 全链路时间 console.log('[tracker] allTime: ', this.tracker.endTime - this.tracker.startTime); console.log('[tracker] nativeTime: ', this.tracker.nativeEndTime - this.tracker.nativeStartTime); console.log('[tracker] transferTime: ', this.tracker.endTime - this.tracker.startTime - this.tracker.nativeEndTime + this.tracker.nativeStartTime); } componentWillUpdate(nextProps, nextState) { this.tracker.startTime = Date.now(); this.tracker.uuid = uuid(); console.log('QAPCaller componentDidUpdate'); // 向native发出打点请求,并携带uuid作为任务唯一标识 QAPCaller.call('NukeUI', 'performance', { action: 'start', taskId: this.tracker.uuid }, this.startSuccess, () => {}, () => {}); } componentDidUpdate(prevProps, prevState) { // this.tracker.transferTime = Date.now(); // this.tracker.uuid = uuid(); // console.log('QAPCaller componentDidUpdate') // // 向native发出打点请求,并携带uuid作为任务唯一标识 QAPCaller.call('NukeUI', 'performance', { action: 'end', taskId: this.tracker.uuid }, this.endSuccess, () => {}, () => {}); // QAPCaller.call('NukeUI', 'performance', {action: 'start', taskId: uuid()}, this.notifySuccess, this.notifyError, this.notify); } press() { this.setState({ test: 11111111 }); // 注册性能打点 // QAPCaller.call('NukeUI', 'performance', {action: 'start', taskId: uuid()}, this.notifySuccess, this.notifyError, this.notify); } changeTab(tab) { this.setState({ activeKey: tab }); } _renderContent(color, pageText, num) { return ( <View style={[styles.tabContent, { backgroundColor: color }]}> <Text style={styles.tabText}>{pageText}</Text> <Text style={styles.tabText}>{num} re-renders of the {pageText}</Text> </View> ); } handleLoadMore() { const self = this; // 这里进行异步操作 setTimeout(() => { self.index++; if (self.index == 5) { self.state.stop = true; // 加载5次后会停止加载,并去掉菊花 } self.state.data.push({ key: 'x', pic: '//img.alicdn.com/bao/uploaded/i1/TB1O9eAKVXXXXaPaXXXwu0bFXXX.png', text: 'xx订单' }, { key: 'loadmore 2', pic: '//img.alicdn.com/bao/uploaded/i1/TB1O9eAKVXXXXaPaXXXwu0bFXXX.png', text: 'xx订单' }, { key: 'loadmore 2', pic: '//img.alicdn.com/bao/uploaded/i1/TB1O9eAKVXXXXaPaXXXwu0bFXXX.png', text: 'xx订单' }, { key: 'loadmore 2', pic: '//img.alicdn.com/bao/uploaded/i1/TB1O9eAKVXXXXaPaXXXwu0bFXXX.png', text: 'xx订单' }, { key: 'loadmore 2', pic: '//img.alicdn.com/bao/uploaded/i1/TB1O9eAKVXXXXaPaXXXwu0bFXXX.png', text: 'xx订单' }); self.setState(self.state); }, 1000); } linkTo(item, e) { console.log(e); } renderItem(item, index) { return (<Touchable style={app.cellItemList} onPress={this.linkTo.bind(this, item)}> <Icon src={item.pic} style={app.itemIcon} /> <Text style={app.itemTextList}>{item.text}</Text> <Icon style={app.itemArrow} src="//img.alicdn.com/tfs/TB1EU2rMVXXXXcpXXXXXXXXXXXX-64-64.png" /> </Touchable>); } renderHeader() { return <View style={app.listHeader}><Text style={app.showTitleText}>list</Text></View>; } renderFooter() { return <View style={app.loading}><Text style={app.loadingText}>加载中...</Text></View>; } onChange(status) { console.log('status', status); } switchCustomTitle(status, key) { const textStyle = { textAlign: 'center', }; status ? Object.assign(textStyle, { color: '#3f08ee' }) : null; switch (key) { case '1': return <View style={app.customTitle}><Text style={textStyle}>自定义title1</Text></View>; case '2': return <View style={app.customTitle}><Text style={textStyle}>自定义title1</Text></View>; default: return <View style={app.customTitle}><Text style={textStyle}>key</Text></View>; } } other() { this.setState({ test: 999 }); } render() { return ( <View style={styles.container}> <Button onPress={this.press.bind(this)} type="normal">setState</Button> <View>{this.state.test}</View> <View>{this.state.test}</View> <View>{this.state.test}</View> <View style={styles.view}> <Tabbar slider={false} asContainer={false} navTop navScrollable iconBar={false} navStyle={{ active: app.activeBorder, inactive: app.inactiveBorder }} activeKey={this.state.activeKey} onChange={this.onChange.bind(this)} customChange="changeTo" customFocus="getFocus"> <Tabbar.Item render={this.switchCustomTitle.bind(this)} tabKey="1" > <Green /> </Tabbar.Item> <Tabbar.Item render={this.switchCustomTitle.bind(this)} tabKey="2" onPress={() => { console.log('something'); }} > <Gray changeTab={this.changeTab.bind(this)} /> </Tabbar.Item> <Tabbar.Item tabKey="3" render={this.switchCustomTitle.bind(this)} > {this._renderContent('#783E33', `Red Tab 大家好我是红色的区域${this.state.notifCount}`, this.state.notifCount)} </Tabbar.Item> <Tabbar.Item render={this.switchCustomTitle.bind(this)} tabKey="4" > <ListView renderHeader={this.renderHeader.bind(self)} renderFooter={this.renderFooter.bind(self)} renderRow={self.renderItem.bind(self)} dataSource={self.state.data} style={app.listContainer} onEndReached={self.handleLoadMore.bind(self)} /> </Tabbar.Item> <Tabbar.Item tabKey="5" render={this.switchCustomTitle.bind(this)} > <ListView renderHeader={this.renderHeader.bind(self)} renderFooter={this.renderFooter.bind(self)} renderRow={self.renderItem.bind(self)} dataSource={self.state.data1} style={app.listContainer} onEndReached={self.handleLoadMore.bind(self)} /> </Tabbar.Item> </Tabbar> </View> </View> ); } } render(<App />);