Как вызвать функцию только при изменении свойства React? - PullRequest
0 голосов
/ 08 февраля 2019

Я хочу показывать модальное диалоговое окно (например, alert()) каждый раз, когда изменяется подписка Meteor, отслеживаемая в React с помощью withTracker.

Я пытался использовать Tracker.autorun для отслеживанияизменяется, но не может понять, где в коде разместить его.Кажется, он не работает в конструкторе Component и запускается каждый раз, если помещен в render().

. Вот как выглядит мой код:

class Foo extends Component {
    render() {
        return (
            <h1>Example Header</h1>
            { this.maybeShowAlert() }
        );
    }

    maybeShowAlert() {
       // ONLY if bar has been updated
       alert('bar has changed');
    }
}

export default withTracker(() => {

    Meteor.subscribe('bar')

    return {
        bar: Bar.findOne({})
    };
})(Foo);


Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Если вы собираетесь использовать Tracker.autorun, тогда лучшим местом для вызова будет componentDidMount, потому что он вызывается только один раз после того, как компонент смонтирован .Вы должны вызывать функцию трекера только один раз, так как функция трекера будет перезапускаться всякий раз, когда реактивные источники данных, от которых она зависит, изменяют .В трекере есть функция, где вы будете вызывать maybeShowAlert в зависимости от значения bar, вот так:

componentDidMount() {
    Tracker.autorun(() => {
        let bar = this.props.bar;
        if (bar) {
            this.maybeShowAlert();
        }
    }
}
0 голосов
/ 08 февраля 2019

Раньше Метеор не использовался, но если вы хотите что-то сделать в ответ на изменения состояния / поддержки, тогда componentDidUpdate() - это метод его жизненного цикла.Например,

componentDidUpdate(prevProps) {
    if (this.props.bar !== prevProps.bar {
        // bar prop has changed
        alert("bar changed);
    }
}
...