Почему мой компонент не перерисовывается после изменения состояний? - PullRequest
0 голосов
/ 10 мая 2018

У меня есть компонент ul, и я хочу переопределить все дочерние элементы li, когда я выполню запрос ajax.После выполнения запроса ajax я передаю response.data в состояние.Я могу console.log состояние и увидеть, что данные изменились, однако дети никогда не перерисовывают.

export class Tiles extends React.Component {
    constructor() {
        super();
        this.state = {
            items: []
        };

         this.itemList = this.state.items.map((items)=>{
            return <ModalTest key={item.id} items={items}/>
        });
    }



    //This is the local fake data standing in for the real DB
    componentDidMount() {
        axios.get('/tiles/')
            .then((res)=>{
                console.log(res.data);
                this.setState({items:res.data});
            });
    }

    render() {
        return (
            <ul className="tiles-ul">
                {this.itemList}
            </ul>
        );
    }
}

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

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

export class Tiles extends React.Component {
    constructor() {
        super();
        this.state = {
            items: []
        };

    }

    componentDidMount() {
        axios.get('/tiles/')
            .then((res)=>{
                console.log(res.data);
                this.setState({items:res.data});
            });
    }

    displayItemList() {
        return this.state.items.map((items)=>{
            return <ModalTest key={item.id} items={items}/>
        });
     }

    render() {
        return (
            <ul className="tiles-ul">
                {this.displayItemList() }
            </ul>
        );
    }
}
0 голосов
/ 10 мая 2018

Функция constructor запускается только один раз. Он не запускается после каждого state обновления. Это означает, что код

    this.itemList = this.state.items.map((items)=>{
        return <ModalTest key={item.id} items={items}/>
    });

запускается только один раз, когда state.items является пустым массивом. Так что this.itemList всегда будет пустым в вашем случае.

Чтобы отобразить список элементов при каждом обновлении, вы можете рассмотреть возможность создания массива в методе render, поскольку метод render запускается при каждом обновлении state.

renderItemList = () => {
    return this.state.items.map((items)=>{
       return <ModalTest key={item.id} items={items}/>
    });
}
render() {
    return (
       <ul className="tiles-ul">
          {this.renderItemList()}
       </ul>
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...