react如何獲取state的值並更新使用

react獲取state值並更新使用

react獲取state的值並且修改分為兩種情況:

在視圖層處理

//在 state 中飯設置初始值
state={
      name:'',
      age:''
 }
//通過 控制一個事件觸發然後setState 去設置
setName=()=>{
    this.setState({
       name
    })
}

在model層處理

view層

  //前端通過dispatch 去調用changeTab 接口
  onTabsChange = (key) => {  
    this.props.dispatch({
      type: `${this.module}/changeTab`,  
      payload: key
    });
  }

model層:

const moduleName = 'mayouchen';
let defaultState = {
  activeTabKey: "1"
};
export default {
  namespace: moduleName,
  state: {
    moduleName: moduleName,
    defaultState,
    ...defaultState
},
effects: {
 * changeTab({ payload, }, { call, put, select }) {  
       // 更新  activeTabKey  
       yield put({
         type:'updateActiveTabKey',
         payload
       }); 
      // 更新完  activeTabKey  就可以使用  activeTabKey 更新後的值
       yield put({type: 'getDataByTab'});
 },
  * getDataByTab({payload }, { call, put, select }) { 
        let { activeTabKey } = yield select(state => state[moduleName]);
        //切換TAB調用不同接口
        if(activeTabKey == "1") {  //商戶信息
          yield put({type:'businessInformation', payload: {}});
        } else if (activeTabKey == "2" ) {  //審批信息
          yield put({type:'approvalInformation', payload: {}})
        }else if (activeTabKey == "3" ) {
        }
    }, 
   * businessInformation ({payload, }, { call, put, select }) {
     const result = yield call(read, payload);
     if (result ) {
       let { data } = result ;
       yield put({ type: 'getBusinessInformationData', payload: {...data }});
     }
     else {
       message.error(`獲取信息失敗:${entityRes.globalError}`);
     }
  }
}
 reducers: {
     updateActiveTabKey(state, action) {
      return {
        ...state,
        activeTabKey: action.payload
      };
    }
}

react中state基本使用

有狀態組件和無狀態組件

  • 函數組件又叫做 無狀態組件,類組件又叫做 有狀態組件
  • 狀態( state )即 數據
  • 函數組件沒有自己的狀態,隻負責數據展示(靜)
  • 類組件有自己的狀態,負責更新Ul,讓頁面“動”起來

比如計數器案例中,點擊按鈕讓數值加1。0和1就是不同時刻的狀態,而由0變為1就表示狀態發生瞭變化。狀態變化後,UI也要相應的更新。React中想要實現該功能,就要使用有狀態組件來完成。

state的基本使用

  • 狀態( state )即數據,是組件內部的私有數據,隻能在組件內部使用
  • state的值是對象,表示一個組件中可以有多個數據
  • 通過 this.state 來獲取狀態

class App extends React.Component {
    // constructor() {
    //     super()
    //     // 初始化state
    //     this.state = {
    //         count: 0
    //     }
    // }
    // 簡化語法初始化state  【推薦】
    state = {
        count: 0,
    }
    render() {
        return(
            <div>
                <h1>計數器:{this.state.count}</h1>
            </div>
        )
    }
}
// 渲染組件
ReactDOM.render(<App />, document.getElementById("root"))

setState修改狀態

  • 狀態是可變的
  • 語法:this.setState({ 要修改的數據 })
  • 註意:不要直接修改 state 中的值,這是錯誤的!!!
  • setState() 作用:1. 修改state 2. 更新UI
  • 思想:數據驅動視圖

class App extends React.Component {
    // 簡化語法初始化state  【推薦】
    state = {
        count: 0,
    }
    render() {
        return(
            <div>
                <h1>計數器:{this.state.count}</h1>
                <button onClick = {() => {
                    this.setState({
                        count: this.state.count + 1
                    })
                }}>+1</button>
            </div>
        )
    }
}
// 渲染組件
ReactDOM.render(<App />, document.getElementById("root"))

從JSX中抽離事件處理程序

  • JSX中摻雜過多JS邏輯代碼,會顯得非常混亂
  • 推薦:將邏輯抽離到單獨的方法中,保證JSX結構清晰

  • 原因:事件處理程序中 this的值為undefined
  • 希望:this 指向組件實例( render方法中的this即為組件實例)

事件綁定this指向

1. 箭頭函數

  • 利用箭頭函數自身不綁定 this 的特點
  • render() 方法中的 this 為組件實例,可以獲取到 setState()

2. Function.prototype.bind()

利用 ES5 中的 bind() 方法,將事件處理程序中的 this 與組件實例綁定到一起

class App extends React.Component {
    constructor() {
        super()
        this.state = {
            count: 0,
        }
        this.onIncrement = this.onIncrement.bind(this)
    }
    // 事件處理程序
    onIncrement() {
        console.log('事件處理程序中的this:', this)
        this.setState({
            count: this.state.count + 1
        })
    }
    render() {
        return(
            <div>
                <h1>計數器:{this.state.count}</h1>
                <button onClick = { this.onIncrement }>+1</button>
            </div>
        )
    }
}
// 渲染組件
ReactDOM.render(<App />, document.getElementById("root"))

3. class的實例方法

  • 利用 箭頭函數 形式的 class實例 方法
  • 註意∶該語法是實驗性語法,但是,由於 babel 的存在可以直接使用

class App extends React.Component {
    state = {
        count: 0,
    }
        
    // 事件處理程序
    onIncrement = ()=> {
        console.log('事件處理程序中的this:', this)
        this.setState({
            count: this.state.count + 1
        })
    }
    render() {
        return(
            <div>
                <h1>計數器:{this.state.count}</h1>
                <button onClick = { this.onIncrement }>+1</button>
            </div>
        )
    }
}
// 渲染組件
ReactDOM.render(<App />, document.getElementById("root"))

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: