[自定义 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>
相关推荐
candyTong1 天前
一觉醒来,大模型就帮我排查完页面性能问题
前端·javascript·架构
魔术师Grace1 天前
我给 AI 做了场入职培训
前端·程序员
玩嵌入式的菜鸡1 天前
网页访问单片机设备---基于mqtt
前端·javascript·css
前端一小卒1 天前
我用 Claude Code 的 Superpowers 技能链写了个服务,部署前差点把服务器搞炸
前端·javascript·后端
滑雪的企鹅.1 天前
HTML头部元信息避坑指南大纲
前端·html
一拳不是超人1 天前
老婆天天吵吵要买塔罗牌,我直接用 AI 2 小时写了个在线塔罗牌
前端·ai编程
阿丰资源1 天前
SpringBoot+Vue实战:打造企业级在线文档管理系统
vue.js·spring boot·后端
excel1 天前
如何解决 Nuxt DevTools 中关于 unstorage 包的报错
前端
Rust研习社1 天前
使用 Axum 构建高性能异步 Web 服务
开发语言·前端·网络·后端·http·rust
C澒1 天前
AI 生码 - API2Code:接口智能匹配与 API 自动化生码全链路设计
前端·低代码·ai编程