#reactjs
#reactjs
Вопрос:
Я все еще изучаю react. Данные извлекаются из действия redux и сохраняются как реквизиты. Моя проблема в том, что моя переменная не определена после выполнения функции фильтра. То, что я пытаюсь сделать, это использовать данные из redux action и отображать эти переменные. Состояние компонента оказывается неопределенным, и в представлении ничего не отображается. Кто-нибудь знает, как это исправить?
https://i.stack.imgur.com/3xyJn.png
1) Warning: Can't perform a React state update 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.
2) Uncaught TypeError: Cannot destructure 'this.state.currentTour' as it is undefined.
[
{
"_id": "12345",
"name": "I am first tour",
"description": "Iasofisajdaiosjdioasdmoias",
"imageUrl": "https://something1.jpg",
"dates": [
"2021-06-19T09:00:00.000Z",
"2021-07-20T09:00:00.000Z",
],
},
{
"_id": "67890",
"name": "I am second tour",
"description": "cvxbcvbcxbcvbcxb",
"imageUrl": "https://something2.jpg",
"dates": [
"2023-01-12T09:00:00.000Z",
"2023-04-22T01:00:00.000Z",
],
},
//.....rest data
]
import React, { Component } from 'react';
import './Tour.css';
import { connect } from 'react-redux';
class Tour extends Component {
constructor(props) {
super(props)
this.state = {
currentTour: {},
}
this.findSingletour = this.findSingletour.bind(this);
}
componentDidUpdate() {
const tourId = this.props.match.params._id;
let FilteredTour = this.findSingletour(tourId);
// console.log(FilteredTour); ----> undefined
if (FilteredTour !== this.state.currentTour) {
this.setState({
currentTour: FilteredTour
});
}
}
findSingletour = (tourId) => {
const notYetFilterTours = this.props.tours.tourState.data;
let filtered = [];
if (notYetFilterTours) {
filtered = notYetFilterTours.find((tour) => {
if (tour.id === tourId) return true;
return filtered; // ---> actual object get back { id: '...' , name: '...', ..... }
});
}
};
render() {
const {
name,
description,
imageUrl,
dates,
} = this.state.currentTour || {}; // ---> undefined
return (
<div>
<span>{name}</span>
<span>{description}</span>
<span>{imageUrl}</span>
<span>{dates[0]}</span>
</div>
)
}
}
const mapStateToProps = (state) => ({
tours: state.tourContainer,
});
export default connect(
mapStateToProps,
)(Tour);
Комментарии:
1. в фильтре
"_id": "67890",
использовать_id
неid
Ответ №1:
Попробуйте это, я не знаю, полезно это или нет, но это работает для меня
- Для предупреждения
Can't perform a React state update...
=> чтобы не видеть это предупреждение, добавьте код ниже и добавьтеif(!this.mounted) return;
перед тем, где вы когда-либо использовалиthis.setState
private mounted = false as boolean; componentWillUnmount() { this.mounted = false } componentWillMount() { this.mounted = true }
- Я вижу, что ваша функция findSingletour() должна возвращать для нее значение по умолчанию.
Пример:findSingletour = (tourId) => { const notYetFilterTours = this.props.tours.tourState.data; let filtered = []; if (notYetFilterTours) { filtered = notYetFilterTours.find((tour) => { if (tour.id === tourId) return true; return filtered; // ---> actual object get back { id: '...' , name: '...', ..... } }); } return filtered; // or something else cause I saw you had return bool or filtered // If you do not return here result maybe is undefined };
Комментарии:
1. Спасибо за объяснение. ‘filtered’ теперь содержит объект, но this.state.currentTour по-прежнему является пустым объектом и не обновляется.