---恢復內容開始---
把React的官網入門例子全看一遍,理解了,但自己從頭開始寫有點困難,這次強迫自己從頭開始寫,並寫好注釋:
import React, { Component } from 'react'; class CountTag extends Component { constructor(props) { super(props) //與render函數的onClick綁定,必須綁定,不然js找不到這兩個函數 this.onClickAdd = this.onClickAdd.bind(this) this.onCLickReduce = this.onCLickReduce.bind(this) } onClickAdd() { } onCLickReduce() { } render() { return ( <div> {/*與html的標簽無異,定義兩個按鈕和點擊函數,但還沒有實現它,預定一個props.num讓父組件傳值*/} <button onClick={this.onClickAdd}>+</button> <button onClick={this.onCLickReduce}>-</button> counter:{this.props.num} </div> ) } } export default CountTag
運行結果:
接下來該實現點擊+ -功能了,當我們只做這個頁面時,也就是說不需要父組件,可以把thisp.props.num換成state:
import React, { Component } from 'react'; class CountTag extends Component { constructor(props) { super(props) //與render函數的onClick綁定,必須綁定,不然js找不到這兩個函數 this.onClickAdd = this.onClickAdd.bind(this) this.onCLickReduce = this.onCLickReduce.bind(this) this.state = { initValue: 0 } } //+ =>函數 onClickAdd() { this.state.initValue++ //設置state this.setState({initValue:this.state.initValue}) } //- => 函數 onCLickReduce() { this.state.initValue-- //設置state this.setState({initValue: this.state.initValue}) } render() { return ( <div> {/*與html的標簽無異,定義兩個按鈕和點擊函數,但還沒有實現它,預定一個props.num讓父組件傳值*/} <button onClick={this.onClickAdd}>+</button> <button onClick={this.onCLickReduce}>-</button> counter: {this.state.initValue} </div> ) } } export default CountTag
現在按鈕功能可以正常使用了:
接下來讓我們做一個相對比較復雜的計數器,先看一下運行結果:
三個計數器,下面是一個總和,現在可以新建一個父組件CountParent.js
兩個文件的完整代碼附上:CountTag.js
import React, { Component } from 'react'; class CountTag extends Component { constructor(props) { super(props) //與render函數的onClick綁定,必須綁定,不然js找不到這兩個函數 this.onClickAdd = this.onClickAdd.bind(this) this.onCLickReduce = this.onCLickReduce.bind(this) this.state = { initValue: this.props.num } } //+ =>函數 onClickAdd() { this.onUpdateFunc(true) } //- => 函數 onCLickReduce() { this.onUpdateFunc(false) } onUpdateFunc(flag) { const previousValue = this.state.initValue //當點擊+時flag為真,返回++,反之亦然 const newValue = flag ? ++this.state.initValue : --this.state.initValue this.setState({initValue: newValue}) //這個函數作為一個props來傳遞數據,這里是最重要的 this.props.updateCount(previousValue,newValue) } render() { return ( <div style={style}> {/*與html的標簽無異,定義兩個按鈕和點擊函數,但還沒有實現它,預定一個props.num讓父組件傳值*/} <button style={style} onClick={this.onClickAdd}>+</button> <button style={style} onClick={this.onCLickReduce}>-</button> {/*countername表示第一個計數器,num表示父組件給的初值,並把這個初始值賦給當前組件的state*/} {this.props.countername} counter: {this.state.initValue} </div> ) } } const style = { margin: '16px' } export default CountTag
CountParen.js
其中CountTag.js里面的onUpdateFunc(flag)比較重要,里面有個this.props.uodateCount(previousValue,newValue),這個是組件間傳遞數據的關鍵所在,
父組件也用一個函數名不同,但參數相同的來接送子組件傳遞的數據,從而達到計數器總和的效果。