功能组件定义范围导致应用无法正常运行,但我不明白为什么

扎卡里

我是React的资深人士,但是我对在React 16中使用钩子和闭包还是比较陌生的,我发现有些根本上对我没有意义的事情。在我的应用程序中,我有无数个示例,其中当状态var发生变化时,UI会闪烁或重新布置所有内容,但是直到今天,当使用动画时,才可以明显看出它在定义我的Functional组件的范围内起作用。(如果相关,该应用程序将基于Next.js btw构建!)

考虑以下ExperienceBuilder页面,页面允许用户编辑文档。有一个可以打开和关闭的右侧菜单-可以动画显示。跟踪是否应显示菜单的状态由父级管理,但动画是使用RightMenuContainerComponent内部的Tailwind CSS处理的当我在独立的范围内实现它们时,一切都将完美运行:

const RightMenuContainer = props => {
    return (
      <div className={props.isOpen ? '' :'transform translate-x-full -mr-90'}>
         {/* ...buttons and stuff... */}
      </div>
    )
}

const ExperienceBuilder = props => {
    [isOpen, setIsOpen] = useState(true)
    return (
      <>
        <RightMenuContainer isOpen={isOpen} >
        <Button onClick={() => setIsOpen(!isOpen)} title={isOpen ? "Show Menu" : "Hide Menu"} />
        {/* ...other stuff in the main container... */}
      </>
    )
}

但是,一旦我将移到的RightMenuContainer内部ExperienceBuilder它将停止工作!

const ExperienceBuilder = props => {
    [isOpen, setIsOpen] = useState(true)
    
    const RightMenuContainer = props => {
        return (
            <div className={props.isOpen ? '' :'transform translate-x-full -mr-90'}>
                {/* ...buttons and stuff... */}
            </div>
        )
    }
    
    return (
      <>
        <RightMenuContainer isOpen={isOpen} >
        <Button onClick={() => setIsOpen(!isOpen)} title={isOpen ? "Show Menu" : "Hide Menu"} />
        {/* ...other stuff in the main container... */}
      </>
    )
}

在这一点上,我意识到我应该以第一种方式实现事情,以免出现错误,但是了解WHY确实很有帮助。99%的时间,后一个示例可以正常工作,并且使子级对象在范围内的编码速度更快,因为我的子级组件可以读取父级状态,而无需将状态作为prop传入。我的希望是,如果我能了解引擎盖下发生的事情,那么我可以做出更好的设计决策,以决定何时值得把弯角和使组件纳入范围,以及何时不值得。

我尝试过的事情没有帮助:

  • 通过以下方式记忆功能组件 React.memo
  • 更改props变量名以避免与状态变量名潜在冲突
布扎托

您的组件正在全部安装和卸载,如果添加,useEffect您将看到:

const RightMenuContainer = props => {
    useEffect(() => console.log('mount'),[]) // empty array only executes on mount

    return (
        <div className={props.isOpen ? '' :'transform translate-x-full -mr-90'}>
            {/* ...buttons and stuff... */}
        </div>
    )
}

在每次重新ExperienceBuilder渲染时,RightMenuContainer都会创建一个新功能。由于动画仅在已安装组件的情况下发生,因此动画不起作用。

要解决此问题,在您的情况下,请使用useCallback包装函数,并使用另一个空数组[]作为参数来记住您的函数:

const RightMenuContainer = React.useCallback(props => {
    useEffect(()=>{console.log('mount')}, [])

    return (
        <div className={props.isOpen ? '' :'transform translate-x-full -mr-90'}>
          {/* ...buttons and stuff... */}
        </div>
    )
},[]) 

这样它将记住您的功能组件,您可以检查它console.log('mount')仅显示一次

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我不明白为什么Redirect()无法正常工作

来自分类Dev

我不明白为什么charindex无法正常工作

来自分类Dev

不归还烧瓶,但我不明白为什么

来自分类Dev

我无法上传大于 10 MB 的文件,但我不明白为什么?

来自分类Dev

未定义的索引,但我不明白为什么

