两个奇怪的React写法,你还遇到哪些奇怪的React写法呢?

开发 前端
虽然React官网用大量篇幅介绍最佳实践,但因JSX语法的灵活性,所以总是会出现奇奇怪怪的React写法。

大家好,我卡颂。

虽然React官网用大量篇幅介绍最佳实践,但因JSX语法的灵活性,所以总是会出现奇奇怪怪的React写法。

本文介绍2种奇怪(但在某些场景下有意义)的React写法。

ref的奇怪用法

这是一段初看让人很困惑的代码:

function App() {
const [dom, setDOM] = useState(null);

return <div ref={setDOM}></div>;
}

让我们来分析下它的作用。

首先,ref有两种形式(曾经有3种):

  1. 形如{current: T}的数据结构
  2. 回调函数形式,会在ref更新、销毁时触发

例子中的setDOM是useState的dispatch方法,也有两种调用形式:

  1. 直接传递更新后的值,比如setDOM(xxx)。
  2. 传递更新状态的方法,比如setDOM(oldDOM => return /* 一些处理逻辑 */)。

在例子中,虽然反常,但ref的第二种形式和dispatch的第二种形式确实是契合的。

也就是说,在例子中传递给ref的setDOM方法,会在「div对应DOM」更新、销毁时执行,那么dom状态中保存的就是「div对应DOM」的最新值。

这么做一定程度上实现了「感知DOM的实时变化」,这是单纯使用ref无法具有的能力。

useMemo的奇怪用法

通常我们认为useMemo用来缓存变量props,useCallback用来缓存函数props。

但在实际项目中,如果想通过「缓存props」的方式达到子组件性能优化的目的,需要同时保证:

  • 所有传给子组件的props的引用都不变(比如通过useMemo)。
  • 子组件使用React.memo。

类似这样:

function App({todos, tab}) {
const visibleTodos = useMemo(
() => filterTodos(todos, tab),
[todos, tab]);

return <Todo data={visibleTodos}/>;
}

// 为了达到Todo性能优化的目的
const Todo = React.memo(({data}) => {
// ...省略逻辑
})

既然useMemo可以缓存变量,为什么不直接缓存组件的返回值呢?类似这样:

function App({todos, tab}) {
const visibleTodos = useMemo(
() => filterTodos(todos, tab),
[todos, tab]);

return useMemo(() => <Todo data={visibleTodos}/>, [visibleTodos])
}

function Todo({data}) {
return <p>{data}</p>;
}

如此,需要性能优化的子组件不再需要手动包裹React.memo,只有当useMemo依赖变化后子组件才会重新render。

总结

除了这两种奇怪的写法外,你还遇到哪些奇怪的React写法呢?

责任编辑:姜华 来源: 魔术师卡颂
相关推荐

2022-06-10 08:01:17

ReduxReact

2022-02-21 06:02:49

Strve.jsCodepenReact

2021-07-02 05:31:53

ReactSolidJS前端

2020-09-14 15:57:53

Vue和React

2022-05-09 10:47:08

登录SpringSecurity

2021-07-26 09:00:08

ReactHooks 项目

2020-08-02 22:54:04

Python编程语言开发

2009-06-08 20:05:14

Eclipse deb

2009-09-14 19:25:09

Ruby form

2021-05-30 07:59:00

String引用类型

2024-04-03 08:47:58

React服务端组件Actions

2013-04-17 10:34:55

.NET大对象堆

2015-08-11 08:51:40

游戏死亡

2015-07-13 09:04:10

互联网设备设备

2022-08-14 23:04:54

React前端框架

2020-09-09 07:55:51

TS开源符号

2019-09-21 21:32:34

数据库SQL分布式

2013-12-02 14:53:20

jQuery插件

2012-06-18 17:01:55

Windows RT微软

2018-01-24 18:00:21

LinuxDebianvim
点赞
收藏

51CTO技术栈公众号