Welcome to Alex's Midway

Vue使用provide-inject特性注入皮肤配置

January 03, 2020


背景

H5页面主题皮肤切换,有2条路线,一是使用css实现,一是使用js实现。

其实需求很简单,希望组件本身可以和皮肤主题解耦,这样至少有2个好处:

  • 更改的时候只用在皮肤设置文件更改一次
  • 组件本身与主题样式无关,只在需要的时候把组件和主题组合使用,有足够的灵活性

现有方案的问题

现有方案使用的less,在每个组件中引入less variables,然后再按照css规则渲染主题。

其实已经基本够用了,只是必须每个组件分别编写对应主题下的规则,引入了主题和组件的强耦合,不是特别好的设计,也无法做到实时更改主题。

本来可以用sass的mixin,但同事都比较排斥sass,只好放弃。

于是考虑尝试js的方案。

JS的方案

搜索的过程中看到了vuetify,它的主题实现就用的provide模式,看了文档之后发现这个就是vue版的React context,来了兴趣就试验了一下。

废话完毕,先看看基本使用

Provide-Eject基本使用

查下vue的官方文档就明白了,2句话:

  1. 父组件配置provide,注入属性
  2. 子组件配置inject,使用属性

当然vue本身还支持provide-inject之间互传信息的,对于主题来说,内部注入主题已经足够了,所以没有再继续深究这个特性。

版本一:基本使用

版本二:结合mixin

版本三:实时换主题