又到了每日分享了。这次分享的是:在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做一个电影院选座功能相关推荐

  1. 做一个电影院选座功能-前端

    项目采用create-react-app脚手架,就是做了一个效果所以只有一个页面但是也用了react-router-dom路由把details作为path='/'首页了. 一.App.js impor ...

  2. Ajax (部分二:prototype.js代码后半部分)自己做的,总结页面向后台传Form值、单个值和后台向前台传一个或是一组值...

    2019独角兽企业重金招聘Python工程师标准>>> Ajax (部分二:prototype.js代码后半部分)自己做的,总结页面向后台传Form值.单个值和后台向前台传一个或是一 ...

  3. Java----使用二维数组完成一个电影院选座系统

    用Java的二维数组来完成模拟一个电影院选座系统 模拟座位 这里先定义一个二维数组,用来模拟电影院的座位 public class ChooseSeat{public static void main ...

  4. 十行代码,我用Python做一个迷你版的美图秀秀!

    美图秀秀相信大家都不陌生,大家只要操作美图秀秀,就可以P掉图片中脸上的一些瑕疵,让人变得更加的美丽.今天小编就带领大家来借助Python和Flask来实现一个美图秀秀的网页设计,大家只需要通过网页上传 ...

  5. 用python做我的世界代码_从零开始用Python做一个Minecraft成就(进度)生成器

    最近看到mcmod百科上有个叫成就生成器的东西,于是也想用Python做一个. 大致思路: 一张成就图像,需要有底图,图标和和说明文字三个部分. 成就的图标比较难搞,我使用的是Minecraft Wi ...

  6. 吃豆人html代码原理,如何用HTML做一个吃豆人?

    首先做一个项目的先想如何去实现它.比如做一个吃豆人,如图: 167b84dcbf0d3ed647b6b8c4abd75f92.jpg 首先,需要分析这个吃豆人的组成部分. 上半部分嘴,下半部分嘴,豆基 ...

  7. 编写js代码,实现根据系统时间显示问候语的功能,通过改变div中的内容,显示不同问候语

    要求如下: 6点之前--凌晨好 9点之前--早上好 12点之前--上午好 14点之前--中午好 17点之前--下午好 19点之前--傍晚好 22点之前--晚上好 22点之后包括22点--夜里好 < ...

  8. 使用JS和Canvas做一个html5小游戏

    这是一个很简单的html5游戏,通过学习原博文自己做了些改造, 现在附上原博文的链接 这是游戏的截图: 1.有计算抓住的怪物的数量 2.有背景,英雄,怪物. 第一步:建立html文件和js文件 建立一 ...

  9. js html显示emoji表情,canvas绘制一个常用的emoji表情

    效果图: 代码如下: 装逼表情 *{ margin: 0; padding: 0; } body{ overflow:hidden; } canvas{ /*background: #000;*/ / ...

最新文章

  1. 微服务“大门”如何选择?
  2. 判断男人成熟度16个新标准。
  3. 深入理解HTTP协议、HTTP协议原理分析
  4. JavaScript AppendChild 引发的思考
  5. ABAP调试器脚本的一个具体应用
  6. JS引擎、运行时与调用栈概述
  7. 山东计算机类好的民办大学,2021年山东所有民办大学名单及排名(教育部)
  8. 安卓动态调试七种武器之离别钩 – Hooking(下)
  9. 如何在本站使用脚本格式的计数器--终于找到解决办法!
  10. win10 flashcs6不能用了_听说这版win10马上不能用了?那就改装“它”,比win7还稳定流畅...
  11. XSSFWorkbook 设置单元格样式_openpyxl3.0官方文档(25)—— 使用样式
  12. win10下装win7双系统_电脑安装双系统win7+win10,安装顺序不同,使用会有什么不同?...
  13. java 记账系统_案例分享用java开发实现一个记账系统(代码全)
  14. java小项目之:象棋,羡慕你们有对象的!
  15. Gabor滤波器学习
  16. 《Laravel-汉字转拼音》
  17. 助特朗普胜选、英国脱欧,深扒FB丑闻背后的神秘数据公司如何玩转人心
  18. java word文档生成目录_Java使用POI添加Word文档的目录(Table of contents)
  19. 什么是游戏美术设计?3D游戏建模常用的软件有哪些
  20. 往事如烟 - 老钟23

热门文章

  1. 小白的装机之旅之采购篇
  2. 企业网络推广专员浅析企业网络推广专业优化团队更靠谱!
  3. Entity Framework 学习
  4. 现代若干科学前沿的计算主义哲学蕴意
  5. 淘宝高管写给找工作的我们
  6. 忆2018,展2019
  7. js函数传参时:值传递和引用传递的区别
  8. 手机浏览器一键跳转微信公众号关注的方法
  9. MyBatis--SqlSession概述
  10. echarts4+bmap+vue2地图显示不出来