1. 程式人生 > >超級清楚的react 元件通訊傳值

超級清楚的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!  大家有什麼問題歡迎給我留言。我叫師師。小學生一枚!