Как динамически заполнять объект markedDates в календарях React Native?

#sqlite #react-native #object #react-native-calendars

#sqlite #react-native #объект #реагировать-native-календари

Вопрос:

Основываясь на документации React-Native-Calendars, вот тестовые коды с жестко заданными markedDates, которые показывают точки в календаре:

 const FirstDot = { key: 'First', color: 'blue' };
const SecondDot = { key: 'Second', color: 'blue' };

<Calendar
   current={new Date()}
   markingType={'multi-dot'}
   markedDates={{
      '2019-04-15': { dots: [FirstDot, SecondDot] },
      '2019-04-14': { dots: [FirstDot] },
   }}
/>
 

В основном я хочу показать одну или две точки в зависимости от данных. Допустим, я извлекаю данные из SQLite, как я могу динамически заполнять отмеченные даты в React Native?

 this.state = { markedDates: {} };  //how to declare the state object?
//other codes.....

db.transaction((tx) => { 
    let objMarkedDates = this.state.markedDates;
    tx.executeSql('SELECT myDates, dataDots FROM myTable', 
    [], (tx, results) => {
        const len = results.rows.length;
        if (len > 0) {
            for (let i = 0; i < len;   i) {
                if (results.rows.item(i).dataDots === 2) { //show 2 dots
                    //How to populate the date and the dots to the object???
                }
            }
        }
    }); 

    this.setState({ markedDates: objMarkedDates });
});

<Calendar
   current={new Date()}
   markingType={'multi-dot'}
   markedDates={this.state.markedDates}
/>
 

Ответ №1:

Предполагая, что ваши данные находятся в форме массива, вот что я написал для массива данных json

             var element = {};

            for(var i =0;i<this.state.array.length;i  ){
                if((Object.keys(element)).indexOf(this.state.array[i].date) > -1){
                  for(var j = 0;j<Object.keys(element).length;j  ){
                    if(this.state.array[i].start_date === Object.keys(element)[j]){
                      var a ={key:this.state.array[i].id,color:'red'}
                      element[this.state.array[i].date].dots.push(a);
                    }
                  }
                }else{
                  var a = {dots:[{key:this.state.array[i].id,color:'red'}]}
                  element[this.state.array[i].date ''] = a;
                }
            }
 

Ответ №2:

На основе ответа user11630092:

 const MARKED_DATE_CONTAINER: ViewStyle = {
    backgroundColor: AppColors.primary,
    borderRadius: 0
}

const MARKED_DATE_TEXT: TextStyle = {
    color: AppColors.white
}
 

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

 const customStyles = {
    container: {...MARKED_DATE_CONTAINER},
    text: {...MARKED_DATE_TEXT}
}
 
 var element = {};

for(var i =0;i<array.length;i  ){
    var a = {customStyles: {...customStyles}}
    element[`${formatMyDate(array[i].startDate)}`] = a;
}
 

Результат