Изменение цвета при нажатии — реагирует-родной

#javascript #react-native #checkbox #react-native-calendars #agenda

Вопрос:

Я создаю приложение для напоминания о лекарствах для университетского проекта и использую тег Повестки дня из библиотеки календарей react-native. Вот как выглядит мое приложение прямо сейчас: 1

Я хотел бы добавить функцию, которая изменяет цвет каждого элемента в календаре при нажатии на него — по сути, чтобы подчеркнуть, что пользователь принял лекарство. (почти как список дел).

Я пытался реализовать эту функцию раньше, но она выделяла бы все элементы, а не по одному.

Ниже приведен текущий код без этой функции:

 export default class App extends React.Component {
state = {
    toggled: false,
    items: {},
}



toggleSwitch = (value) => {
    this.setState({toggled: value})
}

render() {
    return (
        <View style={styles.background}>
            <View style={styles.medicationHeaderContainer}>
                <Text style={styles.medicationHeader}> Medication </Text>
            </View>
            <View style={styles.reminderAlertContainer}>
                <Text style={styles.reminderAlertText}> Reminders </Text>
                <Switch
                    onValueChange={this.toggleSwitch}
                    value={this.state.toggled}
                    style={styles.reminderAlertSwitch}/>
            </View>
            <Agenda
                items={{'2012-05-22': [{name: '9 AM - One 200 mg Paracetamol '}],
                    '2012-05-23': [{name: '9 AM - One 200 mg Paracetamol'}, {name: '10 AM - One 500 mg Magnesium Tablet'}],
                    '2012-05-24': [{name: '9 AM - One 200 mg Paracetamol'}],
                    '2012-05-25': [{name: '9 AM - One 200 mg Paracetamol'}, {name: '10 AM - One 500 mg Magnesium Tablet'}]
                }}

                selected={'2012-05-22'}

                renderItem={this.renderItem.bind(this)}
                >
            </Agenda>
        </View>
    );

}


renderItem(item) {
    return (
        <View style={styles.item} onPress={() => Alert.alert(item.name)}>
            <View>
                <Text>{item.name}</Text>
            </View>
            <TouchableOpacity
                onPress={() => Alert.alert(item.name)}
            />
        </View>
    );
}}
 

И таблица стилей:

 const styles = StyleSheet.create({
background: {
    flex: 1,
    backgroundColor: "#fff"
},
medicationHeaderContainer: {
    marginTop: 40,
    height: "10%",
    backgroundColor: "#fff"
},
medicationHeader: {
    fontSize: 40,
    bottom: -30,
    fontWeight: "bold",
    marginLeft: 15
},

reminderAlertContainer: {
    marginTop: 5,
    height: '7%',
    width: '95%',
    backgroundColor: "#85C1E9",
    borderBottomStartRadius: 10,
    borderBottomEndRadius: 10,
    borderTopStartRadius: 10,
    borderTopEndRadius: 10,
    marginLeft: 10
},
reminderAlertText: {
    fontSize: 30,
    bottom: -10,
    marginLeft: 15,
    color: '#fff',
    fontWeight: "bold",
},
reminderAlertSwitch: {
    bottom: 20,
    marginLeft: 320
},

item: {
    backgroundColor: 'white',
    flex: 1,
    borderRadius: 5,
    padding: 10,
    marginRight: 10,
    marginTop: 17
},
emptyDate: {
    height: 15,
    flex: 1,
    paddingTop: 30
},});
 

Ответ №1:

Я бы рекомендовал создать компонент под названием AgendaItem . Тогда AgendaItem у него может быть свое собственное toggled состояние, которое вы устанавливаете по щелчку мыши.

 class AgendaItem extends React.Component {
  state = {
    toggled: false
  }

  toggleSwitch() {
    this.setState({ toggled: !this.state.toggled });
  }

  render() {
    return (
      <View style={styles.item}>
          <View>
              <Text>{this.props.name}</Text>
          </View>
          <TouchableOpacity onPress={this.toggleSwitch} />
      </View>
    );
  }
}
 

Примечание: Вам нужно будет обновить стиль фона в зависимости от toggled состояния (я не показывал этого в приведенном выше коде).

Затем вы обновите renderItem функцию для визуализации AgendaItem компонента, передав данные элемента в качестве реквизитов. Например:

 renderItem(item) {
    return (
        <AgendaItem {...item} />
    );
}
 

Совет: Каждый раз, когда вы оказываетесь в ситуации, когда у вас есть «список вещей», и вы хотите, чтобы одна из этих вещей имела какое-то состояние, лучше сделать эту вещь своим собственным компонентом и заставить ее управлять своим собственным состоянием. Наличие состояния в родительском компоненте (как в вашем исходном примере) затрудняет это выполнение.

Комментарии:

1. Привет, Джейкоб! Большое вам спасибо за ваш ответ, это было полезно, однако я все еще не могу заставить его работать. Не могли бы вы предоставить некоторый код о том, как обновить стиль фона на основе переключенного состояния и что будет входить в часть {….пункт} компонента повестки дня. Извините за это, я совсем новичок в Javascript и все еще пытаюсь разобраться в происходящем. Еще раз большое спасибо!