javascript - 观察者是否与 Vue 中的全局混合一起工作?

标签 javascript vue.js

我已经搜索了 Vue 文档,除非我是盲人,否则我看不到任何声明观察者不能用于父组件的子组件,或者在我的情况下,不能用于全局混合属性。但是,出于某种原因,我无法让我的工作......

我有一个用于锁定/解锁窗口滚动的全局混合。非常简单,我正在尝试监听子组件对全局混合的 bodyLocked bool 属性的更改。

出于某种原因,观察者确实在页面加载时触发,但在那之后,它似乎并没有在监听变化。

这是我的 mixin(它在全局范围内与 Vue.mixin() 一起使用):

export default {

    data() {
        return {
            bodyLocked: false
        }
    },

    methods: {

        /**
         * Lock the DOM body to disable scrolling.
         *
         * @return void
         */
        _lockBody() {
            this.bodyLocked = true;
            document.documentElement.classList.add('no-scroll');
        },

        /**
         * Unlock the DOM body to enable scrolling.
         *
         * @return void
         */
        _unlockBody() {
            this.bodyLocked = false;
            document.documentElement.classList.remove('no-scroll');
        }

    }

};

这是一个示例子组件:

export default {

    watch: {

        bodyLocked: function(locked) {

            console.log('locked: ' + locked);

        }

    }

}

最佳答案

当您使用全局混合时,组件不会共享相同的 bodyLocked 数据实例。因此,在一个组件中更改它不会在其他组件中更改它。每个组件都有自己的 bodyLocked 值。

另一种替代方法是在 Vue 原型(prototype)上共享一个对象,而不是使用全局混合。这样的对象将在所有组件实例之间共享。它还会在组件内提供更清晰的命名空间,并且应该比全局混合具有更低的性能影响。

const locker = Vue.observable({
  locked: false,
  
  lock () {
    locker.locked = true;
    document.documentElement.classList.add('no-scroll');  
  },
  
  unlock () {
    locker.locked = false;
    document.documentElement.classList.remove('no-scroll');
  }
});

Vue.prototype.$bodyLocker = locker;

new Vue({
  el: '#app',
  
  watch: {
    '$bodyLocker.locked' (locked) {
      console.log('watcher fired: ' + locked);
    }
  }
});
.no-scroll {
  background-color: #f00;
}
<script src="https://unpkg.com/vue@2.6.10/dist/vue.js"></script>
<div id="app">
  <button @click="$bodyLocker.lock">Lock</button>
  <button @click="$bodyLocker.unlock">Unlock</button>
</div>

关于javascript - 观察者是否与 Vue 中的全局混合一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56918751/

相关文章:

javascript - 基本 Mocha TDD 接口(interface)

javascript - 回发时 HTML 输入值清除

Javascript date.setSeconds 在 Debugger 中按预期工作但在脚本中不工作

javascript - vue中可以用函数的返回来定义div的样式吗?

javascript - 从 vue.js 组件读取复选框值

vue.js - 在我的所有组件 vue 中全局使用 axios

javascript - 如何在计算器工作中实现加/减按钮?

javascript - ANGULARJS 用空数组填充数组对象

css - 如何在 v-text-field 中使用 v-chips

javascript - 弹出onselect事件