在react中用canvas做一个电影院选座功能

在react中用canvas做一个电影院选座功能,第1张

又到了每日分享了。这次分享的是:在react中用canvas做一个**院选座功能。

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

一、选取 DOM 元素

在 jQuery 中,我们已经熟悉了使用 sizzle 选择器来完成 DOM 元素的选取。而在 React 中,我们可以使用 ref 来更有针对性的获取元素。

import React from 'react';class Demo extends ReactCompoent {

getDomNode() { return thisrefsroot; // 获取 Dom Node }

render() { return ( <div ref="root">just a

demo</div> ); }}

这是最简单的获取 node 的方式,如果有多层结构嵌套呢?没有关系。

import React from 'react';class Demo extends ReactCompoent {

getRootNode() { return thisrefsroot; // 获取根节点 Dom Node }

getLeafNode() { return thisrefsleaf; // 获取叶节点 Dom Node }

render() { return ( <div ref="root">

<div ref="leaf">just a demo</div>

</div> ); }}

如果是组件和组件嵌套呢?也没关系,父组件仍然可以拿到子组件的根节点。

import React from 'react';import ReactDOM from 'react-dom';class Sub

extends ReactCompoent { render() { return (

<div>a sub component</div> ); }}class Demo extends

ReactCompoent { getDomNode() { return thisrefsroot; // 获取

Dom Node } getSubNode() { return

ReactDOMfindDOMNode(thisrefssub); // 获取子组件根节点 } render() {

return ( <div ref="root"> <Sub

ref="sub" /> </div> ); }}

上面使用了比较易懂的 API 来解释 Ref 的用法,但里面包含了一些现在 React 不太推荐和即将废弃的方法,如果用 React 推荐的写法,我们可以这样写。

import React from 'react';import ReactDOM from 'react-dom';class Sub

extends ReactCompoent { getDomNode() { return thisrootNode;

} render() { return ( <div ref={(c) =>

thisrootNode = c}>a sub component</div> ); }}class

Demo extends ReactCompoent { getDomNode() { return

thisrootNode; // 获取 Dom Node } getSubNode() { return

thissubgetDomNode(); // 获取子组件根节点 } render() { return (

<div ref={(c) => thisrootNode = c}>

<Sub ref={(c) => thissub = c} /> </div>

); }}

有人可能会问,那子组件怎么拿父组件的 Dom Node 呢,从 React

的单向数据流角度出发,遇到这种情况我们应该通过回调通知给父组件,再由父组件自行判断如何修改 Node,其实父组件拿子组件的 Node

情况也很少,大多数情况下我们是通过 props 传递变化给子组件,获取子组件

Node,更多的情况下是为了避开大量重新渲染去修改一些Node的属性(比如 scrollLeft)。

二、DOM *** 作

jQuery 中提供了丰富的 *** 作方法,但一个个 *** 作 DOM 元素有的时候真的很烦人并且容易出错。React 通过数据驱动的思想,通过改变 view 对应的数据,轻松实现 DOM 的增删 *** 作。

class Demo extends ReactCompoent { constructor(props) {

super(props); thisstate = { list: [1, 2, 3],

}; thisaddItemFromBottom = thisaddItemFromBottombind(this);

thisaddItemFromTop = thisaddItemFromTopbind(this);

thisdeleteItem = thisdeleteItembind(this); }

addItemFromBottom() { thissetState({ list:

thisstatelistconcat([4]), }); } addItemFromTop() {

thissetState({ list: [0]concat(thisstatelist),

}); } deleteItem() { const newList =

[thisstatelist]; newListpop(); thissetState({

list: newList, }); } render() { return (

<div> {thisstatelistmap((item) =>

<div>{item}</div>)} <button

onClick={thisaddItemFromBottom}>尾部插入 Dom 元素</button>

<button onClick={thisaddItemFromTop}>头部插入 Dom

元素</button> <button

onClick={thisdeleteItem}>删除 Dom 元素</button>

</div> ); }} 三、事件的监听

React 通过根节点代理的方式,实现了一套很优雅的事件监听方案,在组件 unmount 时也不需要自己去处理内存回收相关的问题,非常的方便。

import React from 'react';class Demo extends ReactComponent {

constructor(props) { super(props); thishandleClick =

thishandleClickbind(this); } handleClick() {

alert('我是d窗'); } render() { return ( <div

onClick={thishandleClick}>点击我d出d框</div> ); }}

这里有一个小细节就是

bind 的时机,bind 是为了保持相应函数的上下文,虽然也可以在 onClick 那里 bind,但这里选择在 constructor 里

bind 是因为前者会在每次 render 的时候都进行一次 bind,返回一个新函数,是比较消耗性能的做法。

React 的事件监听,毕竟只能监听至 root component,而我们在很多时候要去监听 window/document 上的事件,如果

resize、scroll,还有一些 React 处理不好的事件,比如

scroll,这些都需要我们自己来解决。事件监听为了屏蔽差异性需要做很多的工作,这里像大家推荐一个第三方库来完成这部分的工作,

add-dom-event-listener ,用法和原生的稍有区别,是因为这个库并不旨在做 polyfill,但用法还是很简单。

var addEventListener = require('add-dom-event-listener');var handler =

addEventListener(documentbody, 'click', function(e){

consolelog(etarget); // works for ie consolelog(enativeEvent); //

native dom event});handlerremove(); // detach event listener

另一个选择是 bean ,达到了 IE6+ 级别的兼容性。

四、事件的触发

和事件监听一样,无论是 Dom 事件还是自定义事件,都有很优秀的第三方库帮我们去处理,如果是 DOM 事件,推荐 bean ,如果是自定义事件的话,推荐 PubSubJS 。

五、documentready

React

作为一个 view 层框架,通常情况下页面只有一个用于渲染 React 页面组件的根节点 div,因此

documentready,只需把脚本放在这个 div 后面执行即可。而对于渲染完成后的回调,我们可以使用 React 提供的

componentDidMount 生命周期。

import React from 'react';class Demo

extends ReactComponent { constructor(props) { super(props);

} componentDidMount() { doSomethingAfterRender(); //

在组件渲染完成后执行一些 *** 作,如远程获取数据,检测 DOM 变化等。 } render() { return (

<div>just a demo</div> ); }} 六、attr 方法

jQuery 使用 attr 方法,获取 Dom 元素的属性。在 React 中也可以配合 Ref 直接读取 DOM 元素的属性。

import React from 'react';class Demo extends ReactComponent {

constructor(props) { super(props); }

componentDidMount() { thisrootNodescrollLeft = 10; //

渲染后将外层的滚动调至 10px } render() { return ( <div

ref={(c) => thisrootNode = c}

style={{ width: '100px', overflow: 'auto' }} >

<div style={{ width: '1000px' }}>just a demo</div>

</div> ); }}

但是,在大部分的情况下,我们完全不需要做,因为 React 的单向数据流和数据驱动渲染,我们可以不通过 DOM,轻松拿到和修改大部分我们需要的 DOM 属性。

import React from 'react';class Demo extends ReactComponent {

constructor(props) { super(props); thisstate = {

link: '//>

reactnative点击改变状态没有立刻生效怎么办,React Native FlatList 选中后 状态没有立即发生改变,而在下一次生效的问题 解决关键: 给FlatList 添加 extraData={thisstate} 。

React 与 Vue 是我们熟悉的两大前端主流框架,来自官方的解释, Vue是一套用于构建用户界面的渐进式框架 , React是一个用于构建用户界面的JavaScript库 ,两个框架都使用各自的语法,专注于用户UI界面的构建那我们会有疑问,这两个框架都专注于UI界面的构建,但是随着JavaScript单页应用开发日趋复杂,我们如何进行更多数据的管理呢?比如网络请求的数据、缓存数据、本地生成尚未持久化到服务器的数据,UI状态数据,激活的路由,被选中的标签等等 基于上面的疑问,两个框架都有各自的解决方案: React-Redux 与 Vuex

使用 react-redux 之前我们先来了解一下 Redux 。 Redux 是 JavaScript 状态容器,提供可预测化的状态管理, Redux 由 Flux 演变而来,当然除了和 React 一起用外,还支持其它界面库,不过我们这里主要介绍它配合React进行使用先来了解下它的几个核心概念:

你可以把 action 理解为一个描述发生了什么的指示器。在实际应用中,我们会 dispatch(action) ,通过派发action来达到修改state的目的。这样做的好处是可以清晰地知道应用中到底发生了什么。

使用 Redux 进行数据管理时有三个原则需要注意

react-redux 是 Redux 官方提供的 React 绑定库他的使用也遵循上面的redux原则。

通过上面的流程图可以很清晰的明确 Redux 的使用:

Vuex 是一个专为 Vuejs 应用程序开发的 状态管理模式 + 库 。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。它主要用来解决 多个组件共享状态 的问题。

Vuex 跟 Redux 的数据管理模式很相似,如果理解 Redux ,那么 Vuex 也很容易理解了,只不过 Vuex 是专门为 Vuejs 设计的状态管理库,使用起来要更加方便。

在Vue组件中我们使用 storestatea, storestateb 来分别获取两个模块的状态

通过对比 React Redux 与 Vuex 可以发现,两者的封装与使用有很大的相似性,它们都借鉴了 Flux 的设计思想,通过使用对比可以让我们更容易掌握他们。

一些参考:

Vuex

Redux中文文档

最近入职了新公司、已经将近2个月了。

之前一直搞vue开发、对react大概有个认知、但是从未做过大型项目

这2个月、边开发项目直接上手react-hooks+antdUI框架

碰到了一个问题

如图、新建d窗、单选框选中、然后关闭d窗、再次打开、仍在选中状态、需要清除

希望对你们有帮助、这个问题刚开始纠结在了对象及数组对差异、导致一直无法成功解决。

听说vite已经到了2x版本,赶紧打开文档看了看

输入项目名称后,选择react回车、再选中react回车,ok,生成的目录结构如下

打开viteconfigjs,默认配置如下:

那么我们按照库模式修改配置,打包文件输出到lib/dist目录下

库入口是components目录下的indexjsx文件,该文件用于导出库组件,如:

那么我们需要写个button组件

接下来就可以打包组件了,

结果如下图:

打包后生成了两个文件

出现下图显示表示登录成功。什么,还没npm账号?作为新时代农民工,npm账号必须注册一下(此处省略)

我们要发布的包在lib目录下,那么在该目录下添加packagejson文件

那么我们进入到该目录

激动人心的时刻到了,输入发布命令

结果

什么,竟然报错了,好吧,原来是镜像搞的鬼

切换回原镜像

OK,重新yarn publish

发布后,我们就可以使用这个包了,就在刚才的项目里引用试试

到src/appjsx文件里引用这个组件

回到命令行,启动项目

以上就是关于在react中用canvas做一个电影院选座功能全部的内容,包括:在react中用canvas做一个电影院选座功能、如何在 React 中做到 jQuery-free、reactnative点击改变状态没有立刻生效怎么办等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9578905.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存