当前位置: 首页 > 面试题库 >

理解React Hooks的``穷尽-下降''棉绒规则

空成天
2023-03-14
问题内容

我很难理解“穷尽”的皮棉规则。

这是一个带有lint问题的简单React组件:

const MyCustomComponent = ({onChange}) => {
    const [value, setValue] = useState('');

    useEffect(() => {
        onChange(value);
    }, [value]);

    return (
        <input 
           value={value} 
           type='text' 
           onChange={(event) => setValue(event.target.value)}>
        </input>
    )
}

它要求我添加onChangeuseEffect依赖项数组。但是据我了解onChange,它永远不会改变,因此它不应该存在。

通常我是这样管理的:

const MyCustomComponent = ({onChange}) => {
    const [value, setValue] = useState('');

    const handleChange = (event) => {
        setValue(event.target.value);
        onChange(event.target.value)
    }

    return (
        <input value={value} type='text' onChange={handleChange}></input>
    )
}

为什么皮棉?关于第一个示例的皮棉规则有任何清楚的解释吗?

还是我不应该useEffect在这里使用?(我是一个带钩的菜鸟)


问题答案:

linter规则希望onChange进入useEffect钩子的原因是因为可以onChange在渲染之间进行更改,并且lint规则旨在防止此类“陈旧数据”引用。

例如:

const MyParentComponent = () => {
    const onChange = (value) => { console.log(value); }

    return <MyCustomComponent onChange={onChange} />
}

的每个渲染MyParentComponent都会将不同的onChange函数传递给MyCustomComponent

在您的特定情况下,您可能并不在意:您只想onChange
在值更改时调用,而不在onChange函数更改时调用。但是,从使用方式上还不清楚useEffect

useEffect究其根源,是您有点单调。

useEffect最好用于副作用,但是在这里,您将其用作一种“订阅”概念,例如:“当Y更改时执行X”。由于deps数组的机制,该功能在功能上确实可以工作(尽管在这种情况下,您还需要调用onChange初始渲染,这可能是不必要的),但这并不是预期的目的。

onChange在这里,调用确实不是副作用,而只是触发onChange事件的效果<input>。因此,我确实认为您的第二个版本同时调用onChange和调用setValue起来更惯用。

如果还有其他设置值的方法(例如,清除按钮),则经常需要记住要调用它,这onChange可能很乏味,因此我可以这样写:

const MyCustomComponent = ({onChange}) => {
    const [value, _setValue] = useState('');

    // Always call onChange when we set the new value
    const setValue = (newVal) => {
        onChange(newVal);
        _setValue(newVal);
    }

    return (
        <input value={value} type='text' onChange={e => setValue(e.target.value)}></input>
        <button onClick={() => setValue("")}>Clear</button>
    )
}

但是在这一点上,这是分裂头发的。



 类似资料:
  • 出于某种原因,我的应用程序突然无法再构建了。首先我有颤振devtools问题,然后我升级到颤振2.8。1现在我的应用程序无法生成。我试着把Gradle升级到7.3。3和JDK 17,但我的应用程序无法构建,我搜索了整个GitHub和StackOverflow,但找不到解决方案。 这是我的第一个错误: 我通过添加以下内容来修正: 去gradle.properties. 但是现在当我试图构建时,我得到

  • 我试图绘制一个核心图形图像生成(在屏幕分辨率)到OpenGL。然而,图像呈现的别名比CG输出的更多(在CG中禁止抗锯齿)。文本是纹理(蓝色背景分别在核心图形中为第一幅图像绘制,在OpenGL中为第二幅图像绘制)。 OpenGL渲染(在模拟器中): Framebuffer设置:

  • 我正在用Clojure创建一些专家系统,我需要开发递归下降解析器,用于从文本文件中读取规则并从中创建Clojure函数。我写了一个函数,它检查文本文件是否符合我的语法,它给我一个字符串列表,其中包含函数名、数字、系统事实名称、算术和逻辑运算符等元素。这就是我的语法: 这就是我检查语法的功能: 现在我想从上面函数给我的字符串列表中创建一个Clojure函数。你知道怎么做吗? 更新这里是一个规则和硬编

  • 可能在内部使用的代码将在规则之后被取消,如下所示: ANTLR4就是这样做事的吗?

  • 本文向大家介绍简述下你理解的优雅降级和渐进增强相关面试题,主要包含被问及简述下你理解的优雅降级和渐进增强时的应答技巧和注意事项,需要的朋友参考一下 我个人的观点是。不管是哪种都需要先有一个结实的基本html框架才行。字面上说优雅降级和渐进增强都是先开发一个最高或最低版本,然后按需增加适应。但是如果在前期没有搭好一个健壮的框架,那后面有一些功能实现上,难免可能会修改html结构,这就导致前面写好的内

  • 如果您打开枚举,但既不涵盖所有情况也不提供默认值,则获取编译器警告很有用。本网站上的其他答案建议javac应该提供这样的警告。 我正在使用Maven,并在pom.xml中添加了以下内容,试图启用所有警告: 但是编译器仍然对我的代码中的非exhasting switch语句保持沉默。我是否可以设置其他标志来启用此类警告?