(事件名大寫)json
注意:組件事件須要配合狀態,因此如今沒法呈現效果bash
class Cmp1 extends React.Component{
constructor(...args){
super(..args);
this.a=0;//要用狀態,屬性不行,props也不行
}
add(){
this.a++;
//這個函數會執行,a也會變,可是不會從新渲染
alert(this.a);
}
render(){
return <div>
//強制綁定add的this
<input type="button" value="加1" onClick={this.add.bind(this)} />
</div>
}
}
複製代碼
a其實變了,可是隻有狀態改變能引起從新渲染
組件的狀態很是有用函數
class Cmp1 entends React.Component{
constructor(...args){
super(...args);
//狀態初始化
this.state={a:0}
}
add(){
//修改狀態
this.setState({
a:this.state.a+1
})
}
render(){
return <div>
//強制綁定add的this
<input type="button" value="+1" onClick={this.add.bind(this)} />
{this.state.a}
</div>
}
}
let comp=<Cmp1></Cmp1>
ReactDOM.render(comp,root)複製代碼
注意⚠️:性能
class Parent extends React.Component{
constructor(...args){
super(...args);
this.state={a:0}
}
render(){
return <div>
<input type="button" value="+1" onClick={function(){
this.setState({
a:this.state.a+1
})
}.bind(this)} />
<Child a={this.state.a} />
</div>
}
}
class Child extends React.Component{
constructor(...args){
super(...args);
}
render(){
return <div>
{this.props.a}
</div>
}
}
複製代碼
class Cmp1 extends React.Component{
constructor(.;..args){
super(...args);
this.a=12;
}
fn(){
this.a++
//強制渲染
this.forceUpdate();
}
render(){
return <div>
<input type="button" value="+1" onClick={this.fn.bind(this)} />
{this.a}
</div>
}
}
複製代碼
強制從新渲染會打亂React自身的渲染計劃,輕則影響性能,重則引起錯誤,極少使用
從組件建立到銷燬的整個過程fetch
上圖中,涉及最重要的兩個鉤子函數, componentDidMount(組件已掛載)和 componentDidUpdate(組件已更新)
建立階段(mount)ui
更新階段(update)this
阻止更新spa
shouldComponentUpdata(nextProps,nextState){
//當前狀態(變化前),新狀態(變化後)
this.state.nextState
//當前屬性,新屬性
this.props.nextProps
return true -容許更新/。 false -拒絕更新
}複製代碼
使用實例:阻止循環updatecode
class Parent entends React.Component{
constructor(...args){
super(..args);
this.state={
id:1
}
}
next(){
this.setState{
id:this.state.id+1
}
}
render(){
return {
<div>
<input type="button" value="下一個" onClick={this.next.bind(this)}/>
<Child id={this.state.id}/>
</div>
}
}
}
class Child extends React.Component{
constructor(..args){
super(...args);
this.state={
name:'',
age:''
}
}
shouledComponentUpdata(nextProps,nextState){
//console.log(nextProps,this.props);
renturn{
//條件1:屬性變了(來自父級)
nextProps.id!=this.props.id||
//條件2:狀態變了(來自本身)
nextState.name!=this.state.name
};
}
loadData(id){
fetch(`data/data${id}.txt`).then(res=>{
res.json().then(data=>{
this.setState(data);
});
});
}
componentDidMount(){
console.log('初始:‘,this.props.id); this.loadData(this.props.id) } componentDidUpdate(){ console.log('更新‘,this.props.id)
this.loadData(this.props.id);
}
render(){
console.log('渲染‘); return ( <div> ID:{this.props.id}<br/> 用戶名:{this.state.name},年齡:{this.state.age} </div> ) } }複製代碼
銷燬操做沒法阻止