返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue 实现新国标红绿灯效果实例详解
  • 202
分享到

Vue 实现新国标红绿灯效果实例详解

2024-04-02 19:04:59 202人浏览 薄情痞子
摘要

目录引言1 组件分析1.1 lamp1.2 lamp-group1.3 traffic-lamp2 全局文件定义2.1 样式变量2.2 常量定义2.3 导入资源3 组件开发3.1 实

引言

昨天刷视频,都是关于新国标红绿灯的,看大家议论纷纷,下班就用150行代码通过Vue组件实践红绿模拟演示,视频也跟大家展示过了。今天接着更新图文版本,大家跟着优雅哥通过该案例实操模拟一下。

不过新国标红绿灯的设计,这个专业性、逻辑性、艺术性就是厉害,三个方向 * 三种颜色,玩转九宫格。

大部分场景都可以不加思考就知道应该通行或者等待,只有某些情况下对应行驶方向的灯不亮时,才需要 if ... else ... 判断。优雅哥比较脑残,无论哪个方向:左转、直行、右转,如果灯都亮着,不就可以一眼看出能否通行了吗,对应方向红灯就停、绿灯就通行,这样是不是就可以不需要思考了?或许专家是为了省电吧,三个方向都亮灯太费电了。 后面得知,关于新国标红绿灯信息是误传,以上说辞纯属个人当时根据信息的一些看法,请大家不要误以为真。

现在来说说作为程序员,咱就用 vue3 来模拟新国标红绿灯玩一玩。

1 组件分析

组件化开发是我们一贯的风格。如何进行这个红绿灯组件的设计呢?

从上图可以看出我对新国标红绿灯的组件拆分。

1.1 lamp

lamp 代表每个灯,在上图中一共有9个灯,分别是左转三个颜色的灯、直行三个颜色的灯、右转三个颜色的灯。这 9 个灯的区别是颜色和内部的箭头,而内部的箭头与车辆行驶方向(左转、右转、直行)有关,故颜色和方向可定义为属性,由外部传递。

1.2 lamp-group

图中一共有三个 lamp-group,每个行驶方向的三个颜色的灯组成一个 lamp-group。同样的,lamp-group 有一个属性为方向,该属性表示左转、直行或右转。此外,每个 lamp-group 中最多只有一个灯亮,故可以定义一个属性为状态,表示这个 lamp-group 中哪个灯亮、或者都不亮。

1.3 traffic-lamp

traffic-lamp 表示整个新国标红绿灯。有三个 lamp-group 组成。整个红绿灯也需要一个状态属性,描述三个方向的 lamp-group 的状态。

2 全局文件定义

2.1 样式变量

在 src/assets/ 中创建目录 sCSS,并在该目录下创建样式变量文件 traffic-lamp-common.scss,在该文件中定义红黄绿颜色、间距等常见样式,便于全局保持一致。由于咱 demo 较小,将 scss 变量与通用样式定义在一起就可以了,如果在正式开发中,要遵守 CSS 架构规范,无论是 ITCSS 还是 SMacSS。

src/assets/scss/traffic-lamp-common.scss:

$red: #e42621;
$yellow: #eecd48;
$green: #59e02e;
$commonPadding: 10px;
$commonMargin: 10px;
$lampSize: 80px;
$radius: 8px;
.red {
  color: $red !important;
}
.yellow {
  color: $yellow !important;
}
.green {
  color: $green !important;
}
.bg-red {
  background-color: $red !important;
}
.bg-yellow {
  background-color: $yellow !important;
}
.bg-green {
  background-color: $green !important;
}

2.2 常量定义

创建 src/common/traffic-lamp-common.ts,在该文件中定义两个枚举类,分别是行驶方向(左、直、右)和灯的状态,O - off 表示灯不亮。

export enum Direction {
  L = 'left',
  C = 'center',
  R = 'right'
}
export enum Status {
  R = 'red',
  Y = 'yellow',
  G = 'green',
  O = 'off'
}

2.3 导入资源

由于灯里面有左箭头、右箭头两个图标,故从 iconfont 上搜索并下载这两个图标,优雅哥采用 iconfont 的方式使用图标,资源文件位于 src/assets/iconfont 下。在 main.ts 中引入iconfont:

