Получение setState не является функцией

-1

Я получаю следующую ошибку

//bundle.js:31367 Uncaught TypeError: this.setState не является функцией //

JSX:

  componentDidMount(){
    $.ajax({
        url:'http://intelligencevillage.wxtui.cn/index.php/Api/HomepageWebview/getHomepageData/area_id/5',
        dataType:'json',
        cache:false,
    }).done(function({data}){
        this.setState({
            lis1:[data.banner]
        })
    })
}

Я понимаю, что это своего рода проблема с привязкой, но я не знаю, как это исправить. Любая помощь приветствуется.

  • 0
    function ({data}) {...}. bind (this)
  • 0
    «Куда добавить .bind (this) в этой демонстрации, чтобы заставить его работать» - просто попробуйте добавить его здесь и там, после нескольких попыток вам, наконец, повезет!
Теги:

2 ответа

3

Проблема заключается в области выполнения функций.

componentDidMount(){
    $.ajax({
      ...
    }).done(function({data}){
        ///// HERE {this}
        // try console.log(this);
        // you will see there is no'setState'
        this.setState({
            lis1:[data.banner]
        })
    })
}

Теперь, функция внутри done цепочки, this ссылка только внутри функции.

Easy Fix: используйте функцию Fat Arror

componentDidMount(){
    $.ajax({
        url:'',
        dataType:'json',
        cache:false,
    }).done(({data}) => {
        this.setState({
            lis1:[data.banner]
        })
    })
}
1

Проблема в том, что this в вашем случае не соответствует правильному контексту. Функция внутри .done() представляет собой отдельный контекст для себя, и, следовательно, вы можете

1. Добавьте bind(this) после .done().

constructor(props){
    super(props);
    this.state={

        lis1:[],

    }

}
componentDidMount(){
    $.ajax({
        url:'',
        dataType:'json',
        cache:false,
    }).done(function({data}){
        this.setState({
            lis1:[data.banner]
        });
    }.bind(this));
}

2 Или вы можете назначить this отдельной переменной и использовать ее.

constructor(props){
    super(props);
    this.state={

        lis1:[],

    }

}
componentDidMount(){
    var self = this;
    $.ajax({
        url:'',
        dataType:'json',
        cache:false,
    }).done(function({data}){
        self.setState({
            lis1:[data.banner]
        })
    })
}
  • 0
    Дайте еще одну попытку.
  • 0
    msgstr ".done () создает отдельный контекст" --- нет. "добавить связывание (это) после .done ()" --- Нет.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню