超级清楚的react 组件通信传值

关于组件的数据通信精简理解(从获取数据两种方式去理解):

1.数据通信获取数据的两种方式:‘拿到’和‘传递’。

2.react 组件传值本质来讲就是两种: 父传子和子传父。

 

讲解:

1.1‘拿到’,指的是通过对象拿到数据。比如react 中父组件传值给子组件(本质上我们理解是从子组件中拿到父级传来的值!)。那么在子组件中如何拿到父组件的值,这里我们通过的是this.props属性。例如下面的代码:

1.father.jsx  解释: 在child 标签中设置‘childData’属性,并且赋值(代码中我把父级的state中的值传给子组件实际中随便你给什么值)

import Child from ‘./child’

class Father extends Component {
  constructor(){
     super()
     this.state = {
       username:'test',
       content:''
     }
  }
  render(){
     return(
       <div className="commentBox">
          <Child childData = "this.state.username"/>
       </div>
     )
  }
}
export default Father

child.jsx     解释:直接通过this.props.XX 获取父级给子级值。XX为父级写入子组件标签的属性名称。

import React, { Component } from 'react'
class Child extends Component {
  render() {
    return(
      <div>
        {this.props.childData}
      </div>
    )
  }
}
export default Child 

1.2 ‘传递’。传递是一种动作!需要事件出发!这两点要记住!知识点有没有!

一般我们理解的子组件传给父组件数据,本身理解中是“传递的意思”,意思是通过某中事件触发,例如:点击事件!

情景,子组件是输入框, 数据输入完之后,我们需要将数据传递给父组件件,并且在父组件中调用后台接口。分析:事件的本身是从子组件中’传递‘给父组件而不是父组件直接‘获取’子组件‘的值。

看代码:(子组件)

import React, { Component } from 'react'
class CommentInput extends Component {
  constructor (){
    super()
    this.state = {
      username:'1121',
      content:'31131'
    }
  }
  handleUsernameChange(e){
    this.setState({
      username: e.target.value
    })
    // 注意:setState 之后 并未生效! 在render中生效!
    // console.log(this.state.username)
  }
  handleContentChange(e){
    this.setState({
      content: e.target.value
    })
    // console.log(this.state.content)
  }
  
  sendMessage(e){
    // 拿到值
    let test = this.state
    console.log('保存的值', test)
    // 重置
    this.setState({
      content: '',
    })
     // 判断是否传输了onsubmit属性!
    if(this.props.onSubmit){
      const  { username, content } = this.state
      this.props.onSubmit({username, content})
    }
  render() {
    // this.a(this.b)
    return(
    <div className='comment-input'>
        <div className='comment-field'>
          <span className='comment-field-name'>用户名:</span>
          <div className='comment-field-input'>
            <input value = {this.state.username}  onChange={this.handleUsernameChange.bind(this)}/>
          </div>
        </div>
        <div className='comment-field'>
          <span className='comment-field-name'>评论内容:</span>
          <div className='comment-field-input'>
            <textarea value ={this.state.content}  onChange={this.handleContentChange.bind(this)}/>
          </div>
        </div>
        <div className='comment-field-button'>
          {/* 点击发布按钮!向父组件传值 */}
          <button onClick = {this.sendMessage.bind(this)}>
            发布
          </button>
        </div>
      </div>
    )
  }
}
export default CommentInput

  注意 :代码中 最后的点击事件

  sendMessage(e){
    // 拿到值
    let test = this.state
    console.log('保存的值', test)
    // 重置
    this.setState({
      content: '',
    })
     // 判断是否传输了onsubmit属性!
    if(this.props.onSubmit){
      const  { username, content } = this.state
      this.props.onSubmit({username, content})   这个就是’传递‘的本质,调用父组件中的方法,并且把子组件中的数据当作参数!

还有知识点!!!this.props.onSubmit({username, content})  叫做 this.props.onSubmit({username, content})的回调函数!!!
    }

那么放上父级组件代码,供参考

import React, { Component } from 'react';
import CommentInput from './CommentIput';
import CommentList from './CommentList';
import '../css/comment.less';
class CommentApp extends Component {
  onSubmit(d){
    console.log(d)
  }
  render(){
     return(
       <div className="commentBox">
          <CommentInput />
          <CommentList/>
       </div>
     )
  }
}
export default CommentApp

1.3 还有知识点!!! 我们通过'拿到'这种方式直接在父级拿数据!  

需要理解的是,组件其实是一种封装的对象。那么是不是可以在父组件中,把子组件看成一个对象,对象中有state prpos 等各种属性。答案是坑定的!!! 那么这样子组件就不用传递!直接从父组件拿子组件中的值! 通过ref这个属性

上代码:

import React, { Component } from 'react';
import CommentInput from './CommentIput';
import CommentList from './CommentList';
import '../css/comment.less';
class CommentApp extends Component {
  // constructor (){
  //   super()
  //   this.state = {
  //     username:'',
  //     content:''
  //   }
  // }
  refCb(instance){
    console.log(instance)
  }
  onSubmit(d){
    console.log(d)
  }
  componentDidMount(){
    console.log('11', this.refs)
  }
  render(){
     return(
       <div className="commentBox">
          <CommentInput ref="refCb"/>
          <CommentList ref="xcsx"/>
       </div>
     )
  }
}
export default CommentApp

 

2.从数据通信方向理解就是两种'父传子 子传父' 。加入要子传子  那么拆分为:子传父 父再传子  父作为中转站。其他情况亦可这样理解。

ok!  大家有什么问题欢迎给我留言。我叫师师。小学生一枚!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值