react 事件 (笔记)

本文介绍了React中事件处理的基本方法及如何通过事件更新组件的状态。涵盖了事件绑定、事件对象的使用、状态更新函数this.setState()的应用等核心概念,并通过多个实例展示了具体的实现方式。

1.事件处理函数的使用

组件:

  • React 自有方法
  • 用户定义方法
事件处理函数可以接受event参数;
如之前用过的:
[html]  view plain  copy
  1. //监听内容的变化并且记录在状态中  
  2. handleChange: function(event){  
  3.     this.setState({inputText: event.target.value});  
  4. },  
  5. //添加提交按钮并打印结果  
  6. handleSubmit: function () {  
  7.     console.log("reply To" + this.props.selectName + "\n"  
  8.              + "\n" + this.state.inputText);  
  9. },  

编写完事件后需要绑定事件处理函数
如:
[html]  view plain  copy
  1. onChange={this.handleChange}  
[html]  view plain  copy
  1. <pre class="html" name="code">onChange={this.handleChange}  
 
事件;
1》触摸类事件:只会在移动设备中产生,对手的移动位置进行检测并做出响应
  • onTouchCancel:
  • onTouchEnd
  • onTouchMove
  • onTouchStart

2》键盘类事件:

  • onKeyDown
  • onKeyUp
  • onKeyPress
3》剪切类事件
  • onCopy
  • onCut
  • onPaste
4》 表单类事件
  • onChange
  • onInput
  • onSubmit
5》 焦点类事件
  • onFocus : 获得焦点
  • onBlur : 失去焦点
6》UI元素: 元素或页面的滚动事件
  • onScroll
7》滚动事件:监听滚动位置,方向
  • onWheel
8》鼠标类事件:
  • onClick
  • onContextMenu :右键,上下文菜单
  • onDoubleClickc
  • onMouseEnter
  • onMouseDown
  • onMouseLeave
  • onMouseMove
  • onMouseOut
  • onMouseOver
  • onMouseUp
9》鼠标拖拽事件: 上传内容
  • onDrop
  • onDrag
  • onDragEnd
  • onDragEnter
  • onDragExit
  • onDragLeave
  • onDragOver
  • onDragStart
实例1:
[html]  view plain  copy
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head lang="en">  
  4.     <meta charset="UTF-8">  
  5.     <title></title>  
  6.     <script src="build/react.js"></script>  
  7.     <script src="build/JSXTransformer.js"></script>  
  8. </head>  
  9. <body>  
  10.     <script type="text/jsx">  
  11.         var style = {  
  12.             color : "red",  
  13.             border: "1px #000 solid"  
  14.         };  
  15.         var HelloWorld = React.createClass({  
  16.             handleChange: function (event) {  
  17.                 console.log(event.target.value);  
  18.             },  
  19.             render: function () {  
  20.                 return <div>  
  21.                     <input onChange={this.handleChange} />  
  22.                 </div>;  
  23.             },  
  24.         });  
  25.         React.render(<div style={style}>  
  26.                 <HelloWorld></HelloWorld>  
  27.             </div>, document.body);  
  28.     </script>  
  29. </body>  
  30. </html>  




2 事件对象:
[html]  view plain  copy
  1. event.target.value  

target:事件对象的属性, 事件应得DOM元素

事件对象的属性:
1》通用属性
  • boolean  bubbles : 事件是否可以冒泡
  • boolean cancelable : 事件是否可以取消
  • DOMEventTarget currentTarget :
  • boolean defaultPrevented : 事件是否禁止默认行为
  • number eventPhase : 事件所处的阶段
  • boolean isTrusted : 事件是否可信,可信事件即用户自定义触发的事件,不可信事件即用js代码触发的事件
  • DOMEvent nativeEvent  使用原生的浏览器发出的事件对象
  • void preventDefault() : 禁止默认行为
  • void stopPropagation() : 禁止冒泡
  • DOMEventTarget target:
  • number timeStamp
  • string type
2》不同事件对象特有的属性

i  剪切事件:
  • DOMDataTransfer clipboardDate : 得到剪切数据
ii 键盘事件:
  • boolean altKey ; 是否按下alt键
  • Number charCode ;按键的编码; 字符编码
  • boolean ctrlKey ;是否按下ctrl键
  • function getModifierState(key) ; 是否按下辅助按键ctrl,shift
  • String key
  • Number keyCode; 按键编码;非字符
  • String locale ; 本地化的字符串
  • Number location ;位置
  • boolean metaKey; win键
  • boolean repeat ;按键是否重复
  • boolean shiftKey; 是否按下shift
  • Number which ; 通用化的charCode和keyCode
iii 焦点
  • DOMEventTarget relatedTarget :  相关的角度
iv 鼠标事件
  • boolean altKey;
  • Number button;
  • Number buttons;
  • Number clientX;
  • Number clientY; 当前鼠标所处的坐标, 顶点是浏览器窗口的左上角
  • boolean ctrlKey
  • function getModifierState(key);
  • boolean metaKey;
  • Number pageX
  • Number pageY; 顶点时html页面的左上角
  • DOMEventTarget relatedTarget ;
  • Number screenX;
  • Number scrrenY; p 
  • boolean shiftKey;


