绑定选择器并放入自己的值
Bind picker and put its own value
你好,我是 React Native 的新手。我使用本机基础。我做了一个移动应用程序,我需要做一个预订页面。为此,我需要创建两个 Picker 并将当前日期和下一天放入其中。
第二个早上 7 点到晚上 19 点之间的一个小时。如果当前小时为 7 或更多,则选择器的第一个值需要是当前小时。
Two Picker with current date and next for the first and hour of the day for the second
我的选择器中的值是我的 table 索引,我不明白,因为它在 javascript 控制台中工作。见代码:
constructor (){
super();
this.state = {
date: '',
surface: '',
start: '',
};
}
valueChangeDate(value: String){
this.setState({
date: value
});
}
valueChangeStart(value: String){
this.setState({
start: value
});
}
渲染中:
var hours = [];
let today = new Date();
let hour = ('0'+today.getHours()).slice(-2);
for(hour<7 ? hour=7 : hour; hour<19; hour++){
hours.push(hour);
// console.log(hours[hour]);
console.log(hour);
}
在 return 中:
<Picker
note
iosHeader={"Select one"}
mode={"dropdown"}
style={{width: 175}}
selectedValue={this.state.date}
onValueChange={this.valueChangeDate.bind(this)}>
<Item label={"today"} value={"today"}/>
<Item label={"tomorrow"} value={"tomorrow"}/>
</Picker>
<Picker
note
inlineLabel={true}
mode={"dropdown"}
style={{width: 175}}
selectedValue={this.state.start}
onValueChange={this.valueChangeStart.bind(this)}>
{Object.keys(hours).map((key) => {
return (
<Item label={key} value={hours[key]}/>
)
})}
</Picker>
我还没有绑定两个picker,现在真不知道怎么办。 console.log 的结果是 18 点之前的正确当前时间,但不是选择器中显示的时间。
我不确定是否正确解释了我的问题,但我被困了很长时间,我仍然不知道解决方案。
我可能误解了你的问题,但这是我的答案。
您在选择器中将关键索引显示为标签:label={key}
,请尝试 label={hours[key]}
。
确保你给这个标签一个字符串值:hours.push(hour.toString())
我还建议您在安装组件时填充小时数数组,而不是在 render() 方法中(性能)
这是一个完整的工作代码:
import React, { Component } from 'react';
import { Text, View, StyleSheet, Picker } from 'react-native';
export default class App extends Component {
constructor (){
super();
this.state = {
date: '',
surface: '',
start: '',
hours: [],
};
this.valueChangeDate = this.valueChangeDate.bind(this);
this.valueChangeStart = this.valueChangeStart.bind(this);
}
componentWillMount() {
const hours = [];
const today = new Date();
let hour = ('0'+today.getHours()).slice(-2);
for(hour<7 ? hour=7 : hour; hour<19; hour++){
hours.push(hour.toString());
}
this.setState({
hours
});
}
valueChangeDate(value: String){
this.setState({
date: value
});
}
valueChangeStart(value: String){
this.setState({
start: value
});
}
render() {
return (
<View style={styles.container}>
<Picker
note
iosHeader={"Select one"}
mode={"dropdown"}
style={{width: 175}}
selectedValue={this.state.date}
onValueChange={this.valueChangeDate}>
<Picker.Item label={"today"} value={"today"}/>
<Picker.Item label={"tomorrow"} value={"tomorrow"}/>
</Picker>
<Picker
note
inlineLabel={true}
mode={"dropdown"}
style={{width: 175}}
selectedValue={this.state.start}
onValueChange={this.valueChangeStart}>
{this.state.hours.map((hourItem) => {
return (
<Picker.Item key={hourItem} label={hourItem} value={hourItem}/>
)
})}
</Picker>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
},
});
我将 Object.keys(hours).map((key)
更改为 this.state.hours.map((hourItem)
因为您只需要项目的值而不是它们的索引键。
我在 componentWillMount 中填充 hours
然后将其存储在状态中(您可以在每次渲染时都这样做,但似乎没有必要)
你好,我是 React Native 的新手。我使用本机基础。我做了一个移动应用程序,我需要做一个预订页面。为此,我需要创建两个 Picker 并将当前日期和下一天放入其中。
第二个早上 7 点到晚上 19 点之间的一个小时。如果当前小时为 7 或更多,则选择器的第一个值需要是当前小时。
Two Picker with current date and next for the first and hour of the day for the second
我的选择器中的值是我的 table 索引,我不明白,因为它在 javascript 控制台中工作。见代码:
constructor (){
super();
this.state = {
date: '',
surface: '',
start: '',
};
}
valueChangeDate(value: String){
this.setState({
date: value
});
}
valueChangeStart(value: String){
this.setState({
start: value
});
}
渲染中:
var hours = [];
let today = new Date();
let hour = ('0'+today.getHours()).slice(-2);
for(hour<7 ? hour=7 : hour; hour<19; hour++){
hours.push(hour);
// console.log(hours[hour]);
console.log(hour);
}
在 return 中:
<Picker
note
iosHeader={"Select one"}
mode={"dropdown"}
style={{width: 175}}
selectedValue={this.state.date}
onValueChange={this.valueChangeDate.bind(this)}>
<Item label={"today"} value={"today"}/>
<Item label={"tomorrow"} value={"tomorrow"}/>
</Picker>
<Picker
note
inlineLabel={true}
mode={"dropdown"}
style={{width: 175}}
selectedValue={this.state.start}
onValueChange={this.valueChangeStart.bind(this)}>
{Object.keys(hours).map((key) => {
return (
<Item label={key} value={hours[key]}/>
)
})}
</Picker>
我还没有绑定两个picker,现在真不知道怎么办。 console.log 的结果是 18 点之前的正确当前时间,但不是选择器中显示的时间。
我不确定是否正确解释了我的问题,但我被困了很长时间,我仍然不知道解决方案。
我可能误解了你的问题,但这是我的答案。
您在选择器中将关键索引显示为标签:label={key}
,请尝试 label={hours[key]}
。
确保你给这个标签一个字符串值:hours.push(hour.toString())
我还建议您在安装组件时填充小时数数组,而不是在 render() 方法中(性能)
这是一个完整的工作代码:
import React, { Component } from 'react';
import { Text, View, StyleSheet, Picker } from 'react-native';
export default class App extends Component {
constructor (){
super();
this.state = {
date: '',
surface: '',
start: '',
hours: [],
};
this.valueChangeDate = this.valueChangeDate.bind(this);
this.valueChangeStart = this.valueChangeStart.bind(this);
}
componentWillMount() {
const hours = [];
const today = new Date();
let hour = ('0'+today.getHours()).slice(-2);
for(hour<7 ? hour=7 : hour; hour<19; hour++){
hours.push(hour.toString());
}
this.setState({
hours
});
}
valueChangeDate(value: String){
this.setState({
date: value
});
}
valueChangeStart(value: String){
this.setState({
start: value
});
}
render() {
return (
<View style={styles.container}>
<Picker
note
iosHeader={"Select one"}
mode={"dropdown"}
style={{width: 175}}
selectedValue={this.state.date}
onValueChange={this.valueChangeDate}>
<Picker.Item label={"today"} value={"today"}/>
<Picker.Item label={"tomorrow"} value={"tomorrow"}/>
</Picker>
<Picker
note
inlineLabel={true}
mode={"dropdown"}
style={{width: 175}}
selectedValue={this.state.start}
onValueChange={this.valueChangeStart}>
{this.state.hours.map((hourItem) => {
return (
<Picker.Item key={hourItem} label={hourItem} value={hourItem}/>
)
})}
</Picker>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
},
});
我将 Object.keys(hours).map((key)
更改为 this.state.hours.map((hourItem)
因为您只需要项目的值而不是它们的索引键。
我在 componentWillMount 中填充 hours
然后将其存储在状态中(您可以在每次渲染时都这样做,但似乎没有必要)