柯里反应过来

柯里反应过来

原文:https://medium.com/hackernoon/curry-away-in-react-7c4ed110c65a

Disclaimer: You may or may not have improved your curry making skills by the end of this blog

因此,你将建立一个销售狗用品的下一代电子商务公司,你已经决定使用 React 来建立它,因为,你知道,它现在非常流行,选择前端框架是建立任何成功的在线业务的“第一步,也是最重要的一步”。

我想分享我在建立自己的电子商务网站时学到的一个巧妙的技巧,显然是下一代的 coz React!

基于各个方面过滤产品是任何购物网站的主要功能,因此让我们在产品结果页面中添加一些过滤器。

This is where our customers filter and find the right products for their dogs :)

正如任何“优秀”的 React 开发人员所做的那样,让我们将这个 UI 分解成个组件,这在我们的例子中非常简单。

This is what React developers see when they visit any webpage :D

接下来,让我们识别应用程序中的状态。这里可能被视为状态的唯一数据片段是过滤器选择。其他数据,产品列表可能会作为道具传递下去,不会发生变化。

filterSelections是一个对象,包含页面中每个过滤器的选定值。

filterSelections = {
  price: ...,
  ages: ...,
  brands: ...,
}

因为Products组件是包含需要filterSelections(FiltersProductResults组件)的组件的公共父组件,所以它将是这个状态的合适位置。

在接收到作为道具的filterSelections之后,Filters组件将把相关的过滤器值传递给它的每个子组件。

filterSelections也将被传递到ProductResults组件中,以便可以应用过滤器,并且只显示相关产品。

这些过滤器不能只是静态控件,我们需要它们在客户调整过滤器时更新filterSelections

我们将filterSelections作为道具传递给过滤器,我们知道道具在 React 中是不可变的。那么我们在哪里变异filterSelections呢?答案应该是Products组件,因为它是filterSelections的所有者,它的状态是

让我们继续添加一组更改处理程序函数,这样对过滤器选择的任何更改都会传播到发生实际变化的Products组件。

这里是Products组件。

Filters组件。

这非常简单,而且可行。但是我们在Filters组件中有一堆函数,它们似乎都在做非常相似的事情。

如果我们将来添加一种新的过滤器,我们将需要在这个组件中编写另一个类似的函数。

去营救

这就是诀窍所在,这是一个流行且听起来很有趣的功能性编程概念,叫做 currying。

在讨论 curry 之前,我想向您展示它如何帮助清理我们的组件。你自己看看—

整洁对吗?现在updatedSelections功能据说被柯里化了。对于函数式编程爱好者来说,这是一个非常简单明了的概念。但是对于像我这样一直生活在强制性的面向对象方面的人来说,这很难理解。所以让我们打开它。

当我说updatedSelections()函数已经被 curried 时,你可能想知道这个函数的“未被 curried”版本会是什么样子。这里是如何—

如果我们要使用这个而不是我们的 curried 版本,我们需要让每个过滤器组件子组件自己调用updateSelections,因此必须让它们知道它们需要更新的filterSelections中的属性名,这是一个太多的耦合。

另一种方法是为每个滤波器组件使用一个专用函数,这将导致我们已经看到的混乱局面。

我们的解决方案是库里这个功能。

什么是 currying?

Currying 将一个函数f转换成一个函数f',该函数接受f最初需要的参数的一部分,并返回另一个函数,该函数可以接受其余的参数,返回f的结果,或者可以自己 curry。

具体来说,用这个简单的add函数,

add = (x, y) => x + y;

当咖喱出现时,它变成了—

curriedAdd = (x) => {
  return (y) => {
    return x + y;
  }
}

因此,我们可以调用返回新函数的curriedAdd(1),而不是调用add(1, 2),我们可以随后使用add的另一个参数调用它,就像curriedAdd(1)(2)一样,并获得最终结果3

从技术上来说,curriedAdd(x)被称为“部分应用”,因为我们只应用了原始函数add(X, y)需要的部分参数。

使用常规函数,让我们对它执行部分应用。

这是一个天真的玩具例子,没有太多的效用。

现在,如果我们回到最初的例子—

我们可以看到updateSelections函数的部分应用——

updateSelections('ages');
updateSelections('brands');
updateSelections('price');

帮助我们清理组件并减少耦合。那是 currying:)

像软件中的所有问题一样,这不是这个问题的唯一解决方案。这里有一个替代方案—

我希望您发现这种技术很有用。如果你在你的 JavaScript / React 项目中使用了 currying,请在下面的评论中分享一些片段,也欢迎你的其他评论和反馈,❤.

您是否打算雇佣 JavaScript、React 或 Ruby 开发人员来完成您的项目?访问 spritle.com 的,雇佣我们的一流团队,让您的想法变成现实。


本站为非盈利网站,作品由网友提供上传,如无意中有侵犯您的版权,请联系删除