React 事件处理
React 提供了一套简单易用的事件处理机制,使得在组件中处理用户交互变得非常直观。通过使用合成事件,React 还提供了额外的功能,如自动绑定和事件池。掌握 React 事件处理对于开发高效的用户界面至关重要。
1. 基本事件处理
在 React 中,可以通过在元素上绑定事件处理器来处理基本的事件,如点击、键盘输入等。事件处理器通常是组件方法,它们被绑定到特定的事件类型。
1.1 绑定事件处理器
要将事件处理器绑定到元素,可以使用on
前缀加上事件名称作为属性。例如,要处理点击事件,可以添加onClick
属性。
jsx
class MyButton extends React.Component {
handleClick() {
console.log("按钮被点击了");
}
render() {
return <button onClick={this.handleClick}>点击我</button>;
}
}
在上面的代码中,handleClick
方法被绑定到按钮的点击事件。当用户点击按钮时,控制台会输出"按钮被点击了"。
1.2 传递参数给事件处理器
有时候,需要在事件处理器中访问额外的数据。可以通过在绑定事件处理器时传递参数来实现。
案例: 1. 绑定事件处理器 onClick
js
// 案例: 1. 绑定事件处理器 onClick
class App extends React.Component {
handleClick() {
alert("按钮被点击了");
}
render() {
return (
<p>
onClick-<button onClick={this.handleClick}>点击我</button>
</p>
);
}
}
const app = ReactDOM.createRoot(document.querySelector("#app1"));
app.render(<App />);
案例: 2. 绑定事件处理器 onChange
js
// 案例: 2. 绑定事件处理器 onChange
const { useRef } = React;
function App() {
const onChange = (e) => alert("输入框的值:" + e.target.value);
return (
<p>
onChange-
<input type="text" onChange={onChange} />
</p>
);
}
const app = ReactDOM.createRoot(document.querySelector("#app2"));
app.render(<App />);
案例: 3. 绑定事件处理器 onSubmit
js
// 案例: 3. 绑定事件处理器 onSubmit
function App() {
const onSubmit = (event) => {
event.preventDefault(); // 阻止表单提交的默认行为
alert("表单已提交");
};
return (
<div>
<form onSubmit={onSubmit}>
onSubmit-<button type="submit">提交</button>
</form>
</div>
);
}
const app = ReactDOM.createRoot(document.querySelector("#app3"));
app.render(<App />);
案例: 4. 绑定事件处理器 onBlur
js
// 案例: 4. 绑定事件处理器 onBlur
const { useRef } = React;
function App() {
const inputRef = useRef(null);
const onBlur = (event) => alert("输入框失去焦点");
return (
<p>
onBlur-
<input type="text" onBlur={onBlur} ref={inputRef} />
</p>
);
}
const app = ReactDOM.createRoot(document.querySelector("#app4"));
app.render(<App />);
在上面的代码中,handleItemClick
方法接收一个item
参数,表示被点击的列表项。通过使用箭头函数,可以将item
传递给事件处理器。
2. 合成事件
React 使用合成事件(SyntheticEvent)来模拟原生浏览器事件。合成事件具有与原生事件相同的接口,但它们提供了额外的功能,如自动绑定和事件池。
2.1 自动绑定
在 React 中,事件处理器会被自动绑定到组件实例。这意味着在事件处理器内部,可以直接访问组件的其他方法和状态。
案例: 5. 绑定事件处理器 onClick-遍历传参
js
// 案例: 5. 绑定事件处理器 onClick-遍历传参
const { useRef } = React;
function App() {
const list = ["苹果", "香蕉", "橙子"];
const onClick = (item) => alert("点击了:" + item);
return (
<p>
onClick-遍历传参-
{list.map((o, i) => (
<button key={i} onClick={() => onClick(o)}>
{o}{" "}
</button>
))}
</p>
);
}
const app = ReactDOM.createRoot(document.querySelector("#app5"));
app.render(<App />);
在上面的代码中,handleChange
方法被自动绑定到输入框的更改事件。当用户输入内容时,组件的状态会被更新。
2.2 事件池
为了提高性能,React 使用事件池来重用合成事件对象。因此,不应该在事件处理器中直接修改事件对象。如果需要获取事件的额外信息,可以使用event.nativeEvent
属性。
3. 代码与演示
以下是一个简单的 React 组件生命周期的代码案例:
1. 全部代码
点击查看代码
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>13.test-react-event</title>
<!-- <script src="https://cdn.staticfile.org/react/18.0.0/umd/react.development.js"></script>
<script src="https://cdn.staticfile.org/react-dom/18.0.0/umd/react-dom.development.js"></script>
<script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script> -->
<script src="./react.js"></script>
<script src="./react-dom.js"></script>
<script src="./babel.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/prop-types/15.8.1/prop-types.min.js"></script>
</head>
<body>
<div id="app1"></div>
<div id="app2"></div>
<div id="app3"></div>
<div id="app4"></div>
<div id="app5"></div>
<script type="text/babel">
(function () {
// 案例: 1. 绑定事件处理器 onClick
class App extends React.Component {
handleClick() {
alert("按钮被点击了");
}
render() {
return (
<p>
onClick-<button onClick={this.handleClick}>点击我</button>
</p>
);
}
}
const app = ReactDOM.createRoot(document.querySelector("#app1"));
app.render(<App />);
})();
</script>
<script type="text/babel">
(function () {
// 案例: 2. 绑定事件处理器 onChange
const { useRef } = React;
function App() {
const onChange = (e) => alert("输入框的值:" + e.target.value);
return (
<p>
onChange-
<input type="text" onChange={onChange} />
</p>
);
}
const app = ReactDOM.createRoot(document.querySelector("#app2"));
app.render(<App />);
})();
</script>
<script type="text/babel">
(function () {
// 案例: 3. 绑定事件处理器 onSubmit
function App() {
const onSubmit = (event) => {
event.preventDefault(); // 阻止表单提交的默认行为
alert("表单已提交");
};
return (
<div>
<form onSubmit={onSubmit}>
onSubmit-<button type="submit">提交</button>
</form>
</div>
);
}
const app = ReactDOM.createRoot(document.querySelector("#app3"));
app.render(<App />);
})();
</script>
<script type="text/babel">
(function () {
// 案例: 4. 绑定事件处理器 onBlur
const { useRef } = React;
function App() {
const inputRef = useRef(null);
const onBlur = (event) => alert("输入框失去焦点");
return (
<p>
onBlur-
<input type="text" onBlur={onBlur} ref={inputRef} />
</p>
);
}
const app = ReactDOM.createRoot(document.querySelector("#app4"));
app.render(<App />);
})();
</script>
<script type="text/babel">
(function () {
// 案例: 5. 绑定事件处理器 onClick-遍历传参
const { useRef } = React;
function App() {
const list = ["苹果", "香蕉", "橙子"];
const onClick = (item) => alert("点击了:" + item);
return (
<p>
onClick-遍历传参-
{list.map((o, i) => (
<button key={i} onClick={() => onClick(o)}>
{o}{" "}
</button>
))}
</p>
);
}
const app = ReactDOM.createRoot(document.querySelector("#app5"));
app.render(<App />);
})();
</script>
</body>
</html>
2. 案例演示
test-react-event.html 资源加载中...