記錄react

一屹徘、框架使用

antd pro component - EditableProTable 表單重置

受控情況之下婿禽,改變 dataSource之后盒犹,但是表格編輯組件還是記錄上次編輯狀態(tài)記錄的數(shù)據(jù)壮锻,沒有及時(shí)更新瞳收,解決辦法就是手動(dòng)更新表單(其實(shí)整個(gè)表格就是一個(gè)form)

  // 聲明form實(shí)例
  const [form] = Form.useForm();
  console.log('打印formValues:',form.getFieldsValue());

 <EditableProTable<OrderCargoDtoType>
            // scroll={{ x: 1300 }}
            rowKey="id"
            columns={columnsArr(short_width, options, onSelect, onSearch)}
            // request={requestTableData}
            dataSource={dataSource}
            pagination={pageConfig}
            actionRef={tableRef}
            //onChange={setDataSource}
            rowSelection={{ ...rowSelection, checkStrictly: false }}
            toolBarRender={() => {
              return renderTableToolBar(save, handleExport, dataCensus, batch,openEdit);
            }}
            editable={{
              form:form,
              type: 'multiple',
              .....



//這里是修改dataSource的地方,也是需要更新表單的地方


 getData={(data: any) => {
              modifyRowKeys.forEach((ele, index) => {
                let i = dataSource.findIndex((item) => {
                  return item.id == ele;
                });

                for (let key in data) {
                   dataSource[i][key] = data[key];
                 }
              });
               setDataSource(dataSource);
               //------------------就是這里:锪妗?紊帷!--------------
              form.resetFields();
             }}

二他挎、dva使用

新建js文件 為dva倉庫
設(shè)置名稱 namespace: 'company',
設(shè)置state: {
    enumeration: '', // 獲取所有枚舉
    options: optinons,
    default: 0,
    isExist: false,
    user: '', //用戶信息
  },
effects內(nèi)部為異步函數(shù) 不可修改state 需要put提交到reducers修改
*為省略寫法的箭頭函數(shù)
函數(shù)接收兩個(gè)參數(shù) {state},{ put, call}
state為倉庫數(shù)據(jù)筝尾,put為提交到同步方法,內(nèi)部為type函數(shù)名稱办桨,payload為提交參數(shù)
reducers內(nèi)部為同步方法筹淫,唯一修改state數(shù)據(jù)方法,需要disptch提交呢撞,兩個(gè)參數(shù)损姜,type:’company/changeCompany‘饰剥,type寫法為倉庫名/函數(shù)名,payload為提交參數(shù)

const CompanySelet = {
  namespace: 'company',
  state: {
    enumeration: '', // 獲取所有枚舉
    options: optinons,
    default: 0,
    isExist: false,
    user: '', //用戶信息
  },
  effects:{
    *getUser({state},{ put, call}){
      const { data = {}}=  yield call(getEmployeeWithCurrentUser);
      yield put({
        type:'setUser',payload:data
      });
    },
    *getEnu({state},{ put, call}){
      const { data = {}}=  yield call(getEnums, params.join(','));
      const res = {...data, ...list}
      let obj = {}
      let arr = []
      for (const item of paramsMap) {
        if(res[item]) {
          arr = Object.keys(res[item]).map(key => {
            return { code: res[item][key], desc: key }
          })
          obj[item] = arr
        }
      }
      yield put({
        type:'setEnu',payload:obj
      });
    }
  },
  reducers: {
    changeCompany(state, action) {
      //固定寫法 return 返回整體state
      return {
        ...state,
        isExist: action.payload || false,
      };
    },
  },
};

export default CompanySelet;


組件內(nèi)使用
import { connect } from 'dva';
const 組件名 = (props) => {
this.props.dispatch({
        type: 'company/getEnu',
        payload:{a:1}
      })
}
export default connect(({ company }) => ({  company}))(組件名);

// 重點(diǎn): 首次進(jìn)入網(wǎng)站摧阅,無法觸發(fā)effect方法汰蓉,需要在effect中使用try{}catch{}方法

三、antd pro proLayOut 菜單分割時(shí)

image.png

定義三級(jí)路由棒卷,使一級(jí)路由自動(dòng)匹配到三級(jí)路由顾孽,必須在三級(jí)路由最后面加上一級(jí)路由的path和重定向,如果設(shè)置component比规,為顯示當(dāng)前一級(jí)路由頁面

四若厚、antd pro proLayOut 菜單分割時(shí)

[React中setState如何同步更新 ]

同步更新策略

1.完成回調(diào)

setState函數(shù)的第二個(gè)參數(shù)允許傳入回調(diào)函數(shù),在狀態(tài)更新完畢后進(jìn)行調(diào)用蜒什,譬如:

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

this.setState({
      load: !this.state.load,
      count: this.state.count + 1 }, () => {
      console.log(this.state.count);
      console.log('加載完成')
    });

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

2.Promise封裝結(jié)合async/await

其實(shí)這里就是JavaScript異步編程相關(guān)知識(shí)测秸,將上面回調(diào)寫法換成Promise

引入Promise來封裝setState:

setStateAsync(state) { return new Promise((resolve) => { this.setState(state, resolve)
    });
  }


setStateAsync 返回的是Promise對(duì)象,在調(diào)用時(shí)我們可以使用Async/Await語法來優(yōu)化代碼風(fēng)格:

[![復(fù)制代碼](https://upload-images.jianshu.io/upload_images/2772613-5911975d5e684256.gif?imageMogr2/auto-orient/strip)](javascript:void(0); "復(fù)制代碼") 

 async componentDidMount() {

       await this.setStateAsync ({

               count: this.state.count * 1 + 2

           })

           console.log(123, this.state.count)

           await this.setStateAsync ({

               count: this.state.count * 1 + 2

           })

           console.log(456, this.state.count)

[![復(fù)制代碼](https://upload-images.jianshu.io/upload_images/2772613-78af9cf7ed38c157.gif?imageMogr2/auto-orient/strip)](javascript:void(0); "復(fù)制代碼") 

3.直接使用操作異步函數(shù)async / await

此時(shí)每次await setState都會(huì)執(zhí)行一遍render方法

[![復(fù)制代碼](https://upload-images.jianshu.io/upload_images/2772613-66324513e63c57a4.gif?imageMogr2/auto-orient/strip)](javascript:void(0); "復(fù)制代碼") 

handleChange = async () => {

           await this.setState({

               count: this.state.count * 1 + 2

           })

           console.log(123, this.state.count)

           await this.setState({

               count: this.state.count * 1 + 2

           })

           console.log(456, this.state.count)

}

[![復(fù)制代碼](https://upload-images.jianshu.io/upload_images/2772613-2c650c96164ae596.gif?imageMogr2/auto-orient/strip)](javascript:void(0); "復(fù)制代碼") 

四灾常、setState參數(shù)詳解

state中定義count初始值為1乞封;

1.第一個(gè)參數(shù)為傳入對(duì)象;

[![復(fù)制代碼](https://upload-images.jianshu.io/upload_images/2772613-d75d1b488a117435.gif?imageMogr2/auto-orient/strip)](javascript:void(0); "復(fù)制代碼") 

handleChange = () => { this.setState({
            count: this.state.count  + 2 })
        console.log(123, this.state.count) this.setState({
            count: this.state.count  + 2 })
        console.log(456, this.state.count)
    }

[![復(fù)制代碼](https://upload-images.jianshu.io/upload_images/2772613-1d4e7d1275a984ae.gif?imageMogr2/auto-orient/strip)](javascript:void(0); "復(fù)制代碼") 

調(diào)用方法兩次輸出值為都為3岗憋;

React 出于性能方面的考慮肃晚,并不會(huì)直接對(duì)每次的調(diào)用都進(jìn)行更新,而是會(huì)將多次傳入的對(duì)象進(jìn)行合并處理仔戈,以產(chǎn)生一個(gè)新的最終的 state 對(duì)象关串;

第二個(gè)參數(shù)為完成回調(diào)

[![復(fù)制代碼](https://upload-images.jianshu.io/upload_images/2772613-a1150a09da60229a.gif?imageMogr2/auto-orient/strip)](javascript:void(0); "復(fù)制代碼") 

handleChange = () => { this.setState({
            count: this.state.count  + 2 }, () => {
            console.log(123, this.state.count)
        }) this.setState({
            count: this.state.count  + 2 }, () => {
            console.log(456, this.state.count)
        })
    }


[![復(fù)制代碼](https://upload-images.jianshu.io/upload_images/2772613-948777de8dd3fae9.gif?imageMogr2/auto-orient/strip)](javascript:void(0); "復(fù)制代碼") 

與上面輸出保持一致

2.第一個(gè)參數(shù)為傳入函數(shù):

[![復(fù)制代碼](https://upload-images.jianshu.io/upload_images/2772613-132169dc10cd60d4.gif?imageMogr2/auto-orient/strip)](javascript:void(0); "復(fù)制代碼") 
handleChange = () => { this.setState((prevState, props) => ({
            count: prevState.count + 2 }), () => {
            console.log(123, this.state.count)
        }) this.setState((prevState, props) => ({
            count: prevState.count + 2 }), () => {
            console.log(456, this.state.count)
        })
    }

[![復(fù)制代碼](https://upload-images.jianshu.io/upload_images/2772613-f087fcf2b5600d80.gif?imageMogr2/auto-orient/strip)](javascript:void(0); "復(fù)制代碼") 

函數(shù)第一個(gè)參數(shù)接收先前的狀態(tài)作為第一個(gè)參數(shù),將此次更新被應(yīng)用時(shí)的props做為第二個(gè)參數(shù)监徘;

此時(shí)輸出為兩次都是5晋修;

在第二次調(diào)用 setState 方法時(shí)便可以通過 prevState.count 拿到最新的值從而更新本次的 state 。顯然凰盔,React 對(duì)于傳入函數(shù)的方式和傳入對(duì)象的方式進(jìn)行更新 state 的各自具體理念是不一樣的墓卦,對(duì)于傳入函數(shù)的方式,在調(diào)用 setState 進(jìn)行更新 state 時(shí)户敬,React 會(huì)按照各個(gè) setState 的調(diào)用順序落剪,將它們依次放入一個(gè)隊(duì)列,然后尿庐,在進(jìn)行狀態(tài)更新時(shí)忠怖,則按照隊(duì)列中的先后順序依次調(diào)用,并將上一個(gè)調(diào)用結(jié)束時(shí)產(chǎn)生的 state 傳入到下一個(gè)調(diào)用的函數(shù)中抄瑟,當(dāng)然凡泣,第一個(gè) setState 調(diào)用時(shí),傳入的 prevState 則是當(dāng)前的 state ,如此鞋拟,便解決了傳入對(duì)象式調(diào)用 setState 方法所存在的 不能依賴上一次的 state 去計(jì)算本次 state 的問題骂维。

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

<pre style="margin: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding, margin, color, opacity; overflow: auto; font-family: "Courier New"; font-size: 12px; overflow-wrap: break-word;">handleChange = () => { this.setState((prevState, props) => ({
count: prevState.count + 2 }), () => {
console.log(123, this.state.count)
}) this.setState((prevState, props) => ({
count: this.state.count + 2 }), () => {
console.log(456, this.state.count)
})
}</pre>

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

值得一提的是,在上面的這段代碼中贺纲,執(zhí)行第二個(gè) setState 里面的函數(shù)時(shí)席舍,由第一個(gè) setState 所產(chǎn)生的最新的 state 并沒有合并到 this 對(duì)象上面去,所以此時(shí)通過 this.state 獲取不到最新的狀態(tài)哮笆,故而在函數(shù)內(nèi)部拿到的 this.state.count 的值為 1 而非 3。

另外汰扭,不論第一個(gè)參數(shù)是何種類型稠肘,多次setState也只會(huì)調(diào)用一次render方法,第二個(gè)參數(shù)callback完成回調(diào)中獲取this.state的值同樣也是多次setState合并操作后的最終值萝毛;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末项阴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子笆包,更是在濱河造成了極大的恐慌环揽,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庵佣,死亡現(xiàn)場離奇詭異歉胶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)巴粪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門通今,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肛根,你說我怎么就攤上這事辫塌。” “怎么了派哲?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵臼氨,是天一觀的道長。 經(jīng)常有香客問我芭届,道長储矩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任褂乍,我火速辦了婚禮椰苟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘树叽。我一直安慰自己舆蝴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著洁仗,像睡著了一般层皱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赠潦,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天叫胖,我揣著相機(jī)與錄音,去河邊找鬼她奥。 笑死瓮增,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哩俭。 我是一名探鬼主播绷跑,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼凡资!你這毒婦竟也來了砸捏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤隙赁,失蹤者是張志新(化名)和其女友劉穎垦藏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伞访,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掂骏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了厚掷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芭挽。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蝗肪,靈堂內(nèi)的尸體忽然破棺而出袜爪,到底是詐尸還是另有隱情,我是刑警寧澤薛闪,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布辛馆,位于F島的核電站,受9級(jí)特大地震影響豁延,放射性物質(zhì)發(fā)生泄漏昙篙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一诱咏、第九天 我趴在偏房一處隱蔽的房頂上張望苔可。 院中可真熱鬧,春花似錦袋狞、人聲如沸焚辅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽同蜻。三九已至棚点,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間湾蔓,已是汗流浹背瘫析。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留默责,地道東北人贬循。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像桃序,于是被迫代替她去往敵國和親杖虾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359