Antd pro 中 dva 的 Typescript 聲明

TS是大前端中非常重要的組成部分泉懦,實際開發(fā)中,讓每個開發(fā)者擁有屬于自己的模塊拱烁,下面是對 dva ,Antd Pro 档址,React Hooks ,一些聲明類型和坑的總結。 ?? 值得注意的是 邻梆,在Antd pro 內部 Model 自動映射到全局。

Hooks函數組件聲明方式

interface IntrinsicElements {
    [elemName: string]: any;
}

使用

const Nodelist: React.FC<IntrinsicElements> =()=>{
            return (<h1>Hello绎秒,World浦妄!</h1>)
}
export default Nodelist;

Dva的聲明

state

interface StateType {
    data:Array;
}

Effect

import { EffectsCommandMap, Model } from 'dva';
import { AnyAction, Reducer } from 'redux';
export type Effect = (
    action: AnyAction,
    effects: EffectsCommandMap & { select: <T>(func: (state: StateType) => T) => T },
) => void;

整個Model的聲明

import { EffectsCommandMap, Model } from 'dva';
import { AnyAction, Reducer } from 'redux';
export type Effect = (
    action: AnyAction,
    effects: EffectsCommandMap & { select: <T>(func: (state: StateType) => T) => T },
) => void;
interface StateType {
    data:Array;
}
interface ModelType {
    namespace: string;
    state: StateType;
    effects: {
        nodelists: Effect;
    };
    reducers: {
        save: Reducer<StateType>;
    };
}

此時 看看我實際整個Model層

import { getNodeList } from './service';
//初始狀態(tài)
const defaultState: StateType = {
  data: [],
};
const Model: ModelType = {
  namespace: 'nodelist',
  state: defaultState,
  effects: {
    //List
    *nodelists({ callback }, { call, put }) {
      const response = yield call(getNodeList)
      let payload = { data: response.content.data }
      yield put({ type: 'save', payload });
    },
  },
  reducers: {
    save(state = { ...defaultState }, action) {
      return {
        ...state,
        ...action.payload
      };
    }
  },
};
//Link to dva warehouse Ts declaration type //這是給組件連接dva時聲明類型用
export type AdminState = Readonly<typeof defaultState>;
//Export the nodelist module(automatically register to the global)
export default Model;

都是和我們定義好的 ModelType 一一對應的

看下Service層

import request from '@/utils/request';
//節(jié)點列表
export async function getNodeList() {
    return request('/admin/node', {
        method: 'GET'
    })
}

怎么Connect你的Model和Comment

首先建立一個叫connect.d.ts的連接文件

//鏈接dva倉庫聲明類型用
import { AdminState } from './model';

 interface ConnectState {
     nodelist: AdminState;//前面是你的命名空間 后面的是從我實際整個Model層 拿過來的Model類型
}

export default ConnectState;

Connect

/**
 * Connect is a built-in connector of dva.??? ?? 
 * The following is the fixed writing of the component link dva warehouse.
 * It contains the namespace you defined and the Loading object. 
 * It is worth noting that Loading is built into dva.Can be used directly.
 * Type Example loading: { effects: { [key: string]: boolean }.
 * It is worth remembering that you need to write your component name with a pair of parentheses at the end of the declared component.
 * This will connect your specified namespace repository (nodelist in this example) to the current component.
 * You can accept it component in props!
 * @author xiaohuwei 2019.11.27
 */
import React,{useEffect} from 'react';
import { Modal, Form, Input } from 'antd';
import ConnectState from './connect';
import { Skeleton } from 'antd';
import { connect } from 'dva';
const Nodelist: React.FC<IntrinsicElements> =props=>{
     //這里接受倉庫所有的方法 loading對象和觸發(fā)器
      const { nodelist, dispatch, submitting } = props;
      useEffect(()=>{
            dispatch({type: 'nodelist/nodelists'})  //頁面加載的時候調用dva的異步方法          
    },[])
            return (
        <>
             <Skeleton loading={submitting} active >
                    <h1>Hello,World见芹!</h1>
                        </Skeleton>
        </>
      )
}
export default connect(
    ({ nodelist, loading }: { nodelist: ConnectState, loading: { effects: { [key: string]: boolean } } }) => //第一個值為你的倉庫名 第二個為dva內置的loading對象 
    ({
    nodelist, 
    submitting: loading.effects['nodelist/nodelists'] || loading.effects['........'] //這里可以用 || 表示多個狀態(tài) 哪個發(fā)請求 dva自動監(jiān)聽哪個請求狀態(tài) 但是都可以用一個變量接收
    })
)(Nodelist)

?? 值得注意的是: loading 對象是 dva 內置的剂娄,他會監(jiān)聽你指定的異步請求方法,方法開始的時候該值為 true ,異步方法結束了該值自動置為 false ,可用于頁面剛進來時骨架屏的加載和某些需要 loading 狀態(tài)的場景玄呛,當然 你可以在后面定義多個值(上面注釋有說明)阅懦,實現你當前組件的全局 loading 狀態(tài)。在上面的代碼中,頁面剛加載的時候我們發(fā)了一個異步方法(nodelist 倉庫下的異步 nodelists 方法)徘铝,submitting 變?yōu)?true 骨架屏效果出現耳胎,這個方法執(zhí)行完了(數據已經拿到)后submitting 會 變?yōu)?false 惯吕。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市怕午,隨后出現的幾起案子废登,更是在濱河造成了極大的恐慌,老刑警劉巖郁惜,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堡距,死亡現場離奇詭異,居然都是意外死亡兆蕉,警方通過查閱死者的電腦和手機羽戒,發(fā)現死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來虎韵,“玉大人易稠,你說我怎么就攤上這事∪笆酰” “怎么了缩多?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長养晋。 經常有香客問我衬吆,道長,這世上最難降的妖魔是什么绳泉? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任逊抡,我火速辦了婚禮,結果婚禮上零酪,老公的妹妹穿的比我還像新娘冒嫡。我一直安慰自己,他們只是感情好四苇,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布孝凌。 她就那樣靜靜地躺著,像睡著了一般月腋。 火紅的嫁衣襯著肌膚如雪蟀架。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天榆骚,我揣著相機與錄音片拍,去河邊找鬼。 笑死妓肢,一個胖子當著我的面吹牛捌省,可吹牛的內容都是我干的。 我是一名探鬼主播碉钠,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼纲缓,長吁一口氣:“原來是場噩夢啊……” “哼卷拘!你這毒婦竟也來了?” 一聲冷哼從身側響起色徘,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤恭金,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后褂策,有當地人在樹林里發(fā)現了一具尸體横腿,經...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年斤寂,在試婚紗的時候發(fā)現自己被綠了耿焊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡遍搞,死狀恐怖罗侯,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情溪猿,我是刑警寧澤钩杰,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站诊县,受9級特大地震影響讲弄,放射性物質發(fā)生泄漏。R本人自食惡果不足惜依痊,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一避除、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胸嘁,春花似錦瓶摆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至毫胜,卻和暖如春蝌借,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背指蚁。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留自晰,地道東北人凝化。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像酬荞,于是被迫代替她去往敵國和親搓劫。 傳聞我的和親對象是個殘疾皇子瞧哟,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361