首页IT科技react 技巧(React基础-JSX事件绑定-事件传参)

react 技巧(React基础-JSX事件绑定-事件传参)

时间2025-07-17 12:03:00分类IT科技浏览4831
导读:React的事件绑定 JSX事件绑定...

React的事件绑定

JSX事件绑定

如果原生DOM原生有一个监听事件            ,我们可以如何操作呢?

方式一:获取DOM原生                      ,添加监听事件;

方式二:在HTML原生元素中       ,直接绑定onclick;

在React中是如何操作呢?我们来实现一下React中的事件监听         ,和原生想不这里主要有两点不同

React 事件的命名采用小驼峰式(camelCase)                     ,而不是纯小写;

我们需要通过{}传入一个事件处理函数           ,这个函数会在事件发生时被执行;

render() { return ( <div> <button onClick={this.btnClick}>按钮</button> </div> ) }

在事件执行后      ,我们可能需要获取当前类的对象中相关的属性                    ,这个时候需要用到this

如果我们这里直接打印this               ,也会发现它是一个undefined

class App extends React.Component { constructor() { super() } render() { return ( <div> <button onClick={this.btnClick}>按钮</button> </div> ) } btnClick() { console.log(this); // undefined } } const app = ReactDOM.createRoot(document.querySelector("#app")) app.render(<App/>)

为什么是undefined呢?

原因是btnClick函数并不是我们主动调用的   ,而且当button发生改变时                   ,React内部调用了btnClick函数;

而它内部调用时                   ,并不知道要如何绑定正确的this;

如何解决this的问题呢?例如我们需要点击按钮, 修改页面中展示的数字

方案一:bind给btnClick显示绑定this

class App extends React.Component { constructor() { super() this.state = { conter: 100 } this.btnClick1 = this.btnClick1.bind(this) } render() { const { conter } = this.state return ( <div> <h2>当前计数: {conter}</h2> {/* this绑定方式一: 通过bind显示绑定this */} <button onClick={this.btnClick1}>按钮1</button> </div> ) } btnClick1() { this.setState({ conter: this.state.conter + 1 }) } } const app = ReactDOM.createRoot(document.querySelector("#app")) app.render(<App/>)

方案二:使用 ES6 class fields 语法(了解)

class App extends React.Component { constructor() { super() this.state = { conter: 100 } } render() { const { conter } = this.state return ( <div> {/* this绑定方式一: 使用 ES6 class fields 语法 */} <button onClick={this.btnClick2}>按钮2</button> </div> ) } btnClick2 = () => { this.setState({ conter: this.state.conter - 1 }) } } const app = ReactDOM.createRoot(document.querySelector("#app")) app.render(<App/>)

方案三:事件监听时直接传入箭头函数(个人推荐)

class App extends React.Component { constructor() { super() this.state = { conter: 100 } } render() { const { conter } = this.state return ( <div> {/* this绑定方式三: 直接传入一个箭头函数 */} <button onClick={() => this.btnClick3()}>按钮3</button> </div> ) } btnClick3() { this.setState({ conter: this.state.conter + 1 }) } } const app = ReactDOM.createRoot(document.querySelector("#app")) app.render(<App/>)

JSX事件传参

在执行事件函数时,有可能我们需要获取一些参数信息:比如event对象                、其他参数

情况一:获取event对象

很多时候我们需要拿到event对象来做一些事情(比如阻止默认行为)

那么默认情况下               ,event对象有被直接传入                      ,函数就可以获取到event对象;

class App extends React.Component { constructor() { super() } render() { return ( <div> <button onClick={this.btnClick1}>按钮1</button> </div> ) } // 回调函数时会将event对象传递过来的 btnClick1(event) { console.log(event); } } const app = ReactDOM.createRoot(document.querySelector("#app")) app.render(<App/>)

情况二:获取更多参数

当有更多参数时   ,我们最好的方式就是传入一个箭头函数            ,主动执行的事件函数                      ,并且传入相关的其他参数;

class App extends React.Component { constructor() { super() } render() { return ( <div> <button onClick={(event) => this.btnClick2(event, "chenyq", 18)}>按钮2</button> </div> ) } btnClick2(event, name, age) { console.log(event, name, age); } } const app = ReactDOM.createRoot(document.querySelector("#app")) app.render(<App/>)

JSX事件小案例练习

需求: 有一个数组, 用于存放电影列表, 将电影列表展示在页面中, 要求点击哪一个电影名称, 就将哪一个的颜色变为红色

实例代码如下:

class App extends React.Component { constructor() { super() this.state = { movies: ["大话西游", "黑化律师", "独行月球"], currrentIndex: 0 } } render() { const { movies, currrentIndex } = this.state return ( <div> <ul> { movies.map((item, index) => { return ( <li key={item} onClick={() => this.itemClick(index)} className={currrentIndex === index ? active : } > {item} </li> ) }) } </ul> </div> ) } itemClick(index) { this.setState({ currrentIndex: index }) } } const app = ReactDOM.createRoot(document.querySelector("#app")) app.render(<App/>) <style> .active { color: red; } </style>
声明:本站所有文章       ,如无特殊说明或标注         ,均为本站原创发布                。任何个人或组织                     ,在未征得本站同意时           ,禁止复制                   、盗用      、采集            、发布本站内容到任何网站                    、书籍等各类媒体平台                   。如若本站内容侵犯了原著者的合法权益      ,可联系我们进行处理      。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
农村赚钱项目m(无成本如何赚钱-提醒大家:当下农村最赚钱的5大项目,无成本高收入,再也不用外出受气受累)