(create-react-app-typescript中使用 ts,husky,lint-stage,antd,less,redux,router ),ts泛型涣易,(offsetTop和scro...

issue

如何關(guān)聯(lián)本地分支和遠(yuǎn)程分支

  1. git branch --set-upstream-to=origin/remote_branch your_branch
  2. upstream是上游画机,上溯的意思

如何配置絕對(duì)路徑

  • eject后的面目
  1. 新建.env文件
  2. NODE_PATH = src/
  • 如果沒(méi)有eject的項(xiàng)目,則安裝react-app-rewired新症,在config-overrides.js中配置
const {injectBabelPlugin} = require('react-app-rewired');
const rewireReactHotLoader = require('react-app-rewire-hot-loader');
const rewireLess = require('react-app-rewire-less'); ------------------------- 引入less插件
const {addWebpackAlias} = require('customize-cra');
const rewireStyledComponents = require('react-app-rewire-styled-components');
const path = require('path');

module.exports = function override(config, env) {
  config = injectBabelPlugin(
    ['import', {libraryName: 'antd', libraryDirectory: 'es', style: true}],  ----- 使用less
    config,
  );
  config = rewireLess.withLoaderOptions({ ---------------------------------------- antd主題
    modifyVars: {"@primary-color": "#ff9c32"},
    javascriptEnabled: true,
  })(config, env);
  config.module.rules.unshift({
    test: /\.(ts|tsx)$/,
    loader: require.resolve("tslint-loader"),
    enforce: "pre",
  });
  config = rewireReactHotLoader(config, env);
  config = addWebpackAlias({
    ['utils']: path.resolve(__dirname, 'src', 'utils'),
    ['src']: path.resolve(__dirname, 'src'),    ------------------------------------ 絕對(duì)路徑
    ['themed-components']: path.resolve(__dirname, 'src', 'utils', 'themed-components')
  })(config);
  config = rewireStyledComponents(config, env, {
    pure: true,
  });
  return config;
};

如何使用redux-devtools-extension

  1. https://github.com/zalmoxisus/redux-devtools-extension
import { applyMiddleware, combineReducers, createStore } from 'redux';
import { composeWithDevTools } from 'redux-devtools-extension';
const totalReducers = {

};
const store = createStore(
  combineReducers({ ...totalReducers }),
  composeWithDevTools(applyMiddleware()),
);
export default store;

antd 在 typescript 中的使用,并按需加載

  1. yarn add antd
  2. yarn add react-app-rewired --dev
  3. yarn add ts-import-plugin --dev
  4. 也可以直接使用: create-react-app my-project --scripts-version=react-scripts-ts-antd來(lái)生成架子
  5. https://ant.design/docs/react/use-in-typescript-cn

如何在create-react-app typescript 加入 less

注意:這是在eject后的引入less的方法

  1. 安裝less和less-loader yarn add less-loader less -D
  2. 在eject后的webpack.config.dev.js文件中步氏,找到module對(duì)象的rule數(shù)組
  3. https://blog.csdn.net/wu_xiao_qing/article/details/80235359
 {
    test: /\.css$|\.less/,  ------- 修改1
    use: [
      require.resolve('style-loader'),
      {
        loader: require.resolve('css-loader'),
        options: {
          importLoaders: 1,
        },
      },
      {
        loader: require.resolve('less-loader'), ------- 修改2
        options: {
          importLoaders: 1,
        },
      },
      ..........
    ],
  },

如何使用git的pre-commit鉤子,規(guī)范提交代碼

  1. 安裝 husky
  2. 安裝 lint-staged (staged是分段徒爹,階梯的意思)
  3. 在package.json中添加如下代碼
  4. https://github.com/typicode/husky
  • lint-staged ( stage 指的是git中的暫存區(qū) )
  • lint-staged每次提交只會(huì)檢查本次提交的內(nèi)容
  • husky實(shí)現(xiàn)git hooks鉤子
 "scripts": {
    "start": "node scripts/start.js",
    "build": "node scripts/build.js",
    "test": "node scripts/test.js --env=jsdom",
    "lint-staged": "yarn run lint-staged"
  },
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "*.{ts,tsx}": [
      "tslint --project tsconfig.json"
    ],
    "*.{less}": [
      "stylelint *.less"
    ]
  },










(一)泛型

  • 為什么要使用泛型戳护?
    需求:一個(gè)函數(shù)金抡,傳入什么類(lèi)型的參數(shù),就要返回什么類(lèi)型的參數(shù)
    痛點(diǎn):如果參數(shù)用any類(lèi)型腌且,返回值也用any類(lèi)型梗肝,則不清楚返回類(lèi)型
    解決:使用泛型,如下
