关于scss和js的参数传导

773 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情

1.提出问题

当我们在scss中使用$语法定义公共参数的时候,有时候需要通过js进行异步的网络请求,来动态改变公共参数的值。同样,在某些场景下,比如canvas或者echars中,可能也需要通过js来获取到公共参数。

因此需要考虑scss和js的参数传导问题。

//scss文件
$mainColor:red // 定义一个变量$mainColor
// html文件。引用此变量。
<style> 
 .className{
        color:$mainColor
    }
</style>

2. js动态修改公共参数的值

分析:要想通过js代码动态修改scss文件中的值,那么第一步,就要用css3的语法var()设置一个具有作用域的属性名,然后通过js来改变这个属性的值

//scss文件
$mainColor:var(--mainColor,red); // (修改)设置一个具有作用域的属性名--mainColor
//  js文件

// 接下来全局修改--mainColor的值
 document.getElementsByTagName("body")[0].setAttribute("style","--mainColor:green")
 // 或者
 document.getElementsByTagName("body")[0].style.setProperty("--mainColor",'green')

那么此时className里的color属性,就是var(--mainColor,green)了,在浏览器上classNamecolor属性用的是green

3.通过js来获取公共参数

分析:要想获取scss文件里的参数,首先需要将参数从scss文件里导出。

//scss文件
$mainColor:var(--mainColor,red); // (修改)设置一个具有作用域的属性名--mainColor

// (新增)
:export{
    export-mainColor:$mainColor
}

这样就将全局中的$mainColor参数导出来了。接下来在js文件中导入scss文件

//  js文件

// 接下来全局修改--mainColor的值
 document.getElementsByTagName("body")[0].setAttribute("style","--mainColor:green")
 // 或者
 document.getElementsByTagName("body")[0].style.setProperty("--mainColor",'green')
 // (新增)
import {export-mainColor} from scssPath //scssPath指的是scss文件路径 
console.log(export-mainColor); // 打印1

思考,打印1是var(--mainColor, red)还是var(--mainColor, green)呢?

经试验,打印出的是var(--mainColor, red),说明用js获取的$mainColor,只会是初始化的值。这是因为对--mainColor的改变只是浏览器dom层面的,而并没有改变$mainColor的值。当然,这也已经达到了我们获取$mainColor值的目的。

4.总结

当需要用js动态改变公共参数的值,可以使用css3的var语法定义带有作用域的值,再动态改变这个值。

当需要获取scss公共参数的时候,就用scss的:export语法将属性导出,再用js的import语法导入。同时需要注意,此时导出的值,如果为var语法定义,那么只能导出scss文件中初始化定义的值。后期对于var语法值更新,与js中导出的值无关。