import '@/assets/iconfont/iconfont.css'

3 组件开发

在 src/components 目录下创建目录 traffic-lamp,上面分析的三个组件就在该目录下开发。

3.1 实现 lamp 组件

lamp.vue

<template>
  <div class="lamp" :class="colorClass">
    <span v-if="direction === Direction.L" class="iconfont icon-left"></span>
    <span v-if="direction === Direction.R" class="iconfont icon-right"></span>
  </div>
</template>
<script lang="ts" setup>
import { computed, defineProps, PropType } from 'vue'
import { Direction, Status } from '@/common/traffic-lamp-common'
const props = defineProps({
  direction: {
    type: String as PropType<Direction>,
    required: true
  },
  color: {
    type: String as PropType<Status>,
    required: false,
    default: Status.O
  }
})
const colorClass = computed(() => {
  if (!props.color) {
    return ''
  }
  return `${props.direction}` === Direction.C ? `bg-${props.color}` : props.color
})
</script>
<style scoped lang="scss">
@import "~@/assets/scss/traffic-lamp-common.scss";
.lamp {
  width: $lampSize;
  height: $lampSize;
  line-height: $lampSize;
  background-color: #0e0e0e;
  margin: 5px;
  border-radius: 50%;
  text-align: center;
  color: gray;
  .iconfont {
    font-size: $lampSize - 10px;
    font-weight: bolder;
  }
}
</style>

可以在测试页面测试:

<lamp direction="left" color="green"></lamp>

3.2 实现 lamp-group 组件

lamp-group 组件中容纳了三个 lamp,分别是红灯、黄灯、绿灯。

lamp-group.vue

<template>
  <div class="lamp-group" :class="{
    'radius-left': direction === Direction.L,
    'radius-right': direction === Direction.R}">
    <div class="wrapper">
      <lamp :direction="direction" :color="status === Status.R ? status : Status.O" />
      <lamp :direction="direction" :color="status === Status.Y ? status : Status.O" />
      <lamp :direction="direction" :color="status === Status.G ? status : Status.O" />
    </div>
  </div>
</template>
<script lang="ts" setup>
import { defineProps, PropType } from 'vue'
import Lamp from './lamp.vue'
import { Direction, Status } from '@/common/traffic-lamp-common'
defineProps({
  direction: {
    type: String as PropType<Direction>,
    required: true
  },
  status: {
    type: String as PropType<Status>,
    required: false,
    default: Status.O
  }
})
</script>
<style scoped lang="scss">
@import "~@/assets/scss/traffic-lamp-common.scss";
.lamp-group {
  background-color: #777;
  margin: 0 10px;
  padding: 10px;
  .wrapper {
    background-color: #5d5d5d;
    padding:5px;
  }
}
.radius-left {
  border-radius: $radius 0 0 $radius;
}
.radius-right {
  border-radius: 0 $radius $radius 0;
}
</style>

可以在测试页面测试该组件:

<lamp-group direction="right" status="green" />

3.3 实现 traffic-lamp 组件

traffic-lamp 组件容纳三个 lamp-group,分别代表左转、直行、右转。其中属性 status 要代表三个 group 的状态,父组件在使用时可以用逗号分隔。在设计的时候,也可以将状态拆分为三个属性,每个方向对应一个状态。

traffic-lamp.vue

<template>
  <div class="traffic-lamp">
    <lamp-group :direction="Direction.L" :status="statusList[0] || Status.O" />
    <lamp-group :direction="Direction.C" :status="statusList[1] || Status.O" />
    <lamp-group :direction="Direction.R" :status="statusList[2] || Status.O" />
  </div>
</template>
<script lang="ts" setup>
import { computed, defineProps } from 'vue'
import LampGroup from './lamp-group.vue'
import { Status, Direction } from '@/common/traffic-lamp-common'
const props = defineProps({
  status: {
    type: String,
    required: false,
    default: ''
  }
})
const statusList = computed(() => {
  const list = props.status.split(',')
  const remain = 3 - list.length
  for (let i = 0; i < remain; i++) {
    list.push(Status.O)
  }
  return list
})
</script>
<style scoped lang="scss">
.traffic-lamp {
  display: flex;
}
</style>

可以在测试页面测试该组件:

<traffic-lamp status="red,red"></traffic-lamp>

