一、構造函數中聲明react
export default MyCom extends Component{
constructor(){
super()
this.fun = this.fun.bind(this)
}
render(){
return(
<div onClick={this.fun}></div>
)
}
fun(){
console.log("fun")
}
}
複製代碼
此中方式只會在構造函數中建立一次,性能最好,但沒法傳值性能優化
二、在組件中聲明數據結構
export default MyCom extends Component{
render(){
return(
<div onClick={this.fun.bind(this, arg)}></div>
)
}
fun(){
console.log("fun")
}
}
複製代碼
該方法能夠解決以上不能傳參的問題,但每次在render時都會從新執行一遍函數函數
三、在渲染內容中使用箭頭函數性能
export default MyCom extends Component{
render(){
return(
<div onClick={(arg)=>this.fun(arg)}></div>
)
}
fun(){
console.log("fun")
}
}
複製代碼
該方法每次執行render時都會從新生成箭頭函數,極不推薦優化
使用Immutable對Reducer的數據進行管理ui
import immutable from "immutable"
const defaulteState = immutable.fromJS({
list: []
})
export default (state = defaultState, action)=>{
switch(action.type){
case "Add":
return state.updateIn(["list"], list=>list.push(action.payload))
default:
return state
}
}
複製代碼
使用該方法能夠減小在修改值時無需建立新的對象,減小內存的消耗,從而達到性能優化的目的this
shuoldComponentUpdate
的優化spa
BaseComponent.jscode
import React from "react";
import {is} from "immutable";
export default class BaseComponent extends React.Component{
shouldComponentUpdate(nextProps, nextState, nextContext) {
let thisState = this.state || {};
let thisProps = this.props || {};
nextProps = nextProps || {};
nextState = nextState || {};
if(Object.keys(thisState).length != Object.keys(nextState).length
|| Object.keys(thisProps).length != Object.keys(nextProps).length){
return true;
}
for(var key in nextProps){
if(!is(nextProps[key],thisProps[key])){
return true;
}
}
for(var key in nextState){
if(!is(nextState[key],thisState[key])){
return true;
}
}
return false;
}
}
複製代碼
MyComponent.js
class MyComponent extends BaseComponent{
render(){
return(<div></div>)
}
}
複製代碼
根據比較的結果是否一致,來斷定是否須要從新渲染
PureComponent
是純組件
特色:
shouldCoponentUpdate
,不然會破壞PureCoponent
的規則