php 影院选座js代码,在react中用canvas做一个电影院选座功能
又到了每日分享了。这次分享的是:在react中用canvas做一个电影院选座功能。
前言:项目采用create-react-app脚手架,就是做了一个效果所以只有一个页面但是也用了react-router-dom路由把details作为path=’/'首页了。
效果图:
20191008150425.jpg
一、App.js
import React from 'react';
import {BrowserRouter,Route} from 'react-router-dom'
import Details from './routes/Details'
function App() {
return (
);
}
export default App;
这是入口文件的代码内容
二、Details.jsx
import React,{Component} from 'react';
import './Details.css';
import Footer from './Footer';
import SeatSelector from './SeatSelector'
class Details extends Component {
state = {
selectSeat:[]
}
addSeat = (seat)=>{
this.setState(prevState=>({
selectSeat:[...prevState.selectSeat,seat]
}))
}
removeSeat = (id)=>{
this.setState({
selectSeat:this.state.selectSeat.filter(seat=>seat.id !== id)
})
}
render() {
const {selectSeat} = this.state;
return (
决战时刻
今天 09-21 15:40~18:00 (国语 2D)
);
}
}
export default Details;
这是效果的首页的东西了,分为3个部分(头部,中间canvas部分,底部),头部基本随便写,底部有一个选座显示几排几座的效果,主要是中间部分
三、SeatSelector.jsx
import React,{Component} from 'react';
import {data} from './mock/data.json';
const SET_WIDTH = 50;
const SET_HEIGHT = 50;
const lastSeat = data[data.length-1];
const canvas_width = lastSeat.x*SET_WIDTH;
const canvas_height = lastSeat.y*SET_HEIGHT;
class Details extends Component {
componentDidMount(){
this.ctx = this.refs.canvas.getContext('2d');
const emptyImg = new Image();
const selectImg = new Image();
const soldImg = new Image();
let count = 0;
const loadCallback = ()=>{
count++;
if(count===3){
this.emptyImg = emptyImg;
this.selectImg = selectImg;
this.soldImg = soldImg;
this.drawSeat();
}
}
emptyImg.onload = loadCallback;
selectImg.onload = loadCallback;
soldImg.onload = loadCallback;
emptyImg.src = './empty.png';
selectImg.src = './select.jpg';
soldImg.src = './sold.jpg';
}
componentDidUpdate(){
this.ctx.clearRect(0,0,canvas_width,canvas_height)
this.drawSeat();
this.drawSelectSeat();
}
drawSeat(){
const seatData = data;
seatData.forEach((item,index)=>{
const {isSold,x,y} = item;
const offsetLeft = (x-1)*SET_WIDTH;
const offsetTop = (y-1)*SET_WIDTH;
if(isSold){
this.ctx.drawImage(this.soldImg,offsetLeft,offsetTop,SET_WIDTH,SET_HEIGHT);
}else{
this.ctx.drawImage(this.emptyImg,offsetLeft,offsetTop,SET_WIDTH,SET_HEIGHT);
}
})
}
drawSelectSeat = ()=>{
const {selected} = this.props;
selected.forEach((item,index)=>{
const {isSold,x,y} = item;
const offsetLeft = (x-1)*SET_WIDTH;
const offsetTop = (y-1)*SET_WIDTH;
this.ctx.drawImage(this.selectImg,offsetLeft,offsetTop,SET_WIDTH,SET_HEIGHT);
})
}
clickSeat = (e)=>{
let offset = this.refs.canvas.getBoundingClientRect()
let pageX = e.pageX - offset.left;
let pageY = e.pageY - offset.top;
let xPos = Math.ceil(pageX/SET_WIDTH);
let yPos = Math.ceil(pageY/SET_HEIGHT);
let seat = data.find(seat=>seat.x===xPos && seat.y===yPos);
if( seat.isSold ){
return ;
}
const selectIndex = this.props.selected.findIndex(item=>item.id === seat.id);
if(selectIndex>-1){
this.props.onRemove(seat.id);
}else{
if(this.props.selected.length >= 6){
alert("不能超过6个");
}else{
this.props.onAdd(seat);
}
}
}
render() {
return (
);
}
}
export default Details;
这是中间canvas比较重要的一块了,大家可以看看代码了
四、Footer.jsx
import React from 'react';
import './footer.css';
const Footer = ({data,onRemove}) => {
return (
{
data.map(seat=>(
onRemove(seat.id)}>
{seat.y}排{seat.x}座
42.7元
))
}
)
}
export default Footer;
php 影院选座js代码,在react中用canvas做一个电影院选座功能相关推荐
- 做一个电影院选座功能-前端
项目采用create-react-app脚手架,就是做了一个效果所以只有一个页面但是也用了react-router-dom路由把details作为path='/'首页了. 一.App.js impor ...
- Ajax (部分二:prototype.js代码后半部分)自己做的,总结页面向后台传Form值、单个值和后台向前台传一个或是一组值...
2019独角兽企业重金招聘Python工程师标准>>> Ajax (部分二:prototype.js代码后半部分)自己做的,总结页面向后台传Form值.单个值和后台向前台传一个或是一 ...
- Java----使用二维数组完成一个电影院选座系统
用Java的二维数组来完成模拟一个电影院选座系统 模拟座位 这里先定义一个二维数组,用来模拟电影院的座位 public class ChooseSeat{public static void main ...
- 十行代码,我用Python做一个迷你版的美图秀秀!
美图秀秀相信大家都不陌生,大家只要操作美图秀秀,就可以P掉图片中脸上的一些瑕疵,让人变得更加的美丽.今天小编就带领大家来借助Python和Flask来实现一个美图秀秀的网页设计,大家只需要通过网页上传 ...
- 用python做我的世界代码_从零开始用Python做一个Minecraft成就(进度)生成器
最近看到mcmod百科上有个叫成就生成器的东西,于是也想用Python做一个. 大致思路: 一张成就图像,需要有底图,图标和和说明文字三个部分. 成就的图标比较难搞,我使用的是Minecraft Wi ...
- 吃豆人html代码原理,如何用HTML做一个吃豆人?
首先做一个项目的先想如何去实现它.比如做一个吃豆人,如图: 167b84dcbf0d3ed647b6b8c4abd75f92.jpg 首先,需要分析这个吃豆人的组成部分. 上半部分嘴,下半部分嘴,豆基 ...
- 编写js代码,实现根据系统时间显示问候语的功能,通过改变div中的内容,显示不同问候语
要求如下: 6点之前--凌晨好 9点之前--早上好 12点之前--上午好 14点之前--中午好 17点之前--下午好 19点之前--傍晚好 22点之前--晚上好 22点之后包括22点--夜里好 < ...
- 使用JS和Canvas做一个html5小游戏
这是一个很简单的html5游戏,通过学习原博文自己做了些改造, 现在附上原博文的链接 这是游戏的截图: 1.有计算抓住的怪物的数量 2.有背景,英雄,怪物. 第一步:建立html文件和js文件 建立一 ...
- js html显示emoji表情,canvas绘制一个常用的emoji表情
效果图: 代码如下: 装逼表情 *{ margin: 0; padding: 0; } body{ overflow:hidden; } canvas{ /*background: #000;*/ / ...
最新文章
- 微服务“大门”如何选择?
- 判断男人成熟度16个新标准。
- 深入理解HTTP协议、HTTP协议原理分析
- JavaScript AppendChild 引发的思考
- ABAP调试器脚本的一个具体应用
- JS引擎、运行时与调用栈概述
- 山东计算机类好的民办大学,2021年山东所有民办大学名单及排名(教育部)
- 安卓动态调试七种武器之离别钩 – Hooking(下)
- 如何在本站使用脚本格式的计数器--终于找到解决办法!
- win10 flashcs6不能用了_听说这版win10马上不能用了?那就改装“它”,比win7还稳定流畅...
- XSSFWorkbook 设置单元格样式_openpyxl3.0官方文档(25)—— 使用样式
- win10下装win7双系统_电脑安装双系统win7+win10,安装顺序不同,使用会有什么不同?...
- java 记账系统_案例分享用java开发实现一个记账系统(代码全)
- java小项目之:象棋,羡慕你们有对象的!
- Gabor滤波器学习
- 《Laravel-汉字转拼音》
- 助特朗普胜选、英国脱欧,深扒FB丑闻背后的神秘数据公司如何玩转人心
- java word文档生成目录_Java使用POI添加Word文档的目录(Table of contents)
- 什么是游戏美术设计?3D游戏建模常用的软件有哪些
- 往事如烟 - 老钟23