function identity<T>(arg: T): T {
    return arg;
}
解析:
1. 函數(shù) identity 叫做泛型函數(shù)
2. <T>中的 T 表示 類(lèi)型變量(類(lèi)型參數(shù))铺董,即T是一個(gè)變量巫击,但是只是表示類(lèi)型,不表示值
3. identity函數(shù)的參數(shù) arg 的類(lèi)型是 T類(lèi)型
4. identity函數(shù)的返回值 也是 T類(lèi)型



--------------------
上面定義好了一個(gè)泛型函數(shù)精续,如何使用坝锰?
兩種方法:
(1) 傳入所有參數(shù),包括類(lèi)型參數(shù)(類(lèi)型變量)
let output = identity<string>("myString");  // type of output will be 'string'
解析:類(lèi)型參數(shù)是 string重付,所以根據(jù)函數(shù)定義時(shí)的限制可以確定:傳入?yún)?shù)和返回值都要是string類(lèi)型
(2) 類(lèi)型推論
let output = identity("myString");  // type of output will be 'string'
解析:即類(lèi)型參數(shù)顷级,形參,返回值都是同一類(lèi)型确垫,形參是string弓颈,那其他兩個(gè)就是string
  • 新需求:我傳入的是具有泛型參數(shù)類(lèi)型的數(shù)組,而不是直接是泛型值删掀?如何表示翔冀?
function loggingIdentity<T>(arg: T[]): T[] {
    console.log(arg.length);  // Array has a .length, so no more error
    return arg;
}
解析:
(1) 表示傳入?yún)?shù)是參數(shù)類(lèi)型為T(mén)的數(shù)組,返回值也是類(lèi)型為T(mén)的數(shù)組披泪,而不是直接為T(mén)類(lèi)型
(2) 這可以讓我們把泛型變量T當(dāng)做類(lèi)型的一部分使用纤子,而不是整個(gè)類(lèi)型,增加了靈活性款票。

(二) 泛型類(lèi)型 ----- 泛型函數(shù)的類(lèi)型

function identity<T>(arg: T): T {
    return arg;
}
let myIdentity: <T>(arg: T) => T = identity;   
解析:myIdentity是一個(gè)函數(shù)控硼,類(lèi)型表示為 <T>(arg: T) => T 象颖,值是 identity函數(shù)




--------------------------
我們還可以使用帶有調(diào)用簽名的對(duì)象字面量來(lái)定義泛型函數(shù):
function identity<T>(arg: T): T {
    return arg; 
}
let myIdentity: {<T>(arg: T): T} = identity;

(三) 泛型接口

interface GenericIdentityFn {    -------- 接口
    <T>(arg: T): T;   ------------------- 一個(gè)類(lèi)型參數(shù)為T(mén)的说订,輸入?yún)?shù)類(lèi)型為T(mén)潮瓶,返回值類(lèi)型為T(mén)的函數(shù)
function identity<T>(arg: T): T {
    return arg;
}
let myIdentity: GenericIdentityFn = identity;




---------------
把泛型參數(shù)當(dāng)作整個(gè)接口的一個(gè)參數(shù) (!!!!!!!!!)
interface GenericIdentityFn<T> {  ------------------ 接口的參數(shù)類(lèi)型
    (arg: T): T;
}
function identity<T>(arg: T): T {
    return arg;
}
let myIdentity: GenericIdentityFn<number> = identity;
解析:
使用 GenericIdentityFn的時(shí)候毯辅,
還得傳入一個(gè)類(lèi)型參數(shù)來(lái)指定泛型類(lèi)型(這里是:number),鎖定了之后代碼里使用的類(lèi)型沾谜。 

(四) 泛型類(lèi)

class GenericNumber<T> {
    zeroValue: T;
    add: (x: T, y: T) => T;
}

let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };

(五) 泛型約束

interface Lengthwise {
    length: number;
}

function loggingIdentity<T extends Lengthwise>(arg: T): T {
    console.log(arg.length);  // Now we know it has a .length property, so no more error
    return arg;
}

解析:
(1) <T extends Lengthwise> 表示 ( 類(lèi)型參數(shù)T ) 繼承了 ( Lengthwise接口 )
(2) Lengthwise接口表示該類(lèi)型中,有l(wèi)ength屬性










(1)

scrollTop:

代表在有滾動(dòng)條時(shí)基跑,滾動(dòng)條向下滾動(dòng)的距離也就是元素頂部被遮住部分的高度媳否。
在沒(méi)有滾動(dòng)條時(shí)scrollTop==0恒成立篱竭。單位px,可讀可設(shè)置吃媒。

offsetTop:

當(dāng)前元素頂部距離最近父元素頂部的距離,和有沒(méi)有滾動(dòng)條沒(méi)有關(guān)系赘那。
單位px兽泄,只讀元素漾月。


scrollTop

offsetTop

clientHeight

元素的高度:包括padding蜓陌,不包括border钮热,margin,滾動(dòng)條高度隧期。對(duì)block元素有效仆潮,對(duì)inline元素?zé)o效

