Как я могу вернуть сложный вычисляемый массив в свою функцию-стрелку в Svelte3 и Javascript? - PullRequest
1 голос
/ 06 мая 2019

Начиная с новой версии Svelte v3, я пытаюсь перевести мой код v2 в новую версию.Я перевел вычисленную часть в функцию стрелки Javascript.Я хочу установить возвращаемое значение из функции в ту же переменную, в которой существует функция стрелки.Я также пытался сделать:

calendar = () => {...}

, но в этом случае браузер интерпретирует функцию стрелки как метод по умолчанию.

$: calendar => {
  // Function to calculate the calendar which updates every change
  let calendarArr = [];
  const offset = new Date(
    selectedDate.getFullYear(),
    selectedDate.getMonth(),
    1
  ).getDay();
  //number of days in selected month
  const days =
    32 -
    new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 32).getDate();
  //for each potential cell(empty cells + day cells)
  for (let d = 0; d < days + offset; d++) {
    //start new row if 0th, 7th, 14th etc day
    if (d % 7 == 0) calendarArr.push([]);
    //push cell into the row
    calendarArr[Math.trunc(d / 7)].push(
      d - offset < 0
        ? null
        : new Date(
            selectedDate.getFullYear(),
            selectedDate.getMonth(),
            d - offset + 1
          )
    );
  }
  console.log(calendarArr);
  return calendarArr; // -> I want to set this as the calendar value
};

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Реактивный оператор ($:) не обязательно должен быть выражением, которое оценивает одно значение.Вы можете вычислить calendarArr в реактивном выражении, а затем присвоить это значение другой переменной в вашем компоненте.

Пример

let calendar;

$: {
  // Function to calculate the calendar which updates every change
  let calendarArr = [];
  const offset = new Date(
    selectedDate.getFullYear(),
    selectedDate.getMonth(),
    1
  ).getDay();
  //number of days in selected month
  const days =
    32 -
    new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 32).getDate();
  //for each potential cell(empty cells + day cells)
  for (let d = 0; d < days + offset; d++) {
    //start new row if 0th, 7th, 14th etc day
    if (d % 7 == 0) calendarArr.push([]);
    //push cell into the row
    calendarArr[Math.trunc(d / 7)].push(
      d - offset < 0
        ? null
        : new Date(
            selectedDate.getFullYear(),
            selectedDate.getMonth(),
            d - offset + 1
          )
    );
  }
  console.log(calendarArr);
  calendar = calendarArr;
}
0 голосов
/ 06 мая 2019

Вы можете сразу же вызвать его так:

calendar = (() => { ... })()

Но еще лучше было бы дать этой функции имя и затем вызвать ее:

function createCalendar() { ... }

calendar = createCalendar()
...