React Собственное состояние выборки не обновляется

Используя Fetch API для реакции, это не обновляет пользовательский интерфейс после выполнения обещания.

Мы реализуем обещание, когда касаемся экрана (да, и обновляем пользовательский интерфейс с правильными данными).

В качестве обходного пути мы используем axios (https://github.com/mzabriskie/axios), и он решает нашу проблема.

Вот код:

продукт-service.js

export class ProductsService {
    constructor() {
    }

    getProductDetail(id) {
        let url = 'http://myservice/product-detail/' + id;
        return fetch(url)
            .then((response) => response.json());
    }
}

мой-component.js

export class MyComponent extends Component {
    constructor(props) {
        super(props);

        this.state = {
            product: {}
        };
    }

    componentDidMount() {
         let productService = new ProductsService();
         productService.getProductDetail(1)
            .then((productDetail) => {
                console.log('updateProduct: ', productDetail);
                this.setState({
                    product: productDetail
                });
            })
            .catch((error) => {
                console.error(error);
            });
    }

    render() {
        return (
            <View>
                <Text>{this.state.product.name}</Text>
            </View>
        );
    }
}

Когда мы используем выборку, название продукта появляется, только если мы касаемся экрана устройства. Когда мы используем axios, это работает.

Это ошибка?

Среда: Windows 10, Android 6, React Native 0.31


person Ben-hur Ott    schedule 24.08.2016    source источник
comment
Я думаю, что это ошибка выборки RN.   -  person deju    schedule 26.08.2016


Ответы (1)


Я не использую React Native, но сейчас у меня была такая же проблема. Дело в том, что this.setState, когда обещание разрешается, не указывает на компонент.

Перед вызовом выборки я сохранил это в переменной

const thiz = this;

а затем использовал переменную this для установки состояния

thiz.setState({});

или вы можете привязать функцию к this

then((function(){
    this.setState({});
}).bind(thiz))
person Andre Paschoal    schedule 09.12.2016