OpenDesign Token与Vue/React集成教程:现代前端框架的完美搭配
OpenDesign Token与Vue/React集成教程现代前端框架的完美搭配【免费下载链接】opendesign-tokenThe repository of OpenDesign token项目地址: https://gitcode.com/openeuler/opendesign-token前往项目官网免费下载https://ar.openeuler.org/ar/OpenDesign Token是openEuler开源社区的设计系统变量库为现代前端开发提供了一套完整的设计语言解决方案。这个强大的设计系统包含了颜色、字体、间距、响应式变量等核心设计元素能够帮助开发者快速构建一致、美观且响应式的用户界面。本文将为您详细介绍如何在Vue和React项目中集成OpenDesign Token实现高效的前端开发工作流。 为什么选择OpenDesign TokenOpenDesign Token提供了多套开源社区的设计皮肤包括openEuler、Ascend、Kunpeng、Mindspore等主流开源项目的设计规范。通过使用这些设计变量您可以保持设计一致性确保整个应用的设计语言统一提高开发效率通过CSS变量快速应用设计规范支持主题切换轻松实现浅色/深色主题模式响应式设计内置的响应式变量自动适配不同屏幕尺寸鸿蒙字体支持集成华为鸿蒙字体提供优秀的视觉体验 安装OpenDesign Token在开始集成之前您需要先安装OpenDesign Token包。根据您使用的包管理器选择相应的命令# 使用npm安装 npm install opensig/opendesign-token # 使用pnpm安装推荐 pnpm add opensig/opendesign-token # 使用yarn安装 yarn add opensig/opendesign-token Vue 3项目集成指南1. 基础集成配置在Vue 3项目中首先在入口文件通常是main.ts或main.js中引入OpenDesign Token// src/main.ts import { createApp } from vue import App from ./App.vue import opensig/opendesign-token/fonts/css // 引入鸿蒙字体 import opensig/opendesign-token/themes/e.token.css // 引入openEuler主题 createApp(App).mount(#app)2. 主题切换功能实现OpenDesign Token支持浅色和深色主题切换。您可以在Vue组件中轻松实现主题切换功能!-- src/components/ThemeToggle.vue -- template button clicktoggleTheme classtheme-toggle {{ isDarkMode ? 切换到浅色主题 : 切换到深色主题 }} /button /template script setup langts import { ref, onMounted } from vue const isDarkMode ref(false) const toggleTheme () { isDarkMode.value !isDarkMode.value const theme isDarkMode.value ? e-dark : e-light document.documentElement.setAttribute(data-o-theme, theme) } onMounted(() { // 检测系统主题偏好 const prefersDark window.matchMedia((prefers-color-scheme: dark)) if (prefersDark.matches) { isDarkMode.value true document.documentElement.setAttribute(data-o-theme, e-dark) } }) /script style scoped .theme-toggle { padding: var(--o-r-gap-2) var(--o-r-gap-4); background-color: var(--o-color-brand-6); color: var(--o-color-white); border: none; border-radius: var(--o-r-border_radius-2); cursor: pointer; font-family: var(--o-font_family); font-weight: var(--o-font_weight-medium); } /style3. 使用设计变量在Vue组件中您可以直接使用OpenDesign Token提供的CSS变量!-- src/components/Button.vue -- template button :class[custom-button, variant] slot/slot /button /template script setup langts defineProps{ variant?: primary | secondary | outline }() /script style scoped .custom-button { padding: var(--o-r-gap-3) var(--o-r-gap-6); border-radius: var(--o-r-border_radius-2); font-family: var(--o-font_family); font-weight: var(--o-font_weight-semibold); font-size: var(--o-r-font_size-body); line-height: var(--o-r-line_height-body); cursor: pointer; transition: all 0.2s ease; border: 1px solid transparent; } .primary { background-color: var(--o-color-brand-6); color: var(--o-color-white); } .primary:hover { background-color: var(--o-color-brand-7); } .secondary { background-color: var(--o-color-neutral-2); color: var(--o-color-text-primary); } .secondary:hover { background-color: var(--o-color-neutral-3); } .outline { background-color: transparent; color: var(--o-color-brand-6); border-color: var(--o-color-brand-6); } .outline:hover { background-color: var(--o-color-brand-1); } /style⚛️ React项目集成指南1. 基础配置在React项目中您可以在入口文件如index.js或index.tsx中引入OpenDesign Token// src/index.jsx import React from react import ReactDOM from react-dom/client import App from ./App import opensig/opendesign-token/fonts/css import opensig/opendesign-token/themes/e.token.css import ./index.css const root ReactDOM.createRoot(document.getElementById(root)) root.render( React.StrictMode App / /React.StrictMode )2. 创建主题上下文为了更好地管理主题状态您可以创建一个React Context// src/contexts/ThemeContext.jsx import React, { createContext, useContext, useState, useEffect } from react const ThemeContext createContext() export const ThemeProvider ({ children }) { const [theme, setTheme] useState(e-light) useEffect(() { // 应用主题到根元素 document.documentElement.setAttribute(data-o-theme, theme) // 保存到localStorage localStorage.setItem(theme, theme) }, [theme]) useEffect(() { // 初始化时检查保存的主题或系统偏好 const savedTheme localStorage.getItem(theme) const prefersDark window.matchMedia((prefers-color-scheme: dark)) if (savedTheme) { setTheme(savedTheme) } else if (prefersDark.matches) { setTheme(e-dark) } }, []) const toggleTheme () { setTheme(prev prev e-light ? e-dark : e-light) } return ( ThemeContext.Provider value{{ theme, toggleTheme }} {children} /ThemeContext.Provider ) } export const useTheme () useContext(ThemeContext)3. 响应式布局组件利用OpenDesign Token的响应式变量创建自适应的布局组件// src/components/ResponsiveContainer.jsx import React from react import ./ResponsiveContainer.css const ResponsiveContainer ({ children, className }) { return ( div className{responsive-container ${className}} {children} /div ) } export default ResponsiveContainer/* src/components/ResponsiveContainer.css */ .responsive-container { max-width: var(--o-r-max_width-screen_xl); margin: 0 auto; padding: 0 var(--o-r-gap-4); } media (min-width: var(--o-r-breakpoint-sm)) { .responsive-container { padding: 0 var(--o-r-gap-6); } } media (min-width: var(--o-r-breakpoint-md)) { .responsive-container { padding: 0 var(--o-r-gap-8); } }4. 使用styled-components集成如果您使用styled-components可以这样集成OpenDesign Token// src/components/StyledCard.jsx import styled from styled-components const StyledCard styled.div background-color: var(--o-color-white); border-radius: var(--o-r-border_radius-3); padding: var(--o-r-gap-6); box-shadow: var(--o-shadow-2); border: 1px solid var(--o-color-neutral-3); transition: box-shadow 0.3s ease; font-family: var(--o-font_family); :hover { box-shadow: var(--o-shadow-4); } .card-title { font-size: var(--o-r-font_size-h3); font-weight: var(--o-font_weight-semibold); color: var(--o-color-text-primary); margin-bottom: var(--o-r-gap-4); } .card-content { font-size: var(--o-r-font_size-body); line-height: var(--o-r-line_height-body); color: var(--o-color-text-secondary); } const Card ({ title, children }) { return ( StyledCard {title div classNamecard-title{title}/div} div classNamecard-content{children}/div /StyledCard ) } export default Card 多主题支持OpenDesign Token支持多套社区主题您可以根据项目需求选择合适的主题// src/utils/themeLoader.js export const loadTheme (themeName) { // 移除当前主题 const currentTheme document.documentElement.getAttribute(data-o-theme) if (currentTheme) { const currentThemeClass currentTheme.split(-)[0] document.documentElement.classList.remove(${currentThemeClass}-theme) } // 加载新主题 import(opensig/opendesign-token/themes/${themeName}.token.css) .then(() { document.documentElement.setAttribute(data-o-theme, themeName) const themeClass themeName.split(-)[0] document.documentElement.classList.add(${themeClass}-theme) }) .catch(error { console.error(Failed to load theme ${themeName}:, error) }) } // 可用主题列表 export const availableThemes [ { value: e-light, label: openEuler 浅色 }, { value: e-dark, label: openEuler 深色 }, { value: a-light, label: Ascend 浅色 }, { value: a-dark, label: Ascend 深色 }, { value: k-light, label: Kunpeng 浅色 }, { value: k-dark, label: Kunpeng 深色 }, { value: m-light, label: Mindspore 浅色 }, { value: m-dark, label: Mindspore 深色 } ] 响应式设计实践OpenDesign Token内置了完整的响应式变量系统让您的应用在不同设备上都能完美呈现/* 响应式字体大小 */ .responsive-heading { font-size: var(--o-r-font_size-h1); line-height: var(--o-r-line_height-h1); } /* 响应式间距 */ .responsive-spacing { padding: var(--o-r-gap-4); margin-bottom: var(--o-r-gap-6); } media (min-width: var(--o-r-breakpoint-md)) { .responsive-spacing { padding: var(--o-r-gap-6); margin-bottom: var(--o-r-gap-8); } } /* 栅格系统 */ .grid-container { display: grid; grid-template-columns: repeat(var(--o-r-grid-columns), 1fr); gap: var(--o-r-gap-4); } .grid-item-3 { grid-column: span 3; } .grid-item-6 { grid-column: span 6; } .grid-item-9 { grid-column: span 9; } 自定义主题配置如果您需要自定义主题可以参考OpenDesign Token的配置文件结构// 参考配置文件结构 // packages/opendesign-token/configs/openEuler.token.config.ts您可以在项目中创建自定义的token配置文件然后使用相同的变量命名约定来扩展或覆盖默认主题。 性能优化建议按需加载字体如果只需要特定字重可以按需引入字体文件主题懒加载只在需要时加载主题CSS文件CSS变量缓存浏览器会自动缓存CSS变量确保性能Tree Shaking构建工具会自动移除未使用的CSS变量 最佳实践总结统一变量使用始终使用OpenDesign Token提供的CSS变量而不是硬编码值主题一致性在整个项目中保持主题切换的一致性响应式优先从移动端开始设计利用响应式变量适配不同屏幕字体优化合理使用鸿蒙字体的不同字重提升阅读体验类型安全在TypeScript项目中为CSS变量创建类型定义 结语OpenDesign Token为Vue和React项目提供了一套完整、一致且易于使用的设计系统解决方案。通过集成这个强大的工具您可以显著提高开发效率确保设计一致性并轻松实现主题切换和响应式设计。无论是构建企业级应用还是开源项目OpenDesign Token都能为您的前端开发工作流带来巨大的价值。开始使用OpenDesign Token让您的Vue和React项目拥有专业级的设计系统支持【免费下载链接】opendesign-tokenThe repository of OpenDesign token项目地址: https://gitcode.com/openeuler/opendesign-token创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