v 触摸事件:
  • boolean altKey
  • DOMTouchList changedTouchs
  • boolean ctrlKey
  • function getModifierState(Key)
  • boolean metaKey
  • boolean shiftKey
  • DOMTouchList targetTouches
  • DOMTouchList touches

vi UI元素
  • Number detail : 滚动的距离
  • DOMAbstractView view : 视图

vii 滚动:

  • Number deltaMode: 单位
  • Number deltaX
  • Number deltaY
  • Number deltaZ 在坐标轴上对应的位置
实例1
[html]  view plain  copy
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head lang="en">  
  4.     <meta charset="UTF-8">  
  5.     <title></title>  
  6.     <script src="build/react.js"></script>  
  7.     <script src="build/JSXTransformer.js"></script>  
  8. </head>  
  9. <body>  
  10.     <script type="text/jsx">  
  11.         var HelloWorld = React.createClass({  
  12.             getInitialState: function () {  
  13.                 return{  
  14.                     backgroundColor:'#FFFFFF'  
  15.                 }  
  16.             },  
  17.             handleWheel: function (event) {  
  18.                 var newColor=(parseInt(this.state.backgroundColor.substr(1),16) +  
  19.                         event.deltaY * 997).toString(16);  
  20.                 newColor = '#' + newColor.substr(newColor.length - 6).toUpperCase();  
  21.                 this.setState({  
  22.                     backgroundColor: newColor  
  23.                 });  
  24.             },  
  25.             render: function () {  
  26.                 console.log(this.state);  
  27.                 return <div onWheel={this.handleWheel} style={this.state}>  
  28.                     <p>Hello World</p>  
  29.                 </div>;  
  30.             },  
  31.         });  
  32.         React.render(  
  33.                 <HelloWorld></HelloWorld>  
  34.                 , document.body);  
  35.     </script>  
  36. </body>  
  37. </html>  


实例2
[html]  view plain  copy
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head lang="en">  
  4.     <meta charset="UTF-8">  
  5.     <title></title>  
  6.     <script src="build/react.js"></script>  
  7.     <script src="build/JSXTransformer.js"></script>  
  8. </head>  
  9. <body>  
  10.     <script type="text/jsx">  
  11.         var HelloWorld = React.createClass({  
  12.             getInitialState: function () {  
  13.                 return {  
  14.                     password: ''  
  15.                 }  
  16.             },  
  17.             handleKeyPress: function (event) {  
  18.                 this.setState({  
  19.                     password: this.state.password + event.which  
  20.                 });  
  21.                 console.log(this.state)  
  22.             },  
  23.             handleChange: function (event) {  
  24.                 event.target.value = '';  
  25.             },  
  26.             render: function () {  
  27.                 return <div>  
  28.                     <input onKeyPress={this.handleKeyPress} onChange={this.handleChange}/>  
  29.                     <p style={{'display':this.state.password.indexOf('495051')>=0 ? 'inline'  
  30.                         :'none'  
  31.                     }}>You got it</p>  
  32.                 </div>  
  33.             },  
  34.         });  
  35.         React.render(  
  36.                 <HelloWorld></HelloWorld>  
  37.                 , document.body);  
  38.     </script>  
  39. </body>  
  40. </html>  



3  事件和状态关联
this.setState()

实例1:
[html]  view plain  copy
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head lang="en">  
  4.     <meta charset="UTF-8">  
  5.     <title></title>  
  6.     <script src="build/react.js"></script>  
  7.     <script src="build/JSXTransformer.js"></script>  
  8. </head>  
  9. <body>  
  10.     <script type="text/jsx">  
  11.         var HelloWorld = React.createClass({  
  12.             getInitialState: function () {  
  13.                 return {  
  14.                     x:0,  
  15.                     y:0  
  16.                 }  
  17.             },  
  18.             handleMouseMove: function (event) {  
  19.                 this.setState({  
  20.                     x:event.clientX,  
  21.                     y:event.clientY  
  22.                 })  
  23.             },  
  24.             render: function () {  
  25.                 return <div onMouseMove={this.handleMouseMove} style={{  
  26.                     height:'1000px',  
  27.                     width:'700px',  
  28.                     backgroundColor: 'gray'  
  29.                 }}>  
  30.                     {this.state.x + ', ' + this.state.y}  
  31.                 </div>  
  32.             },  
  33.         });  
  34.         React.render(  
  35.                 <HelloWorld></HelloWorld>  
  36.                 , document.body);  
  37.     </script>  
  38. </body>  
  39. </html>  
