[自定义 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.css、src/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>
相关推荐
跨境数据猎手10 小时前
跨境电商系统三大 Web 漏洞的防护:SQL 注入、XSS、CSRF
前端·sql·xss
冒险的豆子10 小时前
Proxy & Vue 响应式(合并精简版,适合面试)
前端·javascript·vue.js
Java后端的Ai之路11 小时前
前端技术Vue-18-视图中的渲染
前端·javascript·vue.js
程序员海军17 小时前
用了两年多 GPT,我最近开始换模型了,还折腾了个求职避坑 Agent
前端·人工智能·后端
zttbee18 小时前
echarts图表tooltip色块失效
前端·javascript·echarts
excel19 小时前
IndexNow:让搜索引擎更快发现网站更新的主动通知协议
前端·后端·架构
子兮曰19 小时前
CSS 复现 23 种设计风格:从拟物到液态玻璃的成本阶梯与兜底写法【实战】
前端·css·视觉设计
虚无境20 小时前
如何用AI帮我写出实用的插件
前端·javascript·ai编程
柳杉20 小时前
从数字化到数智化:3D 可视化大屏的下一个五年
前端·ai编程·数据可视化
濮水大叔21 小时前
函数式与对象式:前端架构的两种成本曲线
vue.js·react.js·函数式编程