4 附加功能

到这里为止,交通灯功能就模拟实现完成了,切换交通灯红绿灯状态时,只需要改变 status 即可。

现在咱额外新增一个功能,新国标有 8 种状态,咱就让这 8 种状态自动切换。

下列所有代码都编写在测试页面中。在测试页面中使用 traffic-lamp 组件。

4.1 状态数组

在测试页面中定义 8 种状态列表:

const { R, G, O } = Status
const statusList = [
  `${R},${R},${R}`,
  `${R},${R},${O}`,
  `${G},${R},${R}`,
  `${O},${R},${O}`,
  `${R},${G},${R}`,
  `${O},${G},${R}`,
  `${R},${G},${O}`,
  `${O},${G},${O}`
]

4.2 定义索引

在测试页面中定义遍历状态列表的索引:

const currentIndexRef = ref(0)
const currentStatus = computed(() => statusList[currentIndexRef.value])

在模板中动态设置 traffic-lamp 的 status 属性:

<traffic-lamp :status="currentStatus"></traffic-lamp>

4.3 自动切换

在测试页面 onMounted 生命周期函数中,定时修改索引 currentIndexRef 的值,从而实现红绿灯的自动切换:

onMounted(() => {
  setInterval(() => {
    currentIndexRef.value += 1
    currentIndexRef.value = currentIndexRef.value % statusList.length
  }, 1000)
})

4.4 文字描述

可以在红绿灯下面添加是否可以通行的文字描述。

模板:

<traffic-lamp :status="currentStatus"></traffic-lamp>
<div class="display">
  <div :class="left">{{getText(left)}}</div>
  <div :class="center">{{getText(center)}}</div>
  <div :class="right">{{getText(right)}}</div>
</div>

TS 代码:

const left = computed(() => {
  const list = currentStatus.value.split(',')
  return list[0] === Status.O ? list[1] : list[0]
})
const center = computed(() => {
  return currentStatus.value.split(',')[1] || Status.O
})
const right = computed(() => {
  const list = currentStatus.value.split(',')
  return list[2] === Status.R ? Status.R : Status.G
})
const getText = (status: string) => {
  if (status === Status.G) {
    return '可以通行'
  }
  if (status === Status.R) {
    return '停车等待'
  }
  return ''
}

样式:

<style scoped lang="scss">
@import "~@/assets/scss/traffic-lamp-common.scss";
.display {
  width: 420px;
  display: flex;
  margin-top: 10px;
  div {
    flex: 1;
    text-align: center;
  }
}
</style>

运行如下:

以上就是Vue 实现新国标红绿灯效果实例详解的详细内容,更多关于Vue 新国标红绿灯的资料请关注编程网其它相关文章!

--结束END--

本文标题: Vue 实现新国标红绿灯效果实例详解

