介绍

我有这个密码:

import React, { Component } from 'react';
import { View, Button } from 'react-native';

export default function App() {
  const myMethod = (name) => {
    console.log(`Hello ${name}!`);
  };

  return (
    <View>
      <Button onPress={() => myMethod("Victor")}>
        Press me!
      </Button>
    </View>
  );
}

然后,我决定用curried函数重构它.这样地:

import React, { Component } from 'react';
import { View, Button } from 'react-native';

export default function App() {
  /**
   * @param {string} name - The name.
   * @returns {Function} Curried function.
   */
  const myMethod = (name) => {
    return () => {
      console.log(`Hello ${name}!`);
    }
  };

  return (
    <View>
      <Button onPress={myMethod("Victor")}>
        Press me!
      </Button>
    </View>
  );
}

如您所见,我调用该方法的方式已经改变,因为我返回的是一个函数,而不是myMethod中的void.这很酷,很有效...每次按下按钮,就会调用我的方法.

判断这小吃:https://snack.expo.dev/Rx3iBVT_W

问题

现在,我试图用curry from Lodash来重构重构代码.

这就是我try 过的:

import React, { Component } from 'react';
import { View, Button } from 'react-native';
import { curry } from 'lodash';

export default function App() {
  const myMethod = curry((name) => {
    console.log(`Hello ${name}!`);
  });

  return (
    <View>
      <Button onPress={myMethod("Victor")}>
        Press me!
      </Button>
    </View>
  );
}

但出于某种原因,这是行不通的.该方法不会在每次按下按钮时执行...相反,它在组件装载时被调用.

我该怎么解决呢?

判断这小吃:https://snack.expo.dev/bna6cLkhp

推荐答案

恐怕你误解了currying(这很容易做到,很多人都误解了——包括我自己).

然后,我决定用curried函数重构它.这样地:

这段代码不会产生函数.它只是在name参数上创建一个闭包.这叫partial application.

Lodash's curry做的是咖喱.它返回的函数将在满足其所有参数后立即执行其工作——在您的情况下,只要您为其提供所需的名称.所以当你做myMethod("Victor")时,它就开始工作了,而不是以后:

const myMethod = _.curry((name) => {
    console.log(`Hello ${name}!`);
});

myMethod("Victor");
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>

如果希望它等待第二个参数,则需要告诉curry函数需要两个参数,然后为其提供两个参数(在本例中,每次一个):

const myMethod = _.curry((name) => {
    console.log(`Hello ${name}!`);
}, 2);
// ^−−−−−−− tells `curry` this function needs two arguments, even
//          though the function itself says it only needs 1

console.log("Supplying the first argument");
const fn = myMethod("Victor");
console.log("Supplying the second argument");
fn({}); // <== Note the argument, we need to supply one
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>

这是因为我们告诉curry,你的函数需要有两个参数,而myMethod("Victor")只给它一个,所以当你给它另一个参数时,它会返回另一个函数来完成它的工作.onPress将给它第二个参数,因为它将事件对象传递给它.

查看curry个文档了解更多示例.

也就是说,我不会在这里用curry.你不是真的在讨好,所以这有点误用.我会使用你的部分应用程序解决方案,如果我必须将名称烘焙到函数中的话.

Javascript相关问答推荐

如何比较嵌套对象的更改并创建更改报告

获取最接近的父项(即自定义元素)

Vega中的模运算符

将字符串UTC Date转换为ngx—counting leftTime配置值的数字

函数返回与输入对象具有相同键的对象

在286之后恢复轮询

使用JQuery单击元素从新弹出窗口获取值

Javascript json定制

WhatsApp Cloud API上载问题:由于MIME类型不正确而导致接收&Quot;INVALID_REQUEST";错误

如何创建返回不带`new`关键字的实例的类

环境值在.js文件/Next.js中不起作用

自定义图表工具提示以仅显示Y值

删除元素属性或样式属性的首选方法

如何在Java脚本中对数据进行签名,并在PHP中验证签名?

Cherrio JS返回父div的所有图像SRC

如何修复错误&语法错误:不能在纯react 项目中JEST引发的模块&之外使用导入语句?

更新文本区域行号

在范围数组中查找公共(包含)范围

在点击链接后重定向至url之前暂停

在此div中添加一个类,并在一段时间后在Java脚本中将其删除