Использование троичности кажется мне правильным подходом. Разве вы не можете сделать что-то вроде:
name={state ? 'dot-circle-o' : 'circle-thin'}
Вы также можете реорганизовать свою функцию:
const myFunction = () => {
console.log('checking state', state);
setState(!state)
};
Если у вас несколько полей, есть много способов справиться с этим. Вы можете вызвать useState
несколько раз, например:
const [field1, setField1] = useState(false);
const [field2, setField2] = useState(false);
Вы также можете сохранить все поля в одном и том же состоянии:
const [state, setState] = useState({field1: false, field2: false});
...
const myFunction = (fieldName) => {
console.log('checking state', state);
setState({...state, [fieldName]: !state[fieldName]})
};
Я думаю, вы тогда использовали бы item
как «fieldName?» В этом случае:
return (
<View style={styles.container}>
<View style={styles.horizontalLine} />
{criteriaList.map((item: string, index: number) => (
<View key={index}>
<View style={styles.criteriaRow}>
<TouchableOpacity
onPress={() => {
myFunction(item);
}}>
<Icon
name={state[item] ? 'dot-circle-o' : 'circle-thin'}
color="#31C283"
size={moderateScale(20)}
/>
</TouchableOpacity>
<Text style={styles.text}>{item}</Text>
</View>
<View style={styles.horizontalLine} />
</View>
))}
</View>
);
И для создания начального состояния:
const initialState = {}
criteriaList.forEach(item => initialState[item] = false)
const [state, setState] = useState(initialState);