如何使用 vue.js 计算 <body> 或 <html> 上的样式?

Ed *_*hee 4 vue.js vuejs2

我正在使用vuejs 样式绑定在计算样式时动态呈现更改。

这适用于我的 Vue 实例范围内的所有内容,但我如何计算 body 或 html 标签的样式?当您可以将 vue 实例绑定到但 vue 不再允许您这样做时,这曾经是可能的。

我想动态更新在 vue 中使用我的计算变量的背景颜色。

编辑:添加了代码片段来演示

var app = new Vue({
  el: '#app',
  data: {
    color: '#666666'
  },
  computed: {
    backgroundColor: function() {
      return {
        'background-color': this.color
      }
    }
  },
  methods: {
    toggleBackground: function() {
      if(this.color=='#666666'){
        this.color = '#BDBDBD'
      } else {
        this.color = '#666666'
      }
    }
  }
})
Run Code Online (Sandbox Code Playgroud)
<script src="https://vuejs.org/js/vue.min.js"></script>
<html>
  <body>
    <div id="app" :style="backgroundColor">
      <div>
        lots of content...
      </div>
      <button @click="toggleBackground"> Click to toggle </button>
    </div>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

Roy*_*y J 8

如果你真的需要设置body自己的样式,你需要在watcher. 下面是一个简单的例子。

应该(不是我尝试过的,但我假设)能够通过使主体和外部容器不滚动来克服过度滚动效果。在里面放一个可滚动的容器。当它过度滚动时,它会显示您的外部容器,对吗?

不绑定的原因body这里(对于React,但适用于Vue)。

有什么问题?大家快来更新吧!有些人使用非 [Vue] 代码将模态附加到它上面。Google Font Loader 会很高兴地将元素放入 body 几分之一秒,如果您的应用程序在此期间尝试更新顶层的某些内容,它就会可怕且莫名其妙地崩溃。你真的知道你所有的第三方脚本在做什么吗?广告或社交网络 SDK 怎么样?

new Vue({
  el: '#app',
  data: {
    isRed: false
  },
  watch: {
    isRed() {
      document.querySelector('body').style.backgroundColor = this.isRed ? 'red' : null;
    }
  }
});
Run Code Online (Sandbox Code Playgroud)
#app {
  background-color: white;
  margin: 3rem;
}
Run Code Online (Sandbox Code Playgroud)
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.4.2/vue.min.js"></script>
<div id="app">
  <input type="checkbox" v-model="isRed">
</div>
Run Code Online (Sandbox Code Playgroud)


cru*_*h12 7

我想我找到了比使用jQuery/querySelector更好的解决方案

您可以直接在 Vue 模板中添加标签样式。并在此添加 v-if,就像这样:

<style v-if="true">
  body {
    background: green;
  }
</style>
Run Code Online (Sandbox Code Playgroud)

因此,您可以在此 v-if 中使用计算/方法,并且 DOM 始终会在您需要时更新。

希望这会帮助某人;)

UPD: 在模板中使用标签“样式”不是最好的主意,但您可以创建 v 样式组件,然后一切都会好起来的: 在 vuejs 模板中使用样式标签并从数据模型更新

我的片段:

<style v-if="true">
  body {
    background: green;
  }
</style>
Run Code Online (Sandbox Code Playgroud)
Vue.component('v-style', {
  render: function (createElement) {
    return createElement('style', this.$slots.default)
  }
});

new Vue({
  el: '#app',
  data: {
    isRed: false,
    color: 'yellow',
  },
});
Run Code Online (Sandbox Code Playgroud)