Как передать данные в родительский компонент react-native

Столкнулся с проблемой "пинга" при проброске данных наверх (далее скрины)

Мой компонент имеет такой путь вызова SetupNotificationsScreen.js->SetupNotificationsField.js->SetupPickDaysComponent.js

SetupNotificationsScreen.js:

class SetupNotificationsScreen extends React.Component {
  constructor(props) {
    super(props);
  }
  componentDidMount() {
    this.props.navigation.setOptions(this.navigationOptions);
  }
  state = {
    currentNotificationSettings: {
      days: [],
      time: "13:00",
      cityId: this.props.route.params.cityId,
    },
    valid: false,
  };
  validation = () => {
    const data = this.state.currentNotificationSettings;
    let valid = true;
    valid = data.days.length !== 0 && valid;
    valid = data.time !== "" && valid;
    valid = data.cityId !== null && valid;
    return valid;
  };
  onPressHandler = (data) => {
    const valid = this.validation();
    this.setState((oldState) => ({
      ...oldState,
      currentNotificationSettings: { ...data },
      valid,
    }));
    console.log("SetupNotificationsScreen state:");
    console.log(this.state);
  };
  onDonePressHandler() {}
  navigationOptions = {
    title: "Setup notifications",
    headerRight: () => (
      <TouchableOpacity
        activeOpacity={APP_THEME.ON_TOUCH_OPACITY_CHANGE}
        disabled={!this.state.valid}
        onPress={this.onDonePressHandler}
      >
        <Text
          style={
            this.state.valid
              ? styles.headerText
              : { ...styles.headerText, ...styles.disabled }
          }
        >
          Done
        </Text>
      </TouchableOpacity>
    ),
  };
  render() {
    const { cityId } = this.props.route.params;
    return (
      <View style={styles.container}>
        <View style={styles.wrapper}>
          <SetupNotificationsField
            cityId={cityId}
            onPress={this.onPressHandler}
          />
        </View>
      </View>
    );
  }
}

SetupNotificationsField.js

export const SetupNotificationsField = ({ cityId, onPress}) => {
  //TODO: change error with ping
  const initialState = {
    days: [],
    time: "13:00",
    cityId: cityId,
  };
  const [state, setState] = useState(initialState);

  const onChangeTimeHandler = (time) => {};


  const onChangeDaysHandler = (index) => {
    if (state.days.find((d) => d === index)) {
      setState((oldState) => ({
        ...oldState,
        days: state.days.filter((d) => d !== index),
      }));
    } else {
      setState((oldState) => ({
        ...oldState,
        days: [...state.days, index],
      }));
    }
    console.log("SetupNotificationsField state:");
    console.log(state);
    onPress(state);
  };

  return (
    <View style={styles.wrapContent}>
      <Text style={styles.Label}>ENTER TIME</Text>
      <View style={styles.blockWrapper}>
        <SetupEnterTimeComponent
          onPress={onChangeTimeHandler}
        />
      </View>
      <View style={styles.blockWrapper}>
        <Text style={styles.Label}>PICK DAY(S)</Text>
        <SetupPickDaysComponent
          onPress={onChangeDaysHandler}
        />
      </View>
      <View style={styles.blockWrapper}>
        <Text style={styles.Label}>CHOOSE CITY</Text>
        <SetupChooseCityComponent />
      </View>
    </View>
  );
};

SetupPickDaysComponent.js

export const SetupPickDaysComponent = ({ onPress }) => {
  let arrDays = {
    1: { value: "M", marked: false },
    2: { value: "T", marked: false },
    3: { value: "W", marked: false },
    4: { value: "TH", marked: false },
    5: { value: "F", marked: false },
    6: { value: "SA", marked: false },
    7: { value: "S", marked: false },
  };
  const [state, setState] = useState(arrDays);
  const renderDayButtons = (arr) => {
    console.log("SetupPickDaysComponent state:");
    console.log(state);
    return Object.keys(arr).map((key, index) => {
      const el = arr[key];
      let style = index < 5 ? styles.Button : styles.ButtonWeekends;
      return (
        <TouchableOpacity
          key={el.value}
          activeOpacity={APP_THEME.ON_TOUCH_OPACITY_CHANGE}
          onPress={() => {
            setState({ ...state, [key]: { ...el, marked: !el.marked } });
            onPress(key);
          }}
          style={
            el.marked
              ? { ...style, borderWidth: 2 }
              : { ...style, borderWidth: 0 }
          }
        >
          <Text style={styles.Text}>{el.value}</Text>
        </TouchableOpacity>
      );
    });
  };

  return (
    <View style={styles.Wrapper}>
      <View style={styles.WrapperButtons}>{renderDayButtons(state)}</View>
    </View>
  );
};

Скрины логов и работы программы:

 1 Обновление логи

1 Обновление UI

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

Как видно из логов проброска наверх происходит с пингом в 2 рендера. Как это исправить?


Ответы (0 шт):