Передача события onPress дочернему компоненту. React Native

#react-native

#react-native

Вопрос:

Я новичок в React Native и создаю свое первое приложение (калькулятор).

Я не знаю, как заставить дочерний компонент реагировать на действие onClick в родительских компонентах. В частности, у меня есть компоненты кнопок, которые при нажатии увеличивают их значение на единицу. Затем в главном компоненте приложения у меня есть кнопка сброса, при нажатии которой я хочу установить все значения равными нулю.

Вот мой код:

 import { StatusBar } from 'expo-status-bar';
import React, { Component, useState } from 'react';
import {
  StyleSheet,
  Text,
  TouchableOpacity,
  View,
  SafeAreaView,
  Image,
} from 'react-native';
 
export default function app() {
  return (
    <SafeAreaView SafeAreaView style={styles.container}>
      <View style={styles.result}>
        <Text style={styles.resultText}>Your probability of winning is: </Text>
      </View>
      <View style={styles.buttons}>
        <View style={styles.buttonColumn}>
          <CalcButton icon={require("./assets/peices/queen.png")} />
          <CalcButton icon={require("./assets/peices/rook.png")} />
          <CalcButton icon={require("./assets/peices/knight.png")} />
        </View>
        <View style={styles.buttonColumn}>
          <TouchableOpacity style={styles.resetButton} onPress={() => { /*set all CalcButton component counters to 0*/ }}>
            <Text style={styles.resetButtonText}>Reset</Text>
          </TouchableOpacity>
          <CalcButton icon={require("./assets/peices/bishop.png")} />
          <CalcButton icon={require("./assets/peices/pawn.png")} />
        </View>
      </View>
      <StatusBar style="auto" />
    </SafeAreaView >
  );
}
 
function CalcButton(props) {
  const [peiceCounter, counterIncrement] = useState(0);
 
  return (
    <TouchableOpacity style={styles.peiceButton} onPress={() => counterIncrement(peiceCounter   1)}>
      <Image
        source={props.icon}
        style={styles.peiceIcon}
      />
      <Text style={styles.counterText}>{peiceCounter}</Text>
    </TouchableOpacity >
  )
}
 

Ответ №1:

Создайте состояние для своей функции приложения

 const [resetCounter, setResetCounter] = useState(false);
 

Передайте resetCounter и setResetCounter всем элементам CalcButton, например

 <CalcButton resetCounter={resetCounter} setResetCounter={setResetCounter} icon={require("./assets/peices/queen.png")} />
 

Теперь нажмите кнопку сброса, чтобы сделать это

 onPress={() => setResetCounter(true)}
 

В функции CalcButton добавьте это перед возвратом

 useEffect(()=>{
  if(props.resetCounter){
     counterIncrement(0)
  }
},[props])
 

Также добавьте эту строку

 onPress={() => {
   props.setResetCounter(false) //new line added
   counterIncrement(peiceCounter   1)
}}
 

Ответ №2:

 import { StatusBar } from 'expo-status-bar';
import React, { Component, useState } from 'react';
import {
  StyleSheet,
  Text,
  TouchableOpacity,
  View,
  SafeAreaView,
  Image,
} from 'react-native';
 
export default function app() {
    
    
    const [initcalc, setInitCalc] = useState(false);
    const calcInit = () => {
        setInitCalc((prev)=>!prev)
    }

  return (
    <SafeAreaView SafeAreaView style={styles.container}>
      <View style={styles.result}>
        <Text style={styles.resultText}>Your probability of winning is: </Text>
      </View>
      <View style={styles.buttons}>
        <View style={styles.buttonColumn}>
          <CalcButton icon={require("./assets/peices/queen.png")} initcalc={initclac} />
          <CalcButton icon={require("./assets/peices/rook.png")}  initcalc={initclac} />
          <CalcButton icon={require("./assets/peices/knight.png")} initcalc={initclac}  />
        </View>
        <View style={styles.buttonColumn}>
          <TouchableOpacity style={styles.resetButton} onPress={() =>  calcInit() }>
            <Text style={styles.resetButtonText}>Reset</Text>
          </TouchableOpacity>
          <CalcButton icon={require("./assets/peices/bishop.png")} initcalc={initclac} />
          <CalcButton icon={require("./assets/peices/pawn.png")} initcalc={initclac} />
        </View>
      </View>
      <StatusBar style="auto" />
    </SafeAreaView >
  );
}
 
function CalcButton(props) {
  const [peiceCounter, counterIncrement] = useState(0);
  const init = ;
    
React.useEffect(()=>{
    counterIncrement(0);
},[prop.initcalc])
    
  return (
    <TouchableOpacity style={styles.peiceButton} onPress={() => counterIncrement(peiceCounter   1)}>
      <Image
        source={props.icon}
        style={styles.peiceIcon}
      />
      <Text style={styles.counterText}>{peiceCounter}</Text>
    </TouchableOpacity >
  )
}
 

Может быть способ создать функцию для поиска в верхнем компоненте и изменения на 0 в нижнем компоненте при изменении соответствующего значения.