单片机秋招面试核心考点与STM32实战备考指南

单片机秋招面试核心考点与STM32实战备考指南

单片机秋招面试到底考什么?这是很多即将参加秋季招聘的嵌入式开发求职者最关心的问题。从51单片机到STM32,从基础原理到项目实战,面试官会从多个维度考察你的技术实力。本文将基于真实的单片机面试经验,为你梳理高频考点和备考策略…

2026/10/11 10:38:37 阅读更多 →
宇树H2 Plus与Isaac GR00T:具身智能的操作系统级重构

宇树H2 Plus与Isaac GR00T:具身智能的操作系统级重构

1. “宇树大脑总攻战”的真实含义:不是换块显卡,而是重构机器人智能范式 很多人看到标题里“接入英伟达算力”,第一反应是——哦,宇树给机器狗插了张4090?这事儿我也会,装个驱动、跑个CUDA样例就完事了。但…

2026/10/11 9:56:40 阅读更多 →
Unity IL2CPP下Newtonsoft.Json兼容性全攻略:反射、AOT与代码裁剪

Unity IL2CPP下Newtonsoft.Json兼容性全攻略:反射、AOT与代码裁剪

1. 项目概述:当Unity遇上Newtonsoft.Json与IL2CPP如果你在Unity开发中用过Newtonsoft.Json(也就是Json.NET),大概率会爱上它强大的序列化和反序列化能力,尤其是在处理复杂对象、自定义转换器时,它比Unity自…

