Vue3 JS 與 SCSS 變數相互使用

来源:https://www.cnblogs.com/youyacoder/archive/2022/10/17/16799366.html
-Advertisement-
Play Games

1. JS 中使用 SCSS 變數。如在 scss 中定義了一個顏色,*el-menu* 組件使用該顏色作為背景色,此時需要獲取 scss 變數,通過 *background-color* 屬性將該變數值傳遞給 *el-menu* 組件(當然你也可以在 JS 中重新定義一個變數存儲該顏色)。 >2... ...


在開發中會遇到如下需求:

  1. JS 中使用 SCSS 變數。如在 scss 中定義了一個顏色,el-menu 組件使用該顏色作為背景色,此時需要獲取 scss 變數,通過 background-color 屬性將該變數值傳遞給 el-menu 組件(當然你也可以在 JS 中重新定義一個變數存儲該顏色)。
  2. SCSS 中使用 JS 變數。如動態換膚功能,用戶選中某個顏色作為主題色,整個系統的主題色都切換為這個主題色。用戶選擇的這個顏色使用 JS 變數存儲,SCSS 中需要使用該 JS 變數存儲的顏色。類似的場景還有暗黑模式等。

本文提供解決上述問題的思路。

1 JS 使用 SCSS 變數

1.1 創建 SCSS 變數文件

src 目錄下創建 scss 目錄,該目錄存儲 scss 文件。這裡需要註意,如果 JS 要使用 SCSS 文件中定義的變數,在 vue3 中,存儲變數的 SCSS 文件名格式為 xxx.module.scss

variables.module.scss。與 vue 2.x 不同,這裡的 .module 不能省略,在 vue 2.x 不要求文件名使用 xxx.module.scss 的方式。

src/scss/ 目錄下創建

config.module.scss 文件,該文件用於定義 scss 變數:

$titleColor: #FF0000;

1.2 導出 SCSS 變數

上面創建的 config.module.scss 文件中定義了一個變數:$titleColor

如果咱們只是在其他 scss 文件或 vue 文件的 style 標簽中使用,只需要在對應文件使用 @import 引入 config.module.scss 即可。但如果需要在 script 中的 JS/TS 中使用,還需要通過 export 將需要使用的變數導出:

$titleColor: #FF0000;

:export {
  titleColor: $titleColor;
}

這樣便將 $titleColor 的值通過變數名 titleColor 導出給 JS/TS。

1.3 使用 SCSS 變數

在 vue 文件的 script 中如果要使用上面的變數,先導入該 scss 文件:

import config from '@/scss/config.module.scss'

config 的值就是 scss 文件 :export 的對象。輸出 config 對象:

console.log(config)

控制台輸出:

{titleColor: '#FF0000'}

此時便可通過 config.titleColor 獲取 scss 文件中 $titleColor 的值。

vue 代碼如下:

<template>
  <div>
    <h1 :style="{color: color}">JS 獲取 SCSS 變數值</h1>
  </div>
</template>

<script lang="ts" setup>
import { ref } from 'vue'
import config from '@/scss/config.module.scss'

const color = ref(config.titleColor)
</script>

2 CSS 變數

在討論 SCSS 代碼使用 JS 變數前,咱需要先聊聊 CSS Next 中的 CSS 變數。CSS 2、CSS 3 大部分哥們都耳熟能詳,CSS Next 也不是什麼新鮮事物了。其中 CSS Next 很厲害的一個能力就是 CSS 變數。

2.1 全局 CSS 變數

咱可以在上面的 src/scss 目錄下創建 test.css 文件來嘗試使用 css 變數。

:root {
  --bgColor: pink;
}

body {
  background-color: var(--bgColor);
}

:root 中定義了全局 CSS 變數,CSS變數的命名約定以兩個 - 開頭,上面定義了一個全局 CSS 變數,變數名為 --bgColor

使用變數時使用 CSS 的 var() 函數。

main.ts 中引入該文件:

import '@/scss/test.css'

此時在瀏覽器中可以看到背景色變成粉紅色。

2.2 組件內 CSS 變數

在組件中也可以使用 CSS 變數。在對應的選擇器中定義變數即可。

<template>
  <div class="demo">
    <div class="css-div">CSS 變數</div>
  </div>
</template>

<script lang="ts" setup>
</script>

<style scoped lang="scss">
.demo {
  --font-size: 30px;

  .css-div {
    --textColor: blue;

    font-size: var(--font-size);
    color: var(--textColor);
  }
}
</style>

有了 CSS 變數的基礎,接下來就可以討論 scss 中如何使用 JS 變數了。

3 SCSS 使用 JS 變數

咱們用一個 demo 來說明 scss 中如何使用 js 變數:有三個按鈕和一個 div,點擊三個按鈕會切換 div 的背景色和文字顏色。

3.1 基礎代碼

首先實現頁面的基礎代碼:

<template>
  <div class="demo">
    <button v-for="(item, index) in btns"
            :key="index"
            @click="onBtnClick(item.bgColor, item.textColor)"
    >{{ item.title }}</button>

    <div>
      <div class="example">Hello World</div>
    </div>
  </div>
</template>

<script lang="ts" setup>
const btns = [
  { title: '紅色主題', bgColor: '#FF9191', textColor: '#FF0000' },
  { title: '藍色主題', bgColor: '#B3C4FF', textColor: '#042BA9' },
  { title: '預設主題', bgColor: '#333333', textColor: '#FFFFFF' }
]
const onBtnClick = (bgColor: string, textColor: string) => {
  console.log(bgColor, textColor)
}
</script>

