react教程,被神化的useDebugValue的使用场景是什么?
发布于 作者:苏南大叔 来源:程序如此灵动~react
项目里面,“使用useDebugValue()
代替大家常用的console.log()
,来更方便的查看数据”,这样的言论在网上甚为流传。但是,苏南大叔并不同意这样的观点。只是在非常有限的场景下,useDebugValue()
可以替代console.log()
。
苏南大叔的程序如此灵动,记录苏南大叔的代码所想。测试环境:create-react-app@5.0.1
,react@18.2.0
,react-dom@18.2.0
,node@16.14.2
。
useDebugValue()
限制很多
这个useDebugValue()
函数确实是个比较另类的函数,它的正常使用是有诸多限制的。所以,想替换console.log()
,那就仅仅是个极其美好的梦想。苏南大叔建议您,别试图这样做。useDebugValue()
只能在非常有限的场景下,可以实现替换console.log()
查看数据效果。
useDebugValue()
的调试效果,在react-dev-toolbar
里面看到效果。参考文字:
https://newsn.net/say/react-devtools.html
useDebugValue()
,以use
开头。所以,它在react
里面,是个只能用于函数式组件自定义hook
。参考:
https://newsn.net/say/react-hook-diy.html
id | 描述 |
---|---|
1 | useDebugValue() 放在普通的函数里面(非组件非use )的话,直接报错。 |
2 | useDebugValue() 可以在放在函数式组件主体逻辑里面,不报错,但没有地方看效果(toolbar 里面没有)。 |
3 | useDebugValue() 只能用于自定义hook 代码里面,而且连自定义hook 代码内部的普通函数内,也不能用,直接报错。 |
综上所述,useDebugValue()
代替console.log()
?这是个无法完成的伟大梦想。
相关报错信息:
React Hook "useDebugValue" is called in function "setCountDiy" that is neither a React function component nor a custom React Hook function. React component names must start with an uppercase letter. React Hook names must start with the word "use" react-hooks/rules-of-hooks
useDebugValue()
使用姿势
useDebugValue()
有两个参数,个人觉得就第一个参数就够用了,第二个参数似乎是有些多余。怎么说呢?因为第二个参数它的效果是个回调函数,是个函数内部的函数,对第一层的第一个参数进行加工,然后返回个新的加工后的变量。(在最终的显示效果上,替代第一个变量...)
useDebugValue("调试信息", (val) => {
return "调试信息的再加工结果" // val 就是 "调试信息" 这几个字!!!
});
官方说,这个useDebugValue()
函数内部的函数,调用时机是:Hook
被检查时才会被调用。暂时无法理解,打开toolbar
对他们进行检查,难道不是唯一的使用场景么?
第一个例子
这里的例子,还是基于苏南大叔的上一个自定义hook
的例子,参考文字:
https://newsn.net/say/react-hook-diy.html
import React, { useState, useDebugValue } from 'react';
function useDiy2(num) {
useDebugValue('可单独使用第一个参数');
useDebugValue('可单独使用第一个参数', (val) => {
return "或者通过第二个参数再格式化一下" + Date.now() + val
});
const [count, setCount] = useState(num);
const setCountDiy = (who) => {
// useDebugValue('不能放在普通函数里面', (val) => {
// return "只能放在组件或者use函数里面"
// });
console.log(who + ":" + count);
setCount(count + 2);
}
return [count, setCountDiy];
}
function App() {
const [count2, setCount2] = useDiy2(10);
useDebugValue('可以放在组件里面,不报错但没效果', (val) => {
return val + "," + count2
});
return (<>
{count2}
<button onClick={() => setCount2("苏南大叔")}>这不是个use,所以不能用useDebugValue</button>
</>);
}
export default App;
运行的效果,如下图所示:
可以看到:useDebugValue()
函数的使用场景,确确实实是被神化了,真的没有网络教程上所说的那么好用,很鸡肋。
第二个例子
下面有另外一个使用useDebugValue()
的例子,大家看需查看。
https://github.com/SyncfusionExamples/custom-hook-debugging-with-useDebugValue
结束语
苏南大叔的react
相关经验文字,请点击:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。