来自分类Dev

我不明白为什么我的冒泡排序代码无法正常工作

来自分类Dev

我不明白为什么我的冒泡排序代码无法正常工作

来自分类Dev

我不明白为什么我的“如果”命令无法正常工作

来自分类Dev

此do-while循环无法正常工作,我不明白为什么

来自分类Dev

我不明白为什么这个@selector无法正常工作

来自分类Dev

我不明白为什么状态是未定义的?

来自分类Dev

我不明白为什么它无法连接

来自分类Dev

我的代码中出现KeyError:'',但我不明白为什么

来自分类Dev

我已经写了这段代码,但我不明白为什么它会像这样工作

来自分类Dev

我“解决”了 FizzBuzz,但我不明白它为什么有效

来自分类Dev

我知道这个程序的答案,但我不明白为什么?

来自分类Dev

我的React应用程序代码不断给出错误“无法读取未定义的属性'fname'”,我不明白为什么

来自分类Dev

TypeScript不允许算术运算符,但我不明白为什么

来自分类Dev

TypeScript不允许算术运算符,但我不明白为什么

来自分类Dev

Python函数卡住(无错误),但我不明白为什么

来自分类Dev

我不明白为什么我的 JS 函数会导致错误

来自分类Dev

我不明白为什么我的自定义自定义CSS被覆盖

来自分类Dev

我不明白为什么我尝试时我的代码无法采用CSS

来自分类Dev

不明白为什么 .stream() 工作正常但 .parallelStream() 不

来自分类Dev

我不明白为什么我的for循环返回“未定义”

来自分类Dev

我有这个错误:无法读取null的属性“值”,我不明白为什么

来自分类Dev

我不明白为什么我的波形是这样出来的

来自分类Dev

收到运行时错误1004,我不明白为什么

来自分类Dev

不明白为什么我的程序以它原本的方式运行

Related 相关文章

  1. 1

    我不明白为什么Redirect()无法正常工作

  2. 2

    我不明白为什么charindex无法正常工作

  3. 3

    不归还烧瓶,但我不明白为什么

  4. 4

    我无法上传大于 10 MB 的文件,但我不明白为什么?

  5. 5

    未定义的索引,但我不明白为什么

  6. 6

    我不明白为什么我的冒泡排序代码无法正常工作

  7. 7

    我不明白为什么我的冒泡排序代码无法正常工作

  8. 8

    我不明白为什么我的“如果”命令无法正常工作

  9. 9

    此do-while循环无法正常工作,我不明白为什么

  10. 10

    我不明白为什么这个@selector无法正常工作

  11. 11

    我不明白为什么状态是未定义的?

  12. 12

    我不明白为什么它无法连接

  13. 13

    我的代码中出现KeyError:'',但我不明白为什么

  14. 14

    我已经写了这段代码,但我不明白为什么它会像这样工作

  15. 15

    我“解决”了 FizzBuzz,但我不明白它为什么有效

  16. 16

    我知道这个程序的答案,但我不明白为什么?

  17. 17

    我的React应用程序代码不断给出错误“无法读取未定义的属性'fname'”,我不明白为什么

  18. 18

    TypeScript不允许算术运算符,但我不明白为什么

  19. 19

    TypeScript不允许算术运算符,但我不明白为什么

  20. 20

    Python函数卡住(无错误),但我不明白为什么

  21. 21

    我不明白为什么我的 JS 函数会导致错误

  22. 22

    我不明白为什么我的自定义自定义CSS被覆盖

  23. 23

    我不明白为什么我尝试时我的代码无法采用CSS

  24. 24

    不明白为什么 .stream() 工作正常但 .parallelStream() 不

  25. 25

    我不明白为什么我的for循环返回“未定义”

  26. 26

    我有这个错误:无法读取null的属性“值”,我不明白为什么

  27. 27

    我不明白为什么我的波形是这样出来的

  28. 28

    收到运行时错误1004,我不明白为什么

  29. 29

    不明白为什么我的程序以它原本的方式运行

热门标签

归档