又到了每日分享了。这次分享的是:在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点击改变状态没有立刻生效怎么办等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)