Компонент монтируется до размонтирования предыдущего компонента (и сохраняет подписку)

У меня есть два основных компонента, которые имеют общий макет. Первый представляет собой список записей. Когда пользователь нажимает «Изменить», он попадает на страницу сведений.

Проблема заключается в том, что на странице сведений отображается первая запись со страницы «список», а не та, которую щелкнул пользователь.

Я провел некоторое тестирование, и похоже, что проблема заключается в том, что страница сведений загружается и монтируется до запуска ComponentWIllUnmount(), поэтому подписка с этой предыдущей страницы все еще активна в течение нескольких миллисекунд. Если я перехожу непосредственно на страницу сведений или перезагружаю ее, она работает правильно, поскольку не получает никаких данных с предыдущей страницы.

Вот мой код:

Список.jsx

export default class List extends TrackerReact( React.Component ) {

    constructor( props ) {

        super( props );

        var subscription = this.getSubscription();

        this.state = {

            ready: subscription.ready(),
            subscription: subscription,

        }

    }

    componentWillUnmount() {

        this.state.subscription.stop();

    }

    render() {
        return(
        //stuff...
        )
    }

}

Деталь.jsx

export default class SkinDetail extends TrackerReact( React.Component ) {

    constructor( props ) {

        super( props );

        const subscription = Meteor.subscribe( 'skins.one', this.props.skin );

        var record = Records.findOne();

        if( record ) {

            this.state = {

                subscription: subscription,
                // Stuff...

            }

        }

    }

    getRecord() {

        return Records.findOne();

    }

    render() {

        var record = this.getRecord(); 

        return(
            // Do stuff with record...
        )

    }
}

Я использую FlowRouter SSR для ссылок и маршрутов.


person BioXD    schedule 04.11.2016    source источник
comment
Не рассчитывайте на то, что запись будет единственной доступной. Найдите его по _id. Остановка подписки занимает немного времени (сервер должен сообщить клиенту, что нужно удалить и т. д.).   -  person MasterAM    schedule 04.11.2016


Ответы (1)


Вы должны найти свою запись явно, не полагайтесь на данные, отправленные с сервера.

Например, если требования изменились и вам нужно добавить еще один компонент на страницу сведений, показывающую другую запись, простое использование Records.findOne не даст вам нужной записи.

Вместо этого вы должны предоставить запрос, например _id, .find для получения записи. Вы можете определить свой маршрут с помощью FlowRouter, чтобы сохранить значение _id: FlowRouter.route('/details/:_id, {...})

person kkkkkkk    schedule 18.11.2016