<style scoped lang="scss">
.demo {
  padding: 10px;

  .example {
    --textColor: #FFFFFF;
    --bgColor: #333333;

    display: inline-block;
    margin-top: 20px;
    font-size: 20px;
    padding: 20px 50px;
    color: var(--textColor);
    background: var(--bgColor);
  }
}
</style>

頁面如下:

image-20221016172352073

上面代碼比較簡單,btns 變數定義了三個按鈕,通過 v-for 顯示三個按鈕。點擊按鈕的時候傳遞 bgColortextColor 兩個參數給點擊事件 onBtnClick 函數。顯示 Hello World 的 div,通過 --textColor--bgColor 兩個變數來控制背景色和文字顏色。

接下來便是實現點擊不同按鈕時,使用不同的文字顏色和背景色。

Vue3 中提供了兩種方式來實現動態改變 css 變數。下麵兩種方式都基於上面的基礎代碼實現:

3.2 方式1:setProperty

Vue 提供了 setProperty 的方式來改變 CSS 變數。

  1. 為目標 div 添加 ref 屬性:
<template>
		...
    <div>
      <div class="example" ref="exampleRef">Hello World</div>
    </div>
  </div>
</template>
  1. 獲取到該 div 的引用(ref):
import { ref } from 'vue'

const exampleRef = ref<HTMLDivElement | null>()
...
  1. 調用該引用 style 屬性的 setProperty 方法:
<script lang="ts" setup>
...
const onBtnClick = (bgColor: string, textColor: string) => {
  if (exampleRef.value) {
    exampleRef.value?.style.setProperty('--textColor', textColor)
    exampleRef.value?.style.setProperty('--bgColor', bgColor)
  }
}
</script>
...

3.3 方式2:v-bind

Vue3 中為 vue 文件的 style 提供了 v-bind 函數,實現了將 JS/TS 變數綁定到 CSS 變數上。

  1. 在 TS 中定義兩個變數存儲點擊事件時傳遞的兩個參數:
const currentBgColor = ref('#333333')
const currentTextColor = ref('#FFFFFF')
  1. 點擊事件中點參數賦值給上面兩個變數:
const onBtnClick = (bgColor: string, textColor: string) => {
  currentBgColor.value = bgColor
  currentTextColor.value = textColor
}
  1. style 中使用 v-bind 綁定上面兩個 JS 變數:
.demo {
	...

  .example {
    --textColor: v-bind(currentTextColor);
    --bgColor: v-bind(currentBgColor);

    ...
    color: var(--textColor);
    background: var(--bgColor);
  }
}

上面兩種方式根據自己的喜好使用。大家可以根據上面的思路嘗試實現主題切換、動態換膚等功能,在後面的實戰系列文章中咱在繼續討論這個話題。

感謝你閱讀本文,如果本文給了你一點點幫助或者啟發,還請三連支持一下,點贊、關註、收藏,作者會持續與大家分享更多乾貨


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用BCP + Polybase 實現本地數據遷移到Azure DB 一、背景 最近因為要做一些實驗的緣故, 需要在Azure DB上準備一些帶數據的資料庫。 AdventureWorks2019 和AdventureWorksDW2019就挺合適的,官網上能提供這兩個資料庫的備份文件。 在我將其成 ...
  • 背景 建立視圖, 方便查詢 create schema dba; create view dba.invalid_index as select indisvalid, indexrelid::regclass, indrelid::regclass, pg_get_indexdef(indexre ...
  • Redis 和 memcache 的區別,Redis 支持的數據類型應用場景 redis 支持的數據結構更豐富(string,hash,list,set,zset)。memcache 只支持 key-value 的存儲; redis 原生支持集群,memcache 沒有原生的集群模式。 ...
  • 過去,App里各種彈窗和貼片廣告不僅令用戶心煩,廣告主們也頭疼。一方面,廣撒網的廣告成本較高;另一方面,這些廣告不能精準觸達需要的用戶。直到個性化廣告的出現,才解決了這一痛點。 如今媒體廣告主們為了更精準地投放廣告,通常會收集用戶個人數據來判斷他們的特征定位、興趣愛好或近期需求等,然後在App里進行 ...
  • 簡單說下:offsetTop offsetTop: 為只讀屬性。 返回的是一個數字。 它返回當前元素相對於其 offsetParent 元素的頂部內邊距的距離。 它等價於offsetTop==>元素到offsetParent頂部內邊距的距離 offsetTop並不是指距離瀏覽器視窗最左邊的位置。 我 ...
  • propmt是一個輸入語句它的返回結果是你輸入的內容,無論輸入什麼內容返回結果的數據類型都是字元串類型。 alert是一個彈框輸出 console是控制台輸出 下麵代碼的意思是輸入一些內容然後保存到content變數裡面 然後alert輸出content變數也就是你從prompt輸入的內容 cons ...
  • 在前端頁面中,有些事件可能會由於用戶不必要的操作而頻繁觸發,這在無形之中就增加了伺服器的IO併發量. 為瞭解決這個問題,我們通常會通過防抖或節流的方式來限制事件函數的執行次數. ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 最近部門分享,有同學提到了 Vue 響應式原理,大家在討論時,發現一些同學對這一知識理解還不夠深入,不能形成一個閉環,為了幫助大家理解這個問題,我重新過了一下 Vue 源碼,並整理了多張流程圖,便於大家理解。 Vue 初始化 模板渲染 組 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...