React-native ListView "Предупреждение: не могу вызвать setState" - PullRequest
0 голосов
/ 06 сентября 2018

Эй, ребята, может кто-нибудь, пожалуйста, посмотрите на это. Я не могу найти, откуда он исходит, я искал на этой странице в последние дни, и я не могу найти его

Проблема в том, что каждый раз, когда я нажимаю на одно из имен в списке, навигация и Преобразование Значений в «global.dialed» работают идеально, но я всегда получаю это предупреждение, и приложение, кажется, работает немного после этого медленнее (но медленная производительность очень мала и, вероятно, просто иллюзия)

Полная ошибка:

Warning: Can't call setState (or forceUpdate) on an unmounted component. 
This is a no-op, but it indicates a memory leak in your application. To fix, 
cancel all subscriptions and asynchronous tasks in the componentWillUnmount 
method. 

трассировка стека указывает на строку 25

RecentCalls.js:

import React, { Component } from "react";
import { Text, View, ListView, TouchableHighlight } from "react-native";
import styles from "./../Styles/styles";
import global from "./../Components/global";

export default class RecentCalls extends Component {
  constructor() {
    super();
    const ds = new ListView.DataSource({
      rowHasChanged: (r1, r2) => r1 !== r2
    });
    this.state = {
      userDataSource: ds
    };
  }

  componentDidMount() {
    this.fetchUsers();
  }

  fetchUsers() {
    fetch("https://jsonplaceholder.typicode.com/users")
      .then(response => response.json())
      .then(response => {
        this.setState({
          userDataSource: this.state.userDataSource.cloneWithRows(response)
        });
      });
  }

  onPress(user) {
    this.props.navigation.navigate("Home3", {});
    global.dialed = user.phone;
  }

  renderRow(user, sectionId, rowId, highlightRow) {
    return (
      <TouchableHighlight
        onPress={() => {
          this.onPress(user);
        }}
      >
        <View style={[styles.row]}>
          <Text style={[styles.rowText]}>
            {user.name}: {user.phone}
          </Text>
        </View>
      </TouchableHighlight>
    );
  }

  render() {
    return (
      <View style={styles.padding2}>
        <ListView
          dataSource={this.state.userDataSource}
          renderRow={this.renderRow.bind(this)}
        />
      </View>
    );
  }
}

Большое спасибо за ваше время и усилия заранее:)

изменить 1

согласно milkersarac Я пытался (см. Ниже), но это не имело никакого значения

отредактировал конструктор для:

  constructor() {
    super();
    const ds = new ListView.DataSource({
      rowHasChanged: (r1, r2) => r1 !== r2
    });
    this.state = {
      userDataSource: ds
    };
    this.fetchUsers = this.fetchUsers.bind(this);
  }

1 Ответ

0 голосов
/ 06 сентября 2018

Вам нужно .bind(this) функция, которую вы обновляете, состояние компонента в конструкторе ваших компонентов. А именно попробуйте добавить this.fetchUsers = this.fetchUsers.bind(this) в качестве последней строки в ваш ctor.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...