Skip to content

Commit 8e3588f

Browse files
committed
add cascade support
1 parent 4b629c6 commit 8e3588f

File tree

5 files changed

+139
-7
lines changed

5 files changed

+139
-7
lines changed

.gitignore

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,7 @@
1-
.npmignore
1+
npm-debug.log
2+
.gitignore
3+
.npmignore
4+
.settings
5+
.project
6+
.DS_Store
7+
.idea

README.md

Lines changed: 122 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,123 @@
11
# react-native-picker-android
2-
## 描述
3-
- ReactNative Picker for android
2+
3+
A Picker written in pure javascript for cross-platform support
4+
5+
Needs react-native >= 0.14.2
6+
7+
![ui](./doc/ui.gif)
8+
9+
###Documentation
10+
11+
- selectedValue any
12+
- onValueChange function
13+
14+
###Usage
15+
16+
####Step 1 - install
17+
18+
```
19+
npm install react-native-picker-android --save
20+
```
21+
22+
####Step 2 - import and use in project
23+
```
24+
'use strict';
25+
26+
import React, {
27+
View,
28+
Text,
29+
Platform,
30+
PickerIOS
31+
} from 'react-native';
32+
33+
import PickerAndroid from 'react-native-picker-android';
34+
35+
let Picker = Platform.OS === 'ios' ? PickerIOS : PickerAndroid;
36+
let PickerItem = Picker.Item;
37+
38+
let CAR_MAKES_AND_MODELS = {
39+
amc: {
40+
name: 'AMC',
41+
models: ['AMX', 'Concord', 'Eagle', 'Gremlin', 'Matador', 'Pacer'],
42+
},
43+
alfa: {
44+
name: 'Alfa-Romeo',
45+
models: ['159', '4C', 'Alfasud', 'Brera', 'GTV6', 'Giulia', 'MiTo', 'Spider'],
46+
},
47+
aston: {
48+
name: 'Aston Martin',
49+
models: ['DB5', 'DB9', 'DBS', 'Rapide', 'Vanquish', 'Vantage'],
50+
},
51+
audi: {
52+
name: 'Audi',
53+
models: ['90', '4000', '5000', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'Q5', 'Q7'],
54+
},
55+
austin: {
56+
name: 'Austin',
57+
models: ['America', 'Maestro', 'Maxi', 'Mini', 'Montego', 'Princess'],
58+
},
59+
borgward: {
60+
name: 'Borgward',
61+
models: ['Hansa', 'Isabella', 'P100'],
62+
},
63+
buick: {
64+
name: 'Buick',
65+
models: ['Electra', 'LaCrosse', 'LeSabre', 'Park Avenue', 'Regal', 'Roadmaster', 'Skylark'],
66+
},
67+
cadillac: {
68+
name: 'Cadillac',
69+
models: ['Catera', 'Cimarron', 'Eldorado', 'Fleetwood', 'Sedan de Ville'],
70+
},
71+
chevrolet: {
72+
name: 'Chevrolet',
73+
models: ['Astro', 'Aveo', 'Bel Air', 'Captiva', 'Cavalier', 'Chevelle', 'Corvair', 'Corvette', 'Cruze', 'Nova', 'SS', 'Vega', 'Volt'],
74+
},
75+
};
76+
77+
export default class SomeScene extends React.Component {
78+
79+
constructor(props, context){
80+
super(props, context);
81+
this.state = {
82+
carMake: 'cadillac',
83+
modelIndex: 3,
84+
}
85+
}
86+
87+
render() {
88+
let make = CAR_MAKES_AND_MODELS[this.state.carMake];
89+
let selectionString = make.name + ' ' + make.models[this.state.modelIndex];
90+
return (
91+
<View>
92+
<Text>Please choose a make for your car:</Text>
93+
<Picker
94+
selectedValue={this.state.carMake}
95+
onValueChange={(carMake) => this.setState({carMake, modelIndex: 0})}>
96+
{Object.keys(CAR_MAKES_AND_MODELS).map((carMake) => (
97+
<PickerItem
98+
key={carMake}
99+
value={carMake}
100+
label={CAR_MAKES_AND_MODELS[carMake].name}
101+
/>
102+
))}
103+
</Picker>
104+
<Text>Please choose a model of {make.name}:</Text>
105+
<Picker
106+
selectedValue={this.state.modelIndex}
107+
key={this.state.carMake}
108+
onValueChange={(modelIndex) => this.setState({modelIndex})}>
109+
{CAR_MAKES_AND_MODELS[this.state.carMake].models.map((modelName, modelIndex) => (
110+
<PickerItem
111+
key={this.state.carMake + '_' + modelIndex}
112+
value={modelIndex}
113+
label={modelName}
114+
/>
115+
))}
116+
</Picker>
117+
<Text>You selected: {selectionString}</Text>
118+
</View>
119+
);
120+
}
121+
};
122+
```
123+
![example](./doc/example.png)

doc/example.png

78.2 KB
Loading

doc/ui.gif

299 KB
Loading

index.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,29 +150,35 @@ var PickerAndroid = React.createClass({
150150
},
151151

152152
_renderItems(items) {
153+
//实际显示的内容不能是value,因为value是用来检测变更的(onValueChange)
154+
//某些场景的value有特殊用途,如级联菜单
155+
//最好单独定义,这里跟iOS一样使用了label
156+
//add by zooble @2015-12-10
153157
var upItems = [], middleItems = [], downItems = [];
154158
items.forEach((item, index) => {
155159
upItems[index] = ( <Text
156160
style={styles.upText}
157161
onPress={() => {
158162
this._moveTo(index);
159163
}} >
160-
{item.value}
164+
{item.label}
161165
</Text> );
162-
middleItems[index] = ( <Text style={styles.middleText}>{item.value}</Text> );
166+
middleItems[index] = ( <Text style={styles.middleText}>{item.label}</Text> );
163167
downItems[index] = ( <Text
164168
style={styles.downText}
165169
onPress={() => {
166170
this._moveTo(index);
167171
}} >
168-
{item.value}
172+
{item.label}
169173
</Text> );
170174
});
171175
return { upItems, middleItems, downItems, };
172176
},
173177

174178
_onValueChange() {
175-
this.props.onValueChange && this.props.onValueChange(this.index);
179+
//实际使用中onValueChange的事件回调函数,往往需要回传当前的value
180+
//add by zooble @2015-12-10
181+
this.props.onValueChange && this.props.onValueChange(this.state.items[this.index].value);
176182
},
177183

178184
render() {

0 commit comments

Comments
 (0)