實體:獲取button元素離頁面頂部的距離
ref寫在html元素上
import React,{Component,Fragment} from 'react';
import Child from './Child';
class Counter extends Component{
constructor(props){
super(props);
this.addCount=this.addCount.bind(this);
this.state={
counter:1
}
}
addCount(){
console.log(this.button);
console.log(this.button.clientTop);
this.setState({
counter:this.state.counter+1
})
}
render(){
return(
<Fragment>
<button onClick={this.addCount} ref={button=>this.button=button}>點擊</button>
<Child num={this.state.counter}/>
</Fragment>
)
}
}
export default Counter;

ref寫在組件上,獲取的是組件的實體
import React,{Component,Fragment} from 'react';
import Child from './Child';
class Counter extends Component{
constructor(props){
super(props);
this.addCount=this.addCount.bind(this);
this.state={
counter:1
}
}
addCount(){
console.log(this.child);
this.setState({
counter:this.state.counter+1
})
}
render(){
return(
<Fragment>
<button onClick={this.addCount}>點擊</button>
<Child num={this.state.counter} ref={child=>this.child=child}/>
</Fragment>
)
}
}
export default Counter;

總結:ref寫在html標簽上,獲取的是DOM節點
ref寫在組件標簽上,獲取的是組件的JS實體
setState異步,實體:
import React,{Component,Fragment} from 'react';
class Counter extends Component{
constructor(props){
super(props);
this.addCount=this.addCount.bind(this);
this.state={
counter:1
}
}
addCount(){
console.log(this.div.innerHTML);
this.setState({
counter:this.state.counter+1
})
console.log(this.div.innerHTML);
}
render(){
return(
<Fragment>
<button onClick={this.addCount}>點擊</button>
<div ref={div=>this.div=div}>{this.state.counter}</div>
</Fragment>
)
}
}
export default Counter;

可以看到兩次輸出的都是1,證明setState操作是異步執行的
解決方法:
import React,{Component,Fragment} from 'react';
class Counter extends Component{
constructor(props){
super(props);
this.addCount=this.addCount.bind(this);
this.state={
counter:1
}
}
addCount(){
console.log(this.div.innerHTML);
this.setState(()=>{
return{
counter:this.state.counter+1
}
},()=>{
console.log(this.div.innerHTML);
})
}
render(){
return(
<Fragment>
<button onClick={this.addCount}>點擊</button>
<div ref={div=>this.div=div}>{this.state.counter}</div>
</Fragment>
)
}
}
export default Counter;
這種寫法,第二次列印會在setState執行完畢之后再執行
結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/122054.html
標籤:JavaScript
