web-dev-qa-db-fra.com

TypeError: Object (...) n'est pas une fonction

J'essayais de nettoyer ce composant réactif en extrayant fillCalendar() d'être une méthode du composant dans son propre fichier js et en l'important à la place. À l'origine, this.state.datesArray était défini dans une méthode de cycle de vie composantWillMount (). Maintenant, j'essaye de l'initialiser directement dans le constructeur car c'est ce que réagit la documentation recommande . Le faire de cette façon génère maintenant une erreur "TypeError: Object (...) n'est pas une fonction" et je ne sais pas pourquoi. Voici à quoi ressemble Calendar.js voir ici .

Calendrier.js

import React, { Component } from 'react';
import { fillCalendar } from '../calendar.tools'

class Calendar extends Component {
  constructor(props) {
    super(props)
    this.state = {
      datesArray: fillCalendar(7, 2018),
      date: new Date(),
      monthIsOffset: false,
      monthOffset: new Date().getMonth(),
      yearOffset: new Date().getFullYear()
    }
  }
  render() {
    return (
      ...
    )
  }
}

calendar.tools.js

let fillCalendar = (month, year) => {
  let datesArray = []
  let monthStart = new Date(year,month,1).getDay()
  let yearType = false;
  let filledNodes = 0;
  // Check for leap year
  (year%4 === 0) ? 
    (year%100 === 0) ?
      (year%400) ? yearType = true : yearType = false : 
    yearType = true : 
  yearType = false
  const monthArrays = yearType ? [31,29,31,30,31,30,31,31,30,31,30,31] : [31,28,31,30,31,30,31,31,30,31,30,31]
  if (month === 0) { month = 12; }
  let leadDayStart = monthArrays[month-1] - monthStart + 1
  // Loop out lead date numbers
  for (let i = 0; i < monthStart; i++) {
    datesArray.Push({date: leadDayStart, type: "leadDate", id: "leadDate" + i})
    leadDayStart++
    filledNodes++
  }
  if (month === 12) { month = 0; }
  // Loop out month's date numbers
  for (let i = 0; i < monthArrays[month]; i++) {
    datesArray.Push({date: i + 1, type: "monthDate", id: "monthDate" + i})
    filledNodes++
  }
  // fill the empty remaining cells in the calendar
  let remainingNodes = 42 - filledNodes;
  for (let i = 0; i < remainingNodes; i++) {
    datesArray.Push({date: i + 1, type: "postDate", id: "postDate" + i})
  }
  return datesArray
}
7
Ryan Sam

Ça a l'air bien, il vous suffit de export votre fonction, c'est tout.

utilisation

export let fillCalendar = (month, year) => {

au lieu de

let fillCalendar = (month, year) => {
11
Amruth LS

Exemple pour composant d'ordre supérieur

Fonction d'exportation directement à partir de la déclaration venue

export default function Authorized(WrappedComponent) {

}
0
Biswajit