2个奇怪的react写法
ref的奇怪用法
这是一段初看让人很困惑的代码:
function App() {
const [dom, setDOM] = useState(null);
return <div ref={setDOM}></div>;
}让我们来分析下它的作用。
首先,ref有两种形式(曾经有3种):
- 形如
{current: T}的数据结构 - 回调函数形式,会在
ref更新、销毁时触发
例子中的setDOM是useState的dispatch方法,也有两种调用形式:
- 直接传递更新后的值,比如
setDOM(xxx) - 传递更新状态的方法,比如
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写法呢?
相关文章
react-native 配置@符号绝对路径配置和绝对路径没有提示的问题
本文主要介绍了react-native 配置@符号绝对路径配置和绝对路径没有提示的问题,文中通过图文示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2024-01-01
React报错信息之Expected an assignment or function call and
这篇文章主要介绍了React报错之Expected an assignment or function call and instead saw an expression,下面有两个示例来展示错误是如何产生的,需要的朋友可以参考下2022-08-08
详解React中传入组件的props改变时更新组件的几种实现方法
这篇文章主要介绍了详解React中传入组件的props改变时更新组件的几种实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-09-09
React 进入页面后自动 focus 到某个输入框的解决方案
React.js 当中提供了 ref 属性来帮助我们获取已经挂载的元素的 DOM 节点,你可以给某个 JSX 元素加上 ref属性,这篇文章主要介绍了React 进入页面以后自动 focus 到某个输入框,需要的朋友可以参考下2024-02-02


最新评论