本文链接: https://lsjlt.com/news/166012.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Vue 实现新国标红绿灯效果实例详解
    目录引言1 组件分析1.1 lamp1.2 lamp-group1.3 traffic-lamp2 全局文件定义2.1 样式变量2.2 常量定义2.3 导入资源3 组件开发3.1 实...
    99+
    2024-04-02
  • 纯CSS如何实现红绿灯效果
    这篇文章主要介绍纯CSS如何实现红绿灯效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、下面的代码输出的内容是什么?function O(name){    th...
    99+
    2023-06-08
  • JS面试异步模拟红绿灯实现详解
    目录引言问题拆解代码设计引言 异步的问题是程序员绕不开的话题,无论在实际开发上还是在面试中,我们总会遇到各种头疼的问题,但是细细品味,其实这些问题总能拓展我们的思路,激发我们的思维能...
    99+
    2023-01-10
    JS面试异步模拟红绿灯 JS 异步面试
  • Vue实现列表跑马灯效果
    本文实例为大家分享了Vue实现列表跑马灯效果的具体代码,供大家参考,具体内容如下 Vue文件中: <ul class="GZDT_list clearfix active" @...
    99+
    2024-04-02
  • Vue实现简易跑马灯效果
    本文实例为大家分享了Vue实现跑马灯效果的具体代码,供大家参考,具体内容如下 一个简单的跑马灯效果,就是如下这种效果 Vue跑马灯效果: 1.分析 a.点击"加油&quo...
    99+
    2024-04-02
  • Vue如何实现跑马灯效果
    这篇文章主要介绍Vue如何实现跑马灯效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!跑马灯效果说明:单击"应援"按钮文字向左飘动,再单击"暂停"按钮停止当前飘动完整代码 (注...
    99+
    2023-06-25
  • Vue实现跑马灯简单效果
    本文实例为大家分享了Vue实现跑马灯简单效果的具体代码,供大家参考,具体内容如下 1、跑马灯效果 说明:单击"应援"按钮文字向左飘动,再单击"暂停"按钮停止当前飘动 2、完整代码...
    99+
    2024-04-02
  • vue+animation动画实现跑马灯效果
    本文实例为大家分享了vue+animation动画实现跑马灯效果的具体代码,供大家参考,具体内容如下 1、单行显示,每行只显示一条 效果图 上代码 <template>...
    99+
    2024-04-02
  • vue+animation怎么实现跑马灯效果
    这篇文章主要讲解了“vue+animation怎么实现跑马灯效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue+animation怎么实现跑马灯效果”吧!1、单行显示,每行只显示一条效...
    99+
    2023-06-29
  • vue实现简单的跑马灯效果
    本文实例为大家分享了vue实现简单跑马灯效果的具体代码,供大家参考,具体内容如下 效果图 代码 html <div id="app"> <button...
    99+
    2024-04-02
  • vue实现无缝轮播效果(跑马灯)
    本文实例为大家分享了vue实现无缝轮播效果的具体代码,供大家参考,具体内容如下 1.首先创建两个vue组件Sweiper.vue和SweiperItem.vue; 2.将两个组件引入...
    99+
    2024-04-02
  • Vue如何实现列表跑马灯效果
    这篇文章主要介绍了Vue如何实现列表跑马灯效果的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue如何实现列表跑马灯效果文章都会有所收获,下面我们一起来看看吧。Vue文件中:<ul class=...
    99+
    2023-06-30
  • Vue如何实现简易跑马灯效果
    本文小编为大家详细介绍“Vue如何实现简易跑马灯效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue如何实现简易跑马灯效果”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Vue跑马灯效果:1.分析a.点击&q...
    99+
    2023-06-30
  • vue实现书本翻页动画效果实例详解
    偶然兴起,想要用vue来做一个书本的组件,有了这个想法后边开始动手,先简单地实现基本的效果,为后续封装为组件进行准备工作,实现该效果的要使用vue + css + JavaScri...
    99+
    2024-04-02
  • Android基于TextView实现的跑马灯效果实例
    本文实例讲述了Android基于TextView实现的跑马灯效果。分享给大家供大家参考,具体如下: package sweet.venst.act; import java....
    99+
    2022-06-06
    跑马灯 Android
  • 微信小程序实现走马灯效果实例
    前言 日常开发中,我们经常会遇到文字横向循环滚动的效果,俗称走马灯,也是项目中经常会使用的一个功能。在网页web前端很常见,今天就介绍下小程序的实现方式,一种是用的css样式实现,另...
    99+
    2024-04-02
  • jquery实现走马灯特效实例(扑克牌切换效果)
    话不多说,先上大致效果: 本着程序员的开源精神,代码奉上: html代码: <div class="main-box"> <div class="poke...
    99+
    2024-04-02
  • Unity实现跑马灯效果的示例代码
    目录一、效果二、需要动画插件DOTween三、脚本1.每个格子上的脚本文件2.管理脚本文件一、效果 二、需要动画插件DOTween 下载地址 三、脚本 1.每个格子上的脚本文件 u...
    99+
    2024-04-02
  • C#实现跑马灯效果的示例代码
    目录文章描述开发环境开发工具实现代码实现效果文章描述 跑马灯效果,功能效果大家应该都知道,就是当我们的文字过长,整个页面放不下的时候(一般用于公告等),可以让它自动实现来回滚动,以让...
    99+
    2022-11-13
    C#实现跑马灯效果 C# 跑马灯
  • vue实现鼠标悬浮框效果
    本文实例为大家分享了vue实现鼠标悬浮框效果的具体代码,供大家参考,具体内容如下 效果: html: <div   @mouseenter="enter"    @mouse...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作