Browse Source

React day1-事件处理下

daxia 2 years ago
parent
commit
f1103ff091

+ 52 - 0
20_React.js_VIP22/React.js快速进坑.md

@@ -195,6 +195,58 @@ ReactDOM.createRoot(document.querySelector('#root')).render(element);
   );
 ```
 
+### 4.2 监听器中的this
+
+> 在React16之前,事件的监听器中this可能会被频繁使用。因此我们需要记住this的绑定值。
+>
+> 但是在React18之后,即推出Hook之后,开发者就可以绕过 JS 中难以理解的this指向。
+
+原生事件属性绑定的监听器中的this
+
+```html
+<button onclick="onClick1()">原生事件1</button>
+<button id="btn">原生事件2</button>
+<script type="text/babel">
+  function onClick1() {
+    console.log(this); // undefined
+  }
+  
+  function onClick2() {
+    console.log(this); // button元素
+  }
+  document.getElementById('btn').onclick = onClick2;
+</script>
+```
+
+但是在React中 监听器的this 与HTML属性注册事件是一样的,即监听器中的this不会绑定任何事。
+
+```html
+<div id="root"></div>
+<script type="text/babel">
+function onClick() {
+  console.log(this);// undefined 不会绑定任何值
+}
+let element = <button onClick={onClick}>click me</button>;
+ReactDOM.createRoot(document.querySelector('#root')).render(element);
+</script>
+```
+
+如果这些监听器函数中的this需要有一个有效值:
+
+```html
+<div id="root"></div>
+<script type="text/babel">
+var obj = {name: 'big fat girl baby'};
+function onClick() {
+  console.log(this);// undefined 不会绑定任何值
+}
+let element = <button onClick={onClick.bind(obj)}>click me</button>;
+ReactDOM.createRoot(document.querySelector('#root')).render(element);
+</script>
+```
+
+### 4.3 给监听器传入额外参数
+
 
 
 ##  5. 组件

+ 29 - 0
20_React.js_VIP22/day-1/code/7.事件处理-this问题.html

@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>事件处理</title>
+    <script src="../babel.min.js"></script>
+    <script src="../react.development.js"></script>
+    <script src="../react-dom.development.js"></script>
+  </head>
+  <body>
+    <div id="root"></div>
+    <button id="btn">原生事件</button>
+    <script type="text/babel">
+      var obj = { name: 'big fat girl baby' };
+      function onClick() {
+        console.log(this);
+      }
+
+      document.getElementById('btn').onclick = onClick;
+
+      // let element = <button onClick={onClick}>click me</button>;
+      let element = <button onClick={onClick.bind(obj)}>click me</button>;
+
+      ReactDOM.createRoot(document.querySelector('#root')).render(element);
+    </script>
+  </body>
+</html>

+ 68 - 0
20_React.js_VIP22/day-1/code/8.事件处理-传入额外参数.html

@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>事件处理</title>
+    <script src="../babel.min.js"></script>
+    <script src="../react.development.js"></script>
+    <script src="../react-dom.development.js"></script>
+  </head>
+  <body>
+    <div id="root"></div>
+    <script type="text/babel">
+      function deleteListItem(e, id) {
+        console.log(e, id);
+      }
+      let element = (
+        <ul>
+          <li>
+            <div>
+              <p>list - 1</p>
+              <button
+                onClick={(e) => {
+                  deleteListItem(e, 1);
+                }}
+              >
+                删除
+              </button>
+            </div>
+          </li>
+          <li>
+            <div>
+              <p>list - 2</p>
+              <button onClick={deleteListItem.bind(null, 2)}>删除</button>
+            </div>
+          </li>
+          <li>
+            <div>
+              <p>list - 3</p>
+              <button
+                onClick={(e) => {
+                  deleteListItem(e, 3);
+                }}
+              >
+                删除
+              </button>
+            </div>
+          </li>
+          <li>
+            <div>
+              <p>list - 4</p>
+              <button
+                onClick={(e) => {
+                  deleteListItem(e, 4);
+                }}
+              >
+                删除
+              </button>
+            </div>
+          </li>
+        </ul>
+      );
+
+      ReactDOM.createRoot(document.querySelector('#root')).render(element);
+    </script>
+  </body>
+</html>