小编Chi*_*672的帖子

React useReducer Hook触发两次/如何将道具传递给reducer?

前言/说明

我正在尝试将React的新挂钩函数用于我正在构建的电子商务网站,但是在解决购物车组件中的错误时遇到了问题。

我认为以我想通过使用多个Context组件保持全局状态模块化的事实作为开始讨论的重点。对于我提供的商品类型,我有一个单独的上下文组件,对于一个人的购物车中的商品,我有一个单独的上下文组件。

问题

我遇到的问题是,当我调度将组件添加到购物车的操作时,减速器将运行两次,就像我两次将商品添加到购物车一样。但是仅当它最初被渲染时,或者由于诸如显示之类的奇怪原因而被设置为hidden,然后又返回到block或由于z-index和可能的其他类似更改而改变。

我知道这有点冗长,但这是一个很挑剔的问题,因此我创建了两个演示该问题的代码笔:

完整的例子

最小的例子

您将看到我包含一个用于切换display组件的按钮。这将有助于展示CSS与问题的相关性。

最后,请用代码笔监视控制台,这将显示所有按钮的单击以及每个reducer的哪一部分已运行。在完整示例中,问题最明显,但在最小示例中,控制台语句显示了该问题。

问题区域

我已查明该问题与以下事实有关:我正在使用useContext挂钩的状态来获取项目列表。调用了一个函数来为我的useReducer钩子生成化简器,但是仅当使用了另一个钩子时才出现,我可以使用像钩子一样不会重新评估的函数,并且没有问题,但是我还需要我以前的上下文中的信息,因此解决方法无法真正解决我的问题。

相关连结

我已确定问题不是HTML问题,因此我将不包含我尝试过的HTML修复程序的链接。这个问题虽然是由CSS触发的,但并非植根于CSS,因此我也不会包含CSS链接。

useReducer操作分派两次

javascript reactjs react-context react-hooks

11
推荐指数
1
解决办法
2821
查看次数

为什么使用add_library({tgt} IMPORTED)与target_link_libraries(-l {.so | .a})?

使用该声明的目的是什么:

add_library(<tgt> [SHARED|STATIC] IMPORTED)
Run Code Online (Sandbox Code Playgroud)

根据我的发现,即使您在上面创建导入的库目标,您仍然需要指定实际的.so或.a的具体位置.这将需要至少3个cmake命令链接到可执行文件,编译器仍然不会自动搜索操作系统上的公共包含目录.

示例: 用于链接IMPORTED lib的cmake代码

从我理解的CMake文档中,有三种方法可以链接未在整个应用程序/库的子项目中构建为目标的库.

CMake target_link_libraries()文档

  1. 将CMake软件包用于其中一个随附的软件包脚本.
  2. 使用链接器标志:

    target_link_libraries(<tgt> [SHARED|STATIC|...] -lncursesw)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 或者使用IMPORTED库方法(在顶部的代码中展示).

使用第二种方法时的一个主要区别是它只需要一行代码,并将搜索您操作系统上所有编译器的预定义包含目录.任何人都可以帮我理解为什么使用add_library()方法?


其他相关的SO帖子:

包含IMPORTED库的目录

CMake导入的库行为

cmake build-system libraries

6
推荐指数
1
解决办法
3049
查看次数