[自定义 Vue 组件] 小尾巴 Logo 组件 TailLogo

文字归档于:https://www.yuque.com/u27599042/coding_star/apt6y731ybmxgu5g

组件效果


组件依赖

自定义字符串工具函数 stringIsNull

https://www.yuque.com/u27599042/coding_star/slncupw7un3ce7cb

javascript 复制代码
import {stringIsNull} from "@/utils/string_utils.js"
javascript 复制代码
/**
 * 判断是否为字符串类型
 * @param str 需要判断的变量
 * @returns {boolean} true:字符串类型;false:非字符串类型
 */
export function isString(str) {
    return !(str === null) && !(str === undefined) && typeof(str) === 'string'
}

/**
 * 判断一个字符串是否为空。
 * 当传入的参数为 null 或 undefined 或 不为字符串 或 字符串的长度小于等于0,则该字符串为空;
 * 否则,字符串不为空
 * @param str 需要进行判断的字符串
 * @returns {boolean} true:空;false:非空
 */
export function stringIsNull(str) {
    return !(isString(str)) || str.length <= 0
}

项目环境变量

项目根目录/.env.dev,此依赖非必要,如果环境文件中无相应的配置项,则在使用 TailDropDown 组件时,就必须传递 logoImageUrl、logoText

javascript 复制代码
/**
 * 获取环境变量
 * @type {ImportMetaEnv}
 */
const env = import.meta.env
const LOGO_IMAGE_URL = env?.VITE_LOGO_IMAGE_URL // logo 图片 url
const LOGO_TEXT = env?.VITE_LOGO_TEXT // logo text

CSS 变量

src/styles/theme_styles/dark.csssrc/styles/theme_styles/light.css,本组件提供了两种主题(暗色与亮色)的 CSS 变量

css 复制代码
:root[class*='dark'] {
    /*
     * 小尾巴 logo 组件样式变量
     */
    /* 小尾巴 logo 组件背景颜色 */
    --tail-logo-bgc: #454545;
    /* 小尾巴 logo 组件 logo 文字字体 */
    --tail-logo-text-font-family: RJTHFH, serif;
    /* 小尾巴 logo 组件 logo 文字颜色 */
    --tail-logo-text-font-color: #efefef;
}
css 复制代码
:root[class*='light'] {
    /*
     * 小尾巴 logo 组件样式变量
     */
    /* 小尾巴 logo 组件背景颜色 */
    --tail-logo-bgc: #efefef66;
    /* 小尾巴 logo 组件 logo 文字字体 */
    --tail-logo-text-font-family: RJTHFH, serif;
    /* 小尾巴 logo 组件 logo 文字颜色 */
    --tail-logo-text-font-color: #333333;
}

组件属性参数

javascript 复制代码
const props = defineProps({
  // logo 组件点击事件处理函数
  logoClickHandler: {type: Function, default: () => {}},
  // 是否开启展示 logo 图片
  enableLogoImage: {type: Boolean, default: true},
  // logo 图片大小
  logoImageSize: {type: String, default: '3rem'},
  // logo 图片 url
  logoImageUrl: {type: String, default: ''},
  // 是否开启展示 logo 文本
  enableLogoText: {type: Boolean, default: true},
  // logo 文本
  logoText: {type: String, default: ''},
})

组件使用示例

html 复制代码
<TailLogo
    :enable-logo-image="true"
    :logo-image-url="'/images/logo.png'"
    :logo-text="'小尾巴书城'"
></TailLogo>


组件源码

html 复制代码
<script setup>
import {stringIsNull} from "@/utils/string_utils.js"

/**
 * 获取环境变量
 * @type {ImportMetaEnv}
 */
const env = import.meta.env
const LOGO_IMAGE_URL = env?.VITE_LOGO_IMAGE_URL // logo 图片 url
const LOGO_TEXT = env?.VITE_LOGO_TEXT // logo text

/**
 * 接收组件传递参数
 */
const props = defineProps({
  // logo 组件点击事件处理函数
  logoClickHandler: {type: Function, default: () => {}},
  // 是否开启展示 logo 图片
  enableLogoImage: {type: Boolean, default: true},
  // logo 图片大小
  logoImageSize: {type: String, default: '3rem'},
  // logo 图片 url
  logoImageUrl: {type: String, default: ''},
  // 是否开启展示 logo 文本
  enableLogoText: {type: Boolean, default: true},
  // logo 文本
  logoText: {type: String, default: ''},
})
</script>

<template>
  <!-- 小尾巴 Logo 组件 -->
  <div class="tail-logo-box" @click="logoClickHandler">
    <!-- logoImageUrl 不为空则使用 logoImageUrl,否则使用 LOGO_IMAGE_URL(环境变量) -->
    <img
        v-if="enableLogoImage"
        :src="stringIsNull(logoImageUrl) ? LOGO_IMAGE_URL : logoImageUrl"
        alt="logo"
        :style="{height: logoImageSize}"
    />
    <!-- logoText 不为空则显示,否则显示 LOGO_TEXT(环境变量) -->
    <span v-if="enableLogoText">
      {{ stringIsNull(logoText) ? LOGO_TEXT : logoText }}
    </span>
  </div>
</template>

<style scoped lang="scss">
/*
 * 小尾巴 logo 组件
 */
.tail-logo-box {
  background-color: var(--tail-logo-bgc);
  cursor: pointer;
  display: flex;
  justify-content: center;
  align-items: center;

  /*
   * logo 图片
   */
  img {
    margin-right: 0.5rem;
  }

  /*
   * logo 文本
   */
  span {
    font-family: var(--tail-logo-text-font-family); // 锐字太空混元像素简繁-闪 超黑 字体
    font-size: 2rem;
    white-space: nowrap;
    color: var(--tail-logo-text-font-color);
  }
}
</style>
相关推荐
谭光志8 小时前
Vibe Coding 时代,程序员该何去何从
前端·后端·ai编程
仿生狮子10 小时前
别再说“全栈”了,AI 时代团队只认这 5 种人
前端·人工智能·后端
kyriewen10 小时前
AI 写的 React 组件,合并前必查的 6 个坏味道——每个都有代码对比
前端·javascript·react.js
Highcharts.js10 小时前
软件开发公司为什么选择 Highcharts?
前端·前端框架·echarts·数据可视化·技术选型·highcharts·图表工具
多加点辣也没关系10 小时前
JavaScript|第13章:原始类型的方法
开发语言·javascript·ecmascript
এ慕ོ冬℘゜10 小时前
深入理解 JavaScript 事件体系:Window、鼠标与键盘事件详解
开发语言·javascript·okhttp
阿祖zu10 小时前
企业 AI 转型之痛,个人提效十倍不止,组织效率仍止步不前?
前端·aigc·agent
摇滚侠12 小时前
SpringBoot3+Vue3 全套视频教程 45-51
前端·javascript·vue.js
酸梅果茶12 小时前
【6】lightning_lm项目-LIO 前端 -点云预处理模块
前端·slam
触底反弹12 小时前
🔥 RAG 到底是怎么工作的?掰开揉碎了给你讲明白!
javascript·人工智能·后端