React事件传参深度理解

1.第一种方式,用一个箭头函数包在外面,因为这个箭头函数只有点击的时候才会执行,只有当这个箭头函数执行的时候,里面调用的方法才会执行

// 子组件负责传递参数
render() {
    return (
        <ol>
          {
            this.props.todos.map(item => {
              return (
                <li key={item.id}>
                  <span>{item.title}</span>
                  <button onClick={() => {this.props.handleDelectItem(item.id)}}>删除</button>
                </li>
              )
            })
          }
        </ol>
    )
  }
复制代码
// 父组件负责接受传过来的参数,进行处理
handleDelectItem = (id) => {
    const todos = this.state.todos.filter(item => item.id !== id)
    this.setState({
      todos
    })
  }
  
render() {
    return (
      <div>
          <ToDoList todos={this.state.todos} handleDelectItem={this.handleDelectItem}/>
      </div>
    );
  }
复制代码

注意:

如果在子组件中不用箭头函数将调用的方法包起来,该方法会立即执行(就相当于立即执行函数)

render() {
    return (
        <ol>
          {
            this.props.todos.map(item => {
              return (
                <li key={item.id}>
                  <span>{item.title}</span>
                  <button onClick={ this.props.handleDelectItem(item.id)}>删除</button>
                </li>
              )
            })
          }
        </ol>
    )
  }
复制代码

2.第二种方式,使用bind,这个时候,可以用第二个参数来传递参数,因为bind不会立即执行(不用call是因为call方法会立即执行)

// 子组件
render() {
    return (
        <ol>
          {
            this.props.todos.map(item => {
              return (
                <li key={item.id}>
                  <span>{item.title}</span>
                  <button onClick={this.props.handleDelectItem.bind(this, item.id)}>删除</button>
                </li>
              )
            })
          }
        </ol>
    )
  }
复制代码
 // 父组件
 handleDelectItem = (id) => {
    const todos = this.state.todos.filter(item => item.id !== id)
    this.setState({
      todos
    })
  }
  
render() {
    return (
      <div>
          <ToDoList todos={this.state.todos} handleDelectItem={this.handleDelectItem}/>
      </div>
    );
  }
复制代码

3.第三种方式,使用原生的event来传递参数,把要传递的参数绑定到dom的自定义属性上(该方法,有待完善,删除功能还未实现)

// 子组件
handleDelectItemEvent = (e) => {
      const id = (e.currentTarget.getAttribute('data-id'))
      console.log("里面的",id)
      this.props.handleDelectItem(id)
    }
    
render() {
    return (
        <ol>
          {
            this.props.todos.map(item => {
              return (
                <li key={item.id}>
                  <span>{item.title}</span>
                  <button data-id={item.id} onClick={this.handleDelectItemEvent}>删除</button>
                </li>
              )
            })
          }
        </ol>
    )
  }
复制代码
// 父组件
handleDelectItem = (id) => {
    const todos = this.state.todos.filter(item => item.id !== id)
    this.setState({
      todos
    })
  }
  
render() {
    return (
      <div>
          <ToDoList todos={this.state.todos} handleDelectItem={this.handleDelectItem}/>
      </div>
    );
  }
复制代码

4.第四种方式,react官方推荐

// 子组件(ToDoItem为孙子组件)
render() {
    return (
        <ol>
          {
            this.props.todos.map(item => {
              return (
                <ToDoItem key={item.id} {...item} handleDelectItem={this.props.handleDelectItem}/>
              )
            })
          }
        </ol>
    )
  }
复制代码
// 孙子组件(handleRemove方法是祖先组件通过父组件在传给孙子组件)
handleRemove = () => {
    this.props.handleDelectItem(this.props.id)
  }
  render() {
    console.log(this.props)
    return (
      <li>
        <span>{this.props.title}</span>
        <button onClick={this.handleRemove}>删除</button>
      </li>
    )
  }
复制代码
// 祖先组件
handleDelectItem = (id) => {
    const todos = this.state.todos.filter(item => item.id !== id)
    this.setState({
      todos
    })
  }
  
render() {
    return (
      <div>
          <ToDoList todos={this.state.todos} handleDelectItem={this.handleDelectItem}/>
      </div>
    );
  }
复制代码

补充

1.defaultProps定义静态属性,用于设置默认的Props(外面有传入,则用传入的,没有则使用默认的)

// 子组件
static defaultProps = {
    btnText: '添加'
  }
 
  render() {
    return (
      <div>
        <button onClick={this.handleAddItem}>{this.props.btnText}</button>
      </div>
    )
  }
复制代码

外部有传入

// 父组件
render() {
    return (
      <div>
        <Input addToTitle={this.addToTitle} btnText='ADD'/>
      </div>
    );
  }
复制代码

外部没有传入

// 父组件
render() {
    return (
      <div>
        <Input addToTitle={this.addToTitle}/>
      </div>
    );
  }
复制代码

2.prop-types静态属性,用于检测props的类型(哪里要用就在哪里引入)

import PropTypes from 'prop-types'
复制代码

注意:

注意大小写,这里是PropTypes,用于props类型检查,这个需要安装(cnpm i prop-types -S)详情见npm官网www.npmjs.com/

static propTypes = {
    buttonText: PropTypes.string.isRequired
  }
复制代码

3.classname用于动态添加className到react组件,这个需要安装(cnpm i classname -S) 详情见npm官网www.npmjs.com/

转载于:https://juejin.im/post/5c222af651882569732456ec

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值