官术网_书友最值得收藏!

Watchers

So, how can we add/remove classes from thebodyif it's out of Vue's dominion? We'll have to do it the old-fashioned way with the browser's Web API. We need to run the following statements when the modal is opened or closed:

// Modal opens
document.body.classList.add('modal-open');

// Modal closes
document.body.classList.remove('modal-closed');

As discussed, Vue adds reactive getters and setters to each data property so that when data changes it knows to update the DOM appropriately. Vue also allows you to write custom logic that hooks into reactive data changes via a feature calledwatchers.

To add a watcher, first add thewatchproperty to your Vue instance. Assign an object to this where each property has the name of a declared data property, and each value is a function. The function has two arguments: the old value and new value.

Whenever a data property changes, Vue will trigger any declared watcher methods:

var app = new Vue({
  el: '#app'
  data: {
    message: 'Hello world'
  },
  watch: {
    message: function(newVal, oldVal) {
      console.log(oldVal, ', ', newVal);
    }
  }
});

setTimeout(function() {
  app.message = 'Goodbye world';
  // Output: "Hello world, Goodbye world";
}, 2000);

Vue can't update thebodytag for us, but it can trigger custom logic that will. Let's use a watcher to update thebodytag when our modal is opened and closed.

app.js:

var app = new Vue({
  data: { ... },
  watch: {
    modalOpen: function() {
      var className = 'modal-open';
      if (this.modalOpen) {
        document.body.classList.add(className);
      } else {
        document.body.classList.remove(className);
      }
    }
  }
});

Now when you try to scroll the page you'll see it won't budge!

主站蜘蛛池模板: 三亚市| 庆城县| 文山县| 石楼县| 广灵县| 高尔夫| 班玛县| 祁连县| 驻马店市| 方城县| 侯马市| 望谟县| 肥西县| 永平县| 洪泽县| 普洱| 平湖市| 合阳县| 云霄县| 都匀市| 昌黎县| 吉安市| 丁青县| 游戏| 当阳市| 甘孜| 龙门县| 水富县| 霍城县| 邵武市| 渑池县| 东莞市| 綦江县| 西安市| 五家渠市| 焉耆| 眉山市| 库车县| 永德县| 名山县| 东明县|