我的前端筆記

目錄

  • react
  • 小程序
  • vue
  • typescript
  • 經(jīng)驗(踩坑)

react

useMemo 和 useCallback 都是用來做性能優(yōu)化的,把 useMemo 當(dāng)成一個值,把 useCallback 當(dāng)成一個函數(shù)即可。

詳見 useMemo 與 useCallback 源碼解析

useEffect

useEffect 是在布局(layout)和繪制(paint)之后觸發(fā)的。

useEffect 不提供依賴數(shù)組和提供空數(shù)組有什么區(qū)別?

給它一個空數(shù)組就像 componentDidMount 一樣,它只運行一次。

不給它第二個參數(shù)充當(dāng) componentDidMount 和 componentDidUpdate ,因為它首先在安裝上運行,然后在每次重新渲染時運行。

useEffect 忽略依賴列表的 functions 時, 是否安全?

答案是,否??磦€示例:

function Example({ someProp }) {
    function doSomething() {
        console.log(someProp);
    }
    useEffect(() = >{
        doSomething();
    }, []); // ?? This is not safe (it calls `doSomething` which uses `someProp`) }
}

可以改進(jìn)一下,將 function 丟進(jìn) useEffect 的回調(diào)里:

function Example({ someProp }) {
    useEffect(() = >{
        function doSomething() {
            console.log(someProp);
        }
        doSomething();
    },
    [someProp]); // ? OK (our effect only uses `someProp`)
}

也可以使用 useCallback 包裹函數(shù):

function Example({ someProp }) {
    const doSomething = useCallback(() = >{
        console.log(someProp);
    },
    [someProp]);
    useEffect(() = >{
        doSomething();
    },
    [doSomething]);
}

useCallback

使用空數(shù)組作為輸入的 useCallback 和沒有第二個參數(shù)的 useCallback 之間有什么區(qū)別?

如果第二個參數(shù)是一個空數(shù)組,則該值將被內(nèi)存一次并始終返回。
如果省略第二個參數(shù),該值將永遠(yuǎn)不會被內(nèi)存。

useLayoutEffect

useEffect 和 useLayoutEffect 的區(qū)別:

useEffect 是異步執(zhí)行的,而useLayoutEffect是同步執(zhí)行的。

useEffect 的執(zhí)行時機是瀏覽器完成渲染之后,而 useLayoutEffect 的執(zhí)行時機是瀏覽器把內(nèi)容真正渲染到界面之前,和 componentDidMount 等價。

一般會影響到渲染的操作盡量放到 useLayoutEffect 中去,避免出現(xiàn)閃爍問題。

參考:https://zhuanlan.zhihu.com/p/348701319

小程序

使用 Component 來實現(xiàn)接收跳轉(zhuǎn)參數(shù),無需通過 onLoad 的 options 參數(shù)獲取哦:

只需在 Component 里面聲明 properties 即可, 別的頁面跳轉(zhuǎn)過來待參,就可以通過 this.data 獲取到相應(yīng)的 property。

普通頁面:

<navigator url="/pages/組件頁面?activeIndex=1">我是跳轉(zhuǎn)按鈕</navigator>

組件頁面:

Component({
    properies: {
        activeIndex: String,
    },
    methods: {
        onLoad() {
            console.log(this.data.activeIndex); // '1'
        }
    }
})

小程序頁面返回帶參方案:

通過 navigateTo 的 success 的 response 里的 eventChannel 來向目標(biāo)頁發(fā)布事件,而目標(biāo)頁可通過this.getOpenerEventChannel() 來監(jiān)聽事件,示例:

// 當(dāng)前頁
wx.navigateTo({
    url,
    success: ({ eventChannel }) = >{
        eventChannel.emit('init', {
            a: 1
        });
    }
});
// 目標(biāo)頁
ready() {
    this.getOpenerEventChannel().on('init', ({
        a
    }) = >{
        // doSomething
    });
}

ios 掃小程序碼沒有進(jìn)入小程序,而是進(jìn)入一個空白網(wǎng)頁:

ios 需要有權(quán)限才可訪問小程序,改 appid,需要已經(jīng)添加過開發(fā)者的 appid

vue

自動引入路由實現(xiàn)方案:(底層是利用 require.context api 實現(xiàn),即是說,require.context 可以引入多個文件)

路由的目錄為:

router

  • modules
  • index.js
const modules = require.context('./modules', true, /\.js$/);
modules.keys().forEach(name => {
  const module = modules(name);
  if (module.default) {
    addRoute(module.default);
  } else {
    Object.values(module).forEach(addRoute);
  }
});

typescript

TypeScript 中當(dāng)一個變量為 object 或 null 時,使用解構(gòu)賦值可能報錯的解決方法(在變量后面加個!即可):

type SomeData = {
    a: string;
    b: string;
    c: string;
};
const someData: SomeData | null = null;
const { a, b, c } = someData!;

類型推斷

可以合理利用類型推斷,節(jié)省返回參數(shù)聲明。
示例:

// api.ts
export function getSomething() {
  return get<Res<Something[]>>({
    url: xxx
  });
}

// index.ts
import { getSomething } from './api';
const _getSomething = async () => {
    /** 
        * 此處的 data 可以不做類型聲明,因為在 api.ts 里面已經(jīng)聲明了
        * 然后 return 即會觸發(fā) typescript 的類型推斷,因此推斷出 data 的類型了
    */
  const { data } = await getSomething(6);
  // do something
};

經(jīng)驗(踩坑)

Taro-cropper 在某些情況下“完成”按鈕沒顯示出來:

雖然不知道具體原因,但是翻看其源碼可以看到它的 props 里有一行注釋:

hideFinishText: boolean,    // 隱藏完成按鈕(可以自己實現(xiàn),然后調(diào)用本實例的cut方法進(jìn)行剪裁)

因此,解決方案就是自己實現(xiàn)一份“完成”按鈕,Over。

帶分頁數(shù)據(jù)的實時刷新方案:

可以以第一頁的數(shù)據(jù)為模板,在輪詢的時候進(jìn)行比較,如果出現(xiàn)差異,則為(數(shù)據(jù))有更新,然后更新數(shù)據(jù)為最新第一頁數(shù)據(jù)即可。

export default 不能正確解構(gòu):

export default 經(jīng)過了 webpack的構(gòu)建后,會變成類似:

import a from './a'
a.default.b

因此無法通過解構(gòu) a 來拿到 b,如果想要能正確解構(gòu)拿到變量,盡量這樣操作:

export const b = 1

具體參考:https://www.cnblogs.com/pixcai/p/5597109.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • React Hooks Hook是React v16.8的新特性,可以用函數(shù)的形式代替原來的繼承類的形式,可以在不...
    左冬的博客閱讀 880評論 0 1
  • 前言 Hook 是 React 16.8 的新增特性。它可以讓你在不編寫 class 的情況下使用 state 以...
    嫩大叔Cliock閱讀 665評論 0 0
  • 一、場景 先理解什么是 hook,react 對它的定義是: 它可以讓你在不編寫 class 的情況下,讓你在函數(shù)...
    AizawaSayo閱讀 1,757評論 0 2
  • 前言 本文全面介紹了React Hooks的所有API概念、用法、豐富的demo以及部分底層原理。 實際上,Rea...
    南宮__閱讀 3,781評論 0 6
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險厭惡者,不喜歡去冒險,但是人生放棄了冒險,也就放棄了無數(shù)的可能。 ...
    yichen大刀閱讀 7,871評論 0 4

友情鏈接更多精彩內(nèi)容