我正在尝试在React Native中设置我的第一个Android应用。
现在有一张卡片(反应成分),里面有多个复选框(请参见下面的代码)。
每次我尝试仅选择一个复选框时,都会以某种方式选中所有复选框。
我知道它与多个状态有关,但我无法使其正常工作。
如何仅选择一个复选框?
JavaScript文件:
import React from "react";
import {StyleSheet, ActivityIndicator, ListView, Text, View, Alert, Platform, TouchableOpacity} from 'react-native';
import { Card, CheckBox, Button } from 'react-native-elements';
export default class AgendaItemVote extends React.Component {
constructor(props) {
super(props);
this.state = { checked: false };
}
render(){
return(
<View style={styles.container}>
<Card title="Titel Agendapunt">
<Text style={styles.paragraph}>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus at sapien at tellus interdum finibus. Nunc sagittis tincidunt orci, non viverra ligula feugiat id. Phasellus eleifend massa neque, eu scelerisque enim feugiat ac.
</Text>
<View style={{flexDirection: 'row'}}>
<CheckBox
title='Ja'
checked={this.state.checked}
onPress={() => this.setState({
checked: !this.state.checked
})}
/>
<CheckBox
title='Nee'
checked={this.state.checked}
onPress={() => this.setState({
checked: !this.state.checked
})}
/>
<CheckBox
title='Onthouding'
checked={this.state.checked}
onPress={() => this.setState({
checked: !this.state.checked
})}
/>
</View>
<View>
<Button
title="Indienen"
/>
</View>
</Card>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
paddingTop: 40,
backgroundColor: '#ecf0f1',
},
paragraph: {
margin: 24,
fontSize: 18,
fontWeight: 'bold',
textAlign: 'center',
color: '#34495e',
},
});
答案 0 :(得分:0)
问题出在这里
checked={this.state.checked}
当您将checked
设置为true
时,每个复选框都将被选中,因为您在每个复选框中都将这个值用于this.state.checked
。
从所有checked
中删除onPress
和checkboxes
,如果要获取选中的checkbox
的值,则可以使用ref
。 / p>
答案 1 :(得分:0)
每个控件必须具有特定的状态。有一个适合您的解决方案:
export default class AgendaItemVote extends React.Component {
constructor(props) {
super(props);
this.state = {
options: [
{
title: 'Ja',
checked: false
},
{
title: 'Nee',
checked: false
},
{
title: 'Onthouding',
checked: false
}
]
};
}
render() {
return (
<View style={styles.container}>
<Card title="Titel Agendapunt">
<Text style={styles.paragraph}>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Vivamus at sapien at tellus interdum finibus. Nunc
sagittis tincidunt orci, non viverra ligula feugiat id.
Phasellus eleifend massa neque, eu scelerisque enim
feugiat ac.
</Text>
<View style={{ flexDirection: 'row' }}>
{this.state.options.map(opt => (
<CheckBox
title={opt.title}
checked={opt.checked}
key={opt.title}
onClick={() => {
opt.checked = !opt.checked;
this.setState({
options: [
...this.state.options
]
})
}
</View>
<View>
<Button title="Indienen" />
</View>
</Card>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
paddingTop: 40,
backgroundColor: '#ecf0f1'
},
paragraph: {
margin: 24,
fontSize: 18,
fontWeight: 'bold',
textAlign: 'center',
color: '#34495e'
}
});
答案 2 :(得分:0)
我遇到了类似的问题,解决该问题后,我在这里写下答案。
考虑以下示例-(带有钩子)
const checkboxComponent = () => {
const [checkboxValue, setCheckboxValue] = React.useState([
{ label: 'Customer', value: 'customer', checked: false },
{ label: 'Merchant', value: 'merchant', checked: false },
{ label: 'None', value: 'none', checked: false },
])
const checkboxHandler = (value, index) => {
const newValue = checkboxValue.map((checkbox, i) => {
if (i !== index)
return {
...checkbox,
checked: false,
}
if (i === index) {
const item = {
...checkbox,
checked: !checkbox.checked,
}
return item
}
return checkbox
})
setCheckboxValue(newValue)
}
return (
<View>
{checkboxValue.map((checkbox, i) => (
<View style={styles.checkboxContainer} key={i}>
<CheckBox
value={checkbox.checked}
onValueChange={(value) => checkboxHandler(value, i)}
/>
<Text style={styles.label}>{checkbox.label}</Text>
</View>
))}
</View>
)
}
export default checkboxComponent