offsetHeight

元素的高度:包括padding性置,border揍堰,滾動(dòng)條高度,不包括margin高度

scrollHeight

scrollHeight

https://www.imooc.com/article/17571

(2) intersectionObserver 自動(dòng)觀察元素是否可見(jiàn)

var io = new IntersectionObserver(callback, option);
// intersection是交叉的意思


(1) intersectionObserver構(gòu)造函數(shù)接受兩個(gè)參數(shù)
 - callback :可見(jiàn)性變化時(shí)的回調(diào)函數(shù)
 - option :配置參數(shù)凰萨,可選



(2) 生成的實(shí)例有observe,unobserve武通,disconnect 等方法
// 開(kāi)始觀察
io.observe(document.getElementById('example'));    // observer方法的參數(shù)是DOM節(jié)點(diǎn)
// 停止觀察
io.unobserve(element);
// 關(guān)閉觀察器
io.disconnect();



(3) 實(shí)例的observe方法冶忱,參數(shù)是被觀察的DOM節(jié)點(diǎn)境析,如果要觀察多個(gè)節(jié)點(diǎn),則要多次執(zhí)行該方法



(4) callback觀察器回調(diào)函數(shù):
- callback會(huì)觸發(fā)兩次链沼,目標(biāo)元素進(jìn)入視口和離開(kāi)視口時(shí)都會(huì)觸發(fā)
- callback回調(diào)函數(shù)的參數(shù)是一個(gè)數(shù)組括勺,成員都是intersectionObserverEntry對(duì)象
- IntersectionObserverEntry對(duì)象提供目標(biāo)元素的信息疾捍,一共有七個(gè)屬性栏妖。
  其中最重要的兩個(gè)屬性:
  ( intersectionRatio ) 和 ( isIntersecting ) 是用來(lái)判斷元素是否可見(jiàn)
  - intersectionRatio 相交區(qū)域和目標(biāo)元素的比例值 
  - isIntersecting 目標(biāo)元素當(dāng)前是否可見(jiàn) Boolean值 可見(jiàn)為true
var io = new IntersectionObserver(
  entries => {   
    console.log(entries);
  }
);



(5) option配置對(duì)象
- root :用于觀察的根元素宛裕,默認(rèn)是瀏覽器的視口论泛,也可以指定具體元素,
         指定元素的時(shí)候用于觀察的元素必須是指定元素的子元素
- threshold :用來(lái)指定交叉比例疲酌,決定什么時(shí)候觸發(fā)回調(diào)函數(shù)朗恳,是一個(gè)數(shù)組,默認(rèn)是[0]油航。
- rootMargin :用來(lái)擴(kuò)大或者縮小視窗的的大小
const options = {
    root: document.querySelector('.box'),
    threshold: [0, 0.5, 1],
    rootMargin: '30px 100px 20px'
}

實(shí)例:


https://www.w3cplus.com/vue/build-an-infinite-scroll-component-using-intersection-observer-api.html
http://www.reibang.com/p/84a86e41eb2b
http://www.reibang.com/p/f723f1145764

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谊囚,一起剝皮案震驚了整個(gè)濱河市镰踏,隨后出現(xiàn)的幾起案子奠伪,更是在濱河造成了極大的恐慌首懈,老刑警劉巖究履,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件藐俺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡紊搪,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)爸黄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)炕贵,“玉大人称开,你說(shuō)我怎么就攤上這事鳖轰≡搪拢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵辱志,是天一觀的道長(zhǎng)揩懒。 經(jīng)常有香客問(wèn)我旭从,道長(zhǎng)场仲,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任鸽素,我火速辦了婚禮亦鳞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘遭笋。我一直安慰自己瓦呼,他們只是感情好央串,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布碗啄。 她就那樣靜靜地躺著质和,像睡著了一般。 火紅的嫁衣襯著肌膚如雪稚字。 梳的紋絲不亂的頭發(fā)上饲宿,一...
    開(kāi)封第一講書(shū)人閱讀 49,785評(píng)論 1 290
  • 那天厦酬,我揣著相機(jī)與錄音,去河邊找鬼瘫想。 笑死弃锐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的殿托。 我是一名探鬼主播霹菊,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼支竹!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起扎运,我...
    開(kāi)封第一講書(shū)人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤负拟,失蹤者是張志新(化名)和其女友劉穎秸歧,沒(méi)想到半個(gè)月后谬墙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體弄喘,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡澎媒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年储玫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了端礼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贫奠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腕侄,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏少欺。R本人自食惡果不足惜仿滔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧休雌,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)印叁。三九已至蝗锥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間细燎,已是汗流浹背皂甘。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工璧瞬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留彪蓬,地道東北人档冬。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓伞梯,卻偏偏與公主長(zhǎng)得像牢屋,于是被迫代替她去往敵國(guó)和親迂苛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容