Лучшим способом решения этой проблемы было бы удаление логики из функции рендеринга.Это поможет при отладке проблемы.
Массив строк / чисел может быть взят за пределы компонента, так как он не изменится, поэтому нет необходимости создавать его заново каждый раз, когда вызывается функция компонента render
.Затем вы можете использовать функцию map
в массиве для отображения каждой строки и числового элемента.Это предпочтительный подход при работе с реагировать.
Вы можете попробовать код ниже и посмотреть, работает ли он.Хотя в вашем фрагменте отсутствует некоторый код.
const ROWS = [[1, 2, 3], [4, 5, 6], [7, 8, 9,], ['.', 0, '=']]
export default class App extends Component {
buttonPressed(text) {
console.log(text)
}
render() {
return (
<View style={styles.container}>
<View style={styles.buttons}>
<View style={styles.numbers}>
{ROWS.map(numbers => (
<View style={styles.row}>
{numbers.map(number => (
<TouchableOpacity style={styles.btn} onPress={() => this.buttonPressed(number)}>
<Text style={styles.btnText}>{number}</Text>
</TouchableOpacity>
))}
</View>
))}
</View>
</View>
</View>
);
}
}
Еще лучший подход - использовать чистый компонент.Тогда, если вам нужно состояние, вы можете использовать реакционные хуки.
const ROWS = [[1, 2, 3], [4, 5, 6], [7, 8, 9,], ['.', 0, '=']]
const App = () => {
const buttonPressed = (text) => {
console.log(text)
}
return (
<View style={styles.container}>
<View style={styles.buttons}>
<View style={styles.numbers}>
{ROWS.map(numbers => (
<View style={styles.row}>
{numbers.map(number => (
<TouchableOpacity style={styles.btn} onPress={() => buttonPressed(number)}>
<Text style={styles.btnText}>{number}</Text>
</TouchableOpacity>
))}
</View>
))}
</View>
</View>
</View>
);
}
export default App