2026/10/13 3:06:01 阅读更多 →

最新新闻

大模型与电机控制之间:三层分布式架构的工业落地实践

大模型与电机控制之间:三层分布式架构的工业落地实践

1. 从“一句话控制电机”的幻觉说起这两年大模型火得不行,不少做工业自动化的朋友私下问我:既然大模型连代码都能写,能不能让它直接控制电机?把产线上的PLC换掉,用自然语言让机械臂干这干那,听起来实在太有…

2026/10/13 11:38:11 阅读更多 →
aixingpan.cn API开发文档:api_docs_yearreport2025接口指南

aixingpan.cn API开发文档:api_docs_yearreport2025接口指南

aixingpan.cn API开发文档:api_docs_yearreport2025接口指南 1. 引言 本文档详细介绍了占星系统的api_docs_yearreport2025接口的使用方法,包括请求参数详解、响应数据结构、错误处理机制以及最佳实践建议。 2. 接口基础信息 接口名称: api_docs_yearrep…

2026/10/13 11:38:10 阅读更多 →
Qt多窗体与Dialog机制详解:模态非模态、生命周期与数据传递

Qt多窗体与Dialog机制详解:模态非模态、生命周期与数据传递

写这篇的时候,我刚帮一个朋友排查完他项目里的窗口问题——子窗体弹不出来、主界面卡死、对话框关了程序却还挂着。聊到最后他说了一句话:"早知道当初把Dialog和多窗体的机制搞清楚,能省我三天时间。"这话我特别有感触。Qt里做单窗…

