第三天:React中的事件

创建事件==》事件绑定==》事件传参==》事件对象==》事件传播==》各个库或者框架中的特殊方法

一、获取事件对象和传参:

如果使用的是直接调用形式 :  this.函数名  那么函数中的唯一的形参  就是事件对象

如果使用的是bind调用形式 :  this.函数名.bind(this,"参数1","参数n")   函数中的最后一个形参是事件对象

如果是调用的是箭头函数:(e)=>this.函数名(e,"参数2")    事件参数的位置由我们自己决定

今日练习代码:获取事件对象和传参

import { Component } from "react";

class Obj extends Component {
  constructor() {
    super();
  }
  //   fun(s, e) {
  //     console.log(s);
  //     console.log(e);//函数中的最后一个形参是事件对象
  //   }
  fun1(e, a, s, p) {
    console.log(e); //事件对象
    console.log(a); //2
    console.log(s); //3
    console.log(p); //4
  }
  render() {
    return (
      <div>
        {/* <button onClick={this.fun.bind("1", "2")}>点击获取事件对象</button> */}
        {/* 箭头函数形式获取事件对象 形参和打印结果是一一对应*/}
        <button onClick={(e) => this.fun1(e, 2, 3, 4)}>
          箭头函数形式获取事件对象
        </button>
      </div>
    );
  }
}
export default Obj;

二、事件传播:阻止默认事件和冒泡事件

今日练习代码:阻止默认事件和冒泡事件

import { Component } from "react";
import "../assets/contextmenu.css";
class Contextmenu extends Component {
  constructor() {
    super();
  }

  render() {
    return (
      <div>
        <h1>阻止默认事件</h1>
        <div className="bigbox" onContextMenu={this.big}>
          <div className="smallbox" onContextMenu={this.small}></div>
        </div>
      </div>
    );
  }
  big(e) {
    console.log("bigbox");
    // 阻止默认事件 需要使用使用event.preventDefault()
    e.preventDefault();
  }
  small(e) {
    console.log("smallbox");
    // 阻止冒泡事件也同时阻止小盒子的冒泡事件
    e.preventDefault();
    e.stopPropagation();
  }
}
export default Contextmenu;

三、props传值   父传子   子传父

今日练习代码:父传子

父组件中:

import { Component } from "react";
import Son from "../component/son";
class Parent extends Component {
  constructor() {
    super();
  }
  render() {
    return (
      <div>
        <h1>父组件</h1>
        {/* 父传子 在子组件中自定义属性和值传过去 在子组件用props接收*/}
        <Son a="我是父亲"></Son>
      </div>
    );
  }
  fun(){
    console.log(123);
  }
}
export default Parent;

子组件中:

import { Component } from "react";

class Son extends Component {
  constructor() {
    super();
  }
  render() {
    return (
      <div>
        <h3>子组件</h3>
        {/* 接收到的父组件传过来的内容 */}
        <p>{this.props.a}</p>
      </div>
    );
  }
}
export default Son;

今日练习代码:子传父

子组件中:

import { Component } from "react";

class Son extends Component {
  constructor() {
    super();
  }
  render() {
    return (
      <div>
        <h3>子组件</h3>
        {/* 接收到的父组件传过来的内容 */}
        <p>{this.props.a}</p>
        {/* 子传父  子组件必须触发父组件方法 */}
        <button onClick={()=>{this.props.person('我是儿子')}}>点击子传父</button>
      </div>
    );
  }
}
export default Son;

父组件中:

import { Component } from "react";
import Son from "../component/son";
class Parent extends Component {
  constructor() {
    super();
  }
  render() {
    return (
      <div>
        <h1>父组件</h1>
        {/* 父传子 在子组件中自定义属性和值传过去 在子组件用props接收*/}
        <Son a="我是父亲" person={this.fun}></Son>
      </div>
    );
  }
  fun(e) {
    // 在父组件中使用事件对象接收 子组件传过来的内容
    console.log(e); //我是儿子
  }
}
export default Parent;

四、登录案例

今日练习代码:

import { Component } from "react";

class Login extends Component {
  constructor() {
    super();
    this.state = {
      user: {
        username: "",
        password: "",
      },
    };
  }
  render() {
    // 解构赋值
    let { username, password } = this.state.user;
    return (
      <div>
        <h1>登录页</h1>
        <p>
          账号 :{" "}
          <input
            type="text"
            value={username}
            onChange={(e) => this.change(e, "username")}
          />
        </p>
        <p>
          密码 :{" "}
          <input
            type="text"
            value={password}
            onChange={(e) => this.change(e, "password")}
          />
        </p>
        <button onClick={() => this.login()}>登录</button>
      </div>
    );
  }
  change(e, type) {
    // console.log(type);
    // console.log(e);
    this.setState({
      user: {
        ...this.state.user,
        [type]: e.target.value,
      },
    });
  }
  login() {
    console.log(this.state.user);
  }
}
export default Login;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React是一个用于构建用户界面的JavaScript库。它被广泛应用于Web应用程序开发,特别适用于创建大型和复杂的应用程序。React的核心思想是组件化,将UI分解成独立可复用的组件,通过组件的组合和嵌套来构建整个应用程序。 React采用一种称为虚拟DOM(Virtual DOM)的机制来提高性能。虚拟DOM是一个轻量级的JavaScript对象树,它可以代表真实的DOM结构。当组件的状态发生变化时,React会通过比较新旧虚拟DOM树的差异并更新只有真正需要改变的部分,避免了无必要的DOM操作,从而提高了性能。此外,React还通过使用合适的Diff算法来进行快速而高效的虚拟DOM更新。 React具有强大而灵活的生命周期方法,可以在组件的不同阶段进行逻辑处理和与外部数据交互。通过这些生命周期方法,开发者可以精确地控制组件的渲染和更新行为,实现更好的性能和用户体验。 此外,React还支持一种称为JSX的语法扩展。JSX允许开发者在JavaScript代码直接编写类似HTML的标记,使得页面结构和组件的关系更加清晰和易于理解。 React作为一个开源项目,有着庞大的社区支持和活跃的生态系统。许多优秀的第三方库和工具如Redux、React Router等都与React紧密集成,帮助开发者更加高效地构建复杂的应用程序。 总之,React是一个非常强大和灵活的前端开发库,它提供了快速、高效和可维护的方式来构建用户界面。无论是开发单页应用、移动应用还是响应式Web应用,React都是一个理想的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值