我的前端笔记

目录

  • react
  • 小程序
  • vue
  • typescript
  • 经验(踩坑)

react

useMemo 和 useCallback 都是用来做性能优化的,把 useMemo 当成一个值,把 useCallback 当成一个函数即可。

详见 useMemo 与 useCallback 源码解析

useEffect

useEffect 是在布局(layout)和绘制(paint)之后触发的。

useEffect 不提供依赖数组和提供空数组有什么区别?

给它一个空数组就像 componentDidMount 一样,它只运行一次。

不给它第二个参数充当 componentDidMount 和 componentDidUpdate ,因为它首先在安装上运行,然后在每次重新渲染时运行。

useEffect 忽略依赖列表的 functions 时, 是否安全?

答案是,否。看个示例:

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

可以改进一下,将 function 丢进 useEffect 的回调里:

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

也可以使用 useCallback 包裹函数:

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

useCallback

使用空数组作为输入的 useCallback 和没有第二个参数的 useCallback 之间有什么区别?

如果第二个参数是一个空数组,则该值将被内存一次并始终返回。
如果省略第二个参数,该值将永远不会被内存。

useLayoutEffect

useEffect 和 useLayoutEffect 的区别:

useEffect 是异步执行的,而useLayoutEffect是同步执行的。

useEffect 的执行时机是浏览器完成渲染之后,而 useLayoutEffect 的执行时机是浏览器把内容真正渲染到界面之前,和 componentDidMount 等价。

一般会影响到渲染的操作尽量放到 useLayoutEffect 中去,避免出现闪烁问题。

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

小程序

使用 Component 来实现接收跳转参数,无需通过 onLoad 的 options 参数获取哦:

只需在 Component 里面声明 properties 即可, 别的页面跳转过来待参,就可以通过 this.data 获取到相应的 property。

普通页面:

<navigator url="/pages/组件页面?activeIndex=1">我是跳转按钮</navigator>

组件页面:

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

小程序页面返回带参方案:

通过 navigateTo 的 success 的 response 里的 eventChannel 来向目标页发布事件,而目标页可通过this.getOpenerEventChannel() 来监听事件,示例:

// 当前页
wx.navigateTo({
    url,
    success: ({ eventChannel }) = >{
        eventChannel.emit('init', {
            a: 1
        });
    }
});
// 目标页
ready() {
    this.getOpenerEventChannel().on('init', ({
        a
    }) = >{
        // doSomething
    });
}

ios 扫小程序码没有进入小程序,而是进入一个空白网页:

ios 需要有权限才可访问小程序,改 appid,需要已经添加过开发者的 appid

vue

自动引入路由实现方案:(底层是利用 require.context api 实现,即是说,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 中当一个变量为 object 或 null 时,使用解构赋值可能报错的解决方法(在变量后面加个!即可):

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

类型推断

可以合理利用类型推断,节省返回参数声明。
示例:

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

// index.ts
import { getSomething } from './api';
const _getSomething = async () => {
    /** 
        * 此处的 data 可以不做类型声明,因为在 api.ts 里面已经声明了
        * 然后 return 即会触发 typescript 的类型推断,因此推断出 data 的类型了
    */
  const { data } = await getSomething(6);
  // do something
};

经验(踩坑)

Taro-cropper 在某些情况下“完成”按钮没显示出来:

虽然不知道具体原因,但是翻看其源码可以看到它的 props 里有一行注释:

hideFinishText: boolean,    // 隐藏完成按钮(可以自己实现,然后调用本实例的cut方法进行剪裁)

因此,解决方案就是自己实现一份“完成”按钮,Over。

带分页数据的实时刷新方案:

可以以第一页的数据为模板,在轮询的时候进行比较,如果出现差异,则为(数据)有更新,然后更新数据为最新第一页数据即可。

export default 不能正确解构:

export default 经过了 webpack的构建后,会变成类似:

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

因此无法通过解构 a 来拿到 b,如果想要能正确解构拿到变量,尽量这样操作:

export const b = 1

具体参考:https://www.cnblogs.com/pixcai/p/5597109.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • React Hooks Hook是React v16.8的新特性,可以用函数的形式代替原来的继承类的形式,可以在不...
    左冬的博客阅读 763评论 0 1
  • 前言 Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以...
    嫩大叔Cliock阅读 545评论 0 0
  • 一、场景 先理解什么是 hook,react 对它的定义是: 它可以让你在不编写 class 的情况下,让你在函数...
    AizawaSayo阅读 1,405评论 0 2
  • 前言 本文全面介绍了React Hooks的所有API概念、用法、丰富的demo以及部分底层原理。 实际上,Rea...
    南宫__阅读 3,560评论 0 6
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,030评论 0 4