您现在的位置是:网站首页> 编程资料编程资料
利用React实现一个有点意思的电梯小程序_React_
2023-05-24
400人已围观
简介 利用React实现一个有点意思的电梯小程序_React_
查看效果
我们先来看一下今天要实现的示例的效果,如下所示

好,接下来我们也看到了这个示例的效果,让我们进入正题,开始愉快的编码吧。
技术栈介绍
这个小程序,我们将采用React + typescript + css in js语法编写,并且采用最新比较流行的工具vite来构建。
初始化项目
我们可以选择在电脑按住shift,然后右键,选择powershell,也就是默认的系统终端。然后输入命令:
mkdir react-elevator
创建一个目录,创建好之后,接着我们在vscode中打开这个目录,打开之后,在vscode中打开终端,输入以下命令:
npm init vite@latest react-elevator -- --template react-ts
注意在命令界面,我们要选择react,react-ts。初始化项目好了之后,我们在输入命令:
cd react-elevator npm install npm run dev
查看一下我们初始化项目是否成功。
特别声明: 请注意安装了node.js和npm工具
css in js
可以看到,我们的项目初始化已经完成,好,接下来,我们还要额外的装一些项目当中遇到的依赖,例如css in js,我们需要安装@emotion/styled,@emotion/react依赖。继续输入命令:
npm install @emotion/styled @emotion/react --save-dev
安装好之后,我们在项目里面使用一下该语法。
首先引入styled,如下:
import styled from "@emotion/styled"
接着创建一个样式组件,css in js实际上就是把每个组件当成一个样式组件,我们可以通过styled后面跟html标签名,然后再跟模板字符串,结构如下:
const <组件名> = styled.` //这里写样式代码 `
例如:
const Link = styled.a` color:#fff; `
以上代码就是写一个字体颜色为白色的超链接组件,然后我们就可以在jsx当中直接写link组件。如下所示:
这是一个超链接组件
当然emotion还支持对象写法,但是我们这里基本上只用模板字符串语法就够了。
接下来步入正题,我们首先删除初始化的一些代码,因为我们没有必要用到。
分析程序的结构
好删除之后,我们接下来看一下我们要实现的电梯小程序的结构:
1.电梯井(也就是电梯上升或者下降的地方)
2.电梯
3.电梯门(分为左右门)
4.楼层
- 4.1 楼层数
- 4.2 楼层按钮(包含上升和下降按钮)
结构好了之后,接下来我们来看看有哪些功能:
- 点击楼层,催动电梯上升或者下降
- 电梯到达对应楼层,电梯左右门打开
- 门打开之后,里面的美女就出来啦
- 按钮会有一个点击选中的效果
我们先来分析结构,根据以上的拆分,我们可以大致将整个小程序分成如下几个组件:
1.楼房(容器组件)
2.电梯井组件
2.1 电梯组件
2.1.1 电梯左边的门
2.1.1 电梯右边的门
3.楼层组件
3.1 楼层控制组件
3.1.1 楼层上升按钮组件
3.1.2 楼层下降按钮组件
3.2 楼层数组件
我们先来写好组件和样式,然后再完成功能。
楼房组件
首先是我们的楼房组件,我们新建一个components目录,再新建一个ElevatorBuild.tsx组件,里面写上如下代码:
import styled from "@emotion/styled" const StyleBuild = styled.div` width: 350px; max-width: 100%; min-height: 500px; border: 6px solid var(--elevatorBorderColor--); overflow: hidden; display: flex; margin: 3vh auto; ` const ElevatorBuild = () => { return ( ) } export default ElevatorBuild这样,我们的一个楼房组件就算是完成了,然后我们在App.tsx当中引入,并使用它:
//这里是新增的代码 import ElevatorBuild from "./components/ElevatorBuild" const App = () => ({/*这里是新增的代码 */}) export default App
全局样式
在这里,我们定义了全局css变量样式,因此在当前目录下创建global.css,并在main.tsx中引入,然后在该样式文件中写上如下代码:
:root { --elevatorBorderColor--: rgba(0,0,0.85); --elevatorBtnBgColor--: #fff; --elevatorBtnBgDisabledColor--: #898989; --elevatorBtnDisabledColor--: #c2c3c4; } * { margin: 0; padding: 0; box-sizing: border-box; }电梯井组件
接下来,让我们继续完成电梯井组件,同样在components目录下新建一个ElevatorShaft.tsx组件,里面写上如下代码:
import styled from "@emotion/styled" const StyleShaft = styled.div` width: 200px; position: relative; border-right: 2px solid var(--elevatorBorderColor--); padding: 1px; ` const ElevatorShaft = () => { return ( ) } export default ElevatorShaft然后我们在楼房组件中引入并使用它,如下所示:
import styled from "@emotion/styled" //这里是新增的代码 import ElevatorShaft from "./ElevatorShaft" const StyleBuild = styled.div` width: 350px; max-width: 100%; min-height: 500px; border: 6px solid var(--elevatorBorderColor--); overflow: hidden; display: flex; margin: 3vh auto; ` const ElevatorBuild = () => { return ( {/*这里是新增的代码 */} ) } export default ElevatorBuild电梯门组件
接着我们来完成电梯门组件,我们可以看到电梯门组件有一些公共的样式部分,所以我们可以抽取出来,新建一个Door.tsx,写上如下代码:
import styled from '@emotion/styled'; const StyleDoor = styled.div` width:50%; position: absolute; top: 0; height: 100%; background-color: var(--elevatorBorderColor--); border: 1px solid var(--elevatorBtnBgColor--); `; const StyleLeftDoor = styled(StyleDoor)` left: 0; `; const StyleRightDoor = styled(StyleDoor)` right: 0; `; export { StyleLeftDoor,StyleRightDoor }由于我们功能会需要设置这两个组件的样式,并且我们这个样式是设置在style属性上的,因此我们可以通过props来传递,现在我们先写好typescript接口类,创建一个type目录,新建style.d.ts全局接口文件,并写上如下代码:
export interface StyleProps { style: CSSProperties }电梯组件
接下来,我们就可以开始写电梯组件,如下所示:
import styled from "@emotion/styled" const StyleElevator = styled.div` height: 98px; background: url("https://www.eveningwater.com/my-web-projects/js/26/img/6.jpg") center / cover no-repeat; border: 1px solid var(--elevatorBorderColor--); width: calc(100% - 2px); padding: 1px; transition-timing-function: ease-in-out; position: absolute; left: 1px; bottom: 1px; ` const Elevator = (props: Partial) => { return ( ) } export default Elevator 接下来,我们来看两个电梯门组件,首先是左边的门,如下所示:
import { StyleProps } from "../type/style" import { StyleLeftDoor } from "./Door" const ElevatorLeftDoor = (props: Partial) => { const { style } = props return ( ) } export default ElevatorLeftDoor Partial是一个泛型,传入接口,代表将接口的每个属性变成可选属性,根据这个原理,我们可以得知右边门的组件代码也很类似。如下:
import { StyleProps } from '../type/style'; import { StyleRightDoor } from './Door' const ElevatorRightDoor = (props: Partial) => { const { style } = props; return ( ) } export default ElevatorRightDoor; 这两个组件写好之后,我们接下来要在电梯组件里引入并使用它们,由于功能逻辑会需要设置样式,因此,我们通过props再次传递style。如下所示:
import styled from "@emotion/styled" import { StyleProps } from "../type/style"; import ElevatorLeftDoor from "./ElevatorLeftDoor" import ElevatorRightDoor from "./ElevatorRightDoor" const StyleElevator = styled.div` height: 98px; background: url("https://www.eveningwater.com/my-web-projects/js/26/img/6.jpg") center / cover no-repeat; border: 1px solid var(--elevatorBorderColor--); width: calc(100% - 2px); padding: 1px; transition-timing-function: ease-in-out; position: absolute; left: 1px; bottom: 1px; ` export interface ElevatorProps { leftDoorStyle: StyleProps['style']; rightDoorStyle: StyleProps['style']; } const Elevator = (props: Partial) => { const { leftDoorStyle,rightDoorStyle } = props; return ( ) } export default Elevator 完成了电梯组件之后,接下来我们在电梯井组件里面引入电梯组件,注意这里后续逻辑我们会设置电梯组件和电梯门组件的样式,因此在电梯井组件中,我们需要通过props传递样式。
import styled from "@emotion/styled" import { StyleProps } from "../type/style"; import Elevator from "./Elevator" const StyleShaft = styled.div` width: 200px; position: relative; border-right: 2px solid var(--elevatorBorderColor--); padding: 1px; ` export interface ElevatorProps { leftDoorStyle: StyleProps['style']; rightDoorStyle: StyleProps['style']; elevatorStyle: StyleProps['style']; } const ElevatorShaft = (props: Partial) => { const { leftDoorStyle,rightDoorStyle,elevatorStyle } = props; return ( ) } export default ElevatorShaft 电梯门组件的开启动画
我们可以看到,当到达一定时间,电梯门会有开启动画,这里我们显然没有加上,所以我们可以为电梯门各自加一个是否开启的props用来传递,继续修改Door.tsx如下:
import styled from '@emotion/styled'; const StyleDoor = styled.div` width:50%; position: absolute; top: 0; height: 100%; background-color: var(--elevatorBorderColor--); border: 1
相关内容
- el-table 行合并的实现示例_vue.js_
- JSON.stringify(递归)与 JSON.parse(有限状态自动机)的实现代码_javascript技巧_
- el-form错误提示信息手动添加和取消的示例代码_vue.js_
- 利用JavaScript实现防抖节流函数的示例代码_javascript技巧_
- 使用 JS 复制页面内容的三种方案_JavaScript_
- vue3中h函数的常用使用方式汇总_vue.js_
- npm报错:npm WARN config global '--global', '--local' are deprecated解决_node.js_
- Vue生命周期深入分析总结_vue.js_
- Vue环境搭建报错整理大全_vue.js_
- element tree懒加载:load="loadNode"只触发一次的解决方案_vue.js_
点击排行
本栏推荐