<think>嗯,用户想要了解React Hooks的笔记,我需要整理一个结构清晰的回答。首先,我得回忆一下React Hooks的核心内容和常见钩子。React Hooks是在React 16.8引入的,允许函数组件使用状态和其他React特性,这样就不用写类组件了。对吧? 那应该先介绍Hooks的基本概念,比如为什么需要Hooks,解决了类组件的哪些问题,比如复杂的生命周期和this绑定问题。然后分点讲常用的内置Hooks,比如useState、useEffect、useContext这些。每个Hook要解释作用、基本用法和注意事项。 比如useState是用来管理状态的,例子可能是一个计数器。useEffect处理副作用,要区分清楚依赖数组的作用,还有清理函数。useContext用于跨组件传递数据,可能需要配合createContext使用。然后还有useReducer,类似于Redux的状态管理,适合复杂状态逻辑。自定义Hooks也很重要,可以封装可复用的逻辑,比如useFetch这样的例子。 然后可能要考虑Hooks的使用规则,比如只在顶层调用,不在循环或条件中使用,还有只在React函数组件或自定义Hook中使用。这些规则用户容易犯错,需要强调。 另外,可能需要提到常见的自定义Hooks案例,比如获取数据、表单处理、定时器这些,让用户知道如何实际应用。还有性能优化相关的Hook,比如useMemo和useCallback,避免不必要的渲染。 需要检查是否有遗漏的重要Hook,比如useRef,用于访问DOM或保存可变值,或者useLayoutEffect和useEffect的区别。还有Hooks的优势,比如代码更简洁,逻辑复用更方便,函数式组件的普及。 用户可能需要实际例子来理解,所以每个部分最好配上简单的代码示例,但根据用户要求,数学公式用LaTeX,但代码可能不需要,不过用户问题里没有提到代码格式,可能正常写就行。不过用户问题主要是笔记介绍,所以结构清晰,分点说明比较重要。 还要注意回答使用中文,避免专业术语翻译问题,比如保持术语正确,比如“副作用”、“状态”等。可能需要检查是否有错误,比如useEffect的依赖数组空的时候相当于componentDidMount,对吗?是的。还有自定义Hook的命名必须以use开头,这是规则之一。 总结下来,回答的结构应该是:简介,常用内置Hooks分点说明,使用规则,自定义Hooks,常见问题或注意事项,优势总结。这样用户能一步步了解Hooks的核心内容,注意事项和实际应用。</think>以下是一份结构清晰的React Hooks核心知识笔记整理: --- ### 一、Hooks 核心概念 1. **作用** 使函数组件拥有类组件的特性(状态管理、生命周期等),**解决类组件的3大痛点**: - 状态逻辑难以复用 - 复杂组件难以理解(尤其是生命周期函数) - `this`指向问题 2. **基本原则** - 只在**函数组件顶层**调用Hook - 只能在**React函数组件**或**自定义Hook**中使用 --- ### 二、常用内置Hooks详解 #### 1. `useState` - 状态管理 ```javascript const [state, setState] = useState(initialValue); ``` - **典型场景**:组件内部状态(如计数器、表单输入) - **注意**:异步更新需用函数形式 `setState(prev => prev + 1)` #### 2. `useEffect` - 副作用处理 ```javascript useEffect(() => { // 副作用操作 return () => { /* 清理函数 */ }; }, [dependencies]); ``` - **依赖项规则**: - 空数组 `[]`:仅在挂载时执行(类似`componentDidMount`) - 不传:每次渲染都执行 - 传值:依赖变化时执行 - **清理机制**:返回函数在组件卸载或下次effect前执行 #### 3. `useContext` - 跨组件传值 ```javascript const value = useContext(MyContext); ``` - 需配合`createContext`使用 - 替代`Context.Consumer`的嵌套写法 #### 4. `useReducer` - 复杂状态管理 ```javascript const [state, dispatch] = useReducer(reducer, initialState); ``` - **适用场景**:多状态关联、复杂更新逻辑 - 可替代`useState`+多状态的情况 --- ### 三、性能优化Hooks #### 1. `useMemo` - 缓存计算结果 ```javascript const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]); ``` #### 2. `useCallback` - 缓存函数 ```javascript const memoizedCallback = useCallback(() => { doSomething(a, b); }, [a, b]); ``` --- ### 四、自定义Hook开发 1. **命名规则**:必须以`use`开头(如`useFetch`) 2. **典型场景**: ```javascript // 示例:数据请求Hook function useFetch(url) { const [data, setData] = useState(null); useEffect(() => { fetch(url).then(res => res.json()).then(setData); }, [url]); return data; } ``` --- ### 五、常见问题与注意事项 1. **循环/条件中使用Hook** ❌ 错误示例: ```javascript if (condition) { const [value] = useState(); // 违反Hook调用顺序 } ``` 2. **闭包陷阱** - 在`useEffect`/`useCallback`中访问过时状态时,需通过依赖项或`useRef`解决 --- ### 六、Hooks优势总结 - **逻辑复用**:通过自定义Hook取代HOC/Render Props - **代码简洁**:函数式编程风格,减少模板代码 - **类型友好**:对TypeScript支持更自然 --- 如需深入某个知识点(如具体项目实践案例、原理剖析),可告知具体方向进一步展开说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值