2026/10/13 11:38:10 阅读更多 →
Llama 3部署实战:FP8量化与长上下文实测解析

Llama 3部署实战:FP8量化与长上下文实测解析

看到 Llama 3 发布那天,我并没有第一时间去跑 Demo,而是把技术报告、权重仓库、评测样例从头翻了一遍。这轮 Llama 3 精读下来,最想聊的不是它又刷了多少分,而是三个在实际部署里绕不开的问题:这一代架构究竟动了哪几刀…

2026/10/13 11:38:10 阅读更多 →
单机游戏玩家机器人模组部署与调优实战手册

单机游戏玩家机器人模组部署与调优实战手册

1. 单机版玩家机器人模组到底解决了什么问题 如果你玩过单机版角色扮演游戏,大概率经历过这种尴尬:副本门口站了半天,世界频道喊不到人,拍卖行空空荡荡,整个主城安静得像凌晨四点的便利店。单机版最大的痛点从来不是画…

2026/10/13 11:38:10 阅读更多 →
随机森林调参实战:从决策树原理到六维游标卡尺

随机森林调参实战:从决策树原理到六维游标卡尺

1. 为什么随机森林不是“黑箱”,而是你手边最可靠的木工刨子很多人第一次听说随机森林,脑子里浮现的是“一堆树”“森林”“随机”这几个词,下意识觉得:这玩意儿肯定很玄,调参像算命,结果像抽签。我刚接触时…

2026/10/13 11:37:09 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →