如何在 Vuex 商店的 Vue.js 组件中设置动态样式

Posted

技术标签:

【中文标题】如何在 Vuex 商店的 Vue.js 组件中设置动态样式【英文标题】:How to set dynamic styles in Vue.js component from Vuex store 【发布时间】:2020-05-09 15:29:24 【问题描述】:

我正在尝试直接从 store 中设置一组组件样式,这样当 store 发生变化时,每个组件的设计也会发生变化。

我在我的 Vuex 商店中存储了一组链接,如下所示:

links: [
    id: 1, text: 'Banana is a test', design: color: 'red', 'background-color': 'blue', padding: '51px', margin: '5px', 'border-width' : '10px', 'border-color': 'blue', 'font-weight' : 600, font: 'Arial',
    id: 2, text: 'This is a test', design: color: 'red', 'background-color': 'blue', padding: '20px', margin: '10px', 'border-width' : '10px', 'border-color': 'green', 'font-weight' : 600, font: 'Arial',
    id: 3, text: 'Monkey is a test', design: color: 'red', 'background-color': 'blue', padding: '5px', margin: '5px', 'border-width' : '10px', 'border-color': 'green', 'font-weight' : 600, font: 'Arial',
]

这就是我尝试渲染它们的方式

<a v-for="link in links" :key=link.id :href="link.destination" :id=link.id :style="link.design">
   link.text
</a>

问题是,当 Vuex 商店中的设计对象发生变化时,链接样式不会像我预期的那样随后更新。

在我的 Vue 组件中,我尝试以不同的方式获取链接,假设这会改变反应性。目前我使用这样的计算方法来获取它们:

computed: 
    getLinks: function() 
        return this.$store.state.links
    
,

但每当我更改背景颜色的值时,例如从“蓝色”到“红色”,我都必须重新加载页面才能看到更改。每次调用突变时是否需要强制重新呈现页面?

这是我的变异供参考:

setSelectedItemDesign (state, payload ) 
    state.selectedItem.design[Object.keys(payload)[0]] = Object.values(payload)[0]

我会像这样从我的组件中调用它:

this.$store.commit('setSelectedItemDesign', 'background-color' : this.rgbaValue)

【问题讨论】:

样式名用驼峰写法,例如:fontSize 我认为此链接可能对您有所帮助。 vuejs.org/v2/guide/list.html#Array-Change-Detection @nada 谢谢你是对的 【参考方案1】:

那是因为您直接在此处return this.$store.state.links 从商店中读取值。这样它就不是被动的,也不是反模式,因为你不应该像那样访问商店。

您应该创建 getter 来获取价值,然后就可以了。

【讨论】:

【参考方案2】:

问题在于,正如 nada 正确指出的那样,我没有以 Vue 观察到的触发视图更新的方式更新商店中的数组。

您可以在此处查看更多详细信息:vuejs.org/v2/guide/list.html#Array-Change-Detection

【讨论】:

以上是关于如何在 Vuex 商店的 Vue.js 组件中设置动态样式的主要内容,如果未能解决你的问题,请参考以下文章

Axios 拦截器 - 如何从 vuex 商店返回响应

Vue.js- Vuex 更新数组中的对象,内部状态未反映在组件 DOM 中

Vuex 状态与 Firebase 同步

Vue.js / Vuex + axios 发送多个 PUT 请求

后端表单验证回调方法 | vuex 商店 | Vue.js

状态渲染前的 Vue.js/vuex getters 错误