Javascript 无法使用R.path获取输入值

Javascript 无法使用R.path获取输入值,javascript,ramda.js,Javascript,Ramda.js,我正在使用popular验证我的所有输入。我注意到他们使用Ramda来简化所有的函数调用。我尝试基于扩展他们的助手功能。以下是我努力实现的目标 import Revalidation from 'revalidation'; import compose from 'ramda/src/compose'; import lte from 'ramda/src/lte'; import path from 'ramda/src/path'; const isValueLTE = len =>

我正在使用popular验证我的所有输入。我注意到他们使用Ramda来简化所有的函数调用。我尝试基于扩展他们的助手功能。以下是我努力实现的目标

import Revalidation from 'revalidation';
import compose from 'ramda/src/compose';
import lte from 'ramda/src/lte';
import path from 'ramda/src/path';

const isValueLTE = len =>
  compose(lte(len), path(['target', 'value']));

const validationRules = {
  quantity: [
    [ isValueLTE(5),
      `Minimum Name length of 5 is required.`
    ],
  ],
};

const Form = ({ revalidation : {form, updateValueAndValidate, updateState, valid, errors = {}, onSubmit} }) =>
  (
  <div className='form'>
    <div className='formGroup'>
      <label>Quantity</label>
      <input
        type='number'
        name="quantity"
        value={form.quantity}
        onChange={updateValueAndValidate}
      />
    </div>
    <button onClick={() => onSubmit(onSubmitCb)}>Submit</button>
  </div>
  )

const EnhancedForm = revalidation(Form);
<EnhancedForm
  initialState={initialState}
  rules={validationRules}
  validateSingle={true}
  validateOnChange={true}
/>
从“重新验证”导入重新验证;
从“ramda/src/compose”导入compose;
从“ramda/src/lte”导入lte;
从“ramda/src/path”导入路径;
常量isValueLTE=len=>
组合(lte(len),路径(['target','value']);
常量验证规则={
数量:[
[isValueLTE(5),
`要求最小名称长度为5`
],
],
};
const Form=({重新验证:{Form,updateValueAndValidate,updateState,valid,errors={},onSubmit})=>
(
量
onSubmit(onSubmitCb)}>提交
)
const EnhancedForm=重新验证(形式);

问题是,当我使用compose包装
lte
path
时,无法获取输入值。使用它的正确方法是什么?

下面是一个小小的变化:请注意,对于Ramda的部分应用程序,二进制运算符可能是一个问题
lte(10)
是一个函数,它接受一个值并告诉您10是否小于或等于该值。(它的完整签名是
lte(a,b)
返回
a下面是一个细微的变化:注意,二进制运算符对于Ramda的部分应用可能是一个问题。
lte(10)
是一个函数,它接受一个值并告诉您10是否小于或等于该值。(它的完整签名是
lte(a,b)
返回
a使用ramda进行curry处理的方式是,您总是在早期的部分应用程序中指定前面的参数:

lte(1, 2); // returns: true, because 1 is less than or equal to 2
lte(1); // returns something equivalent to: (number) => lte(1, number);
因此,如果你调用
lte(len)
,你会得到一个函数,当你在给它输入一个数字
n
时调用该函数,它会告诉你
len
是否小于或等于
n
,相当于下面的“普通”示例:

(n) => len <= n
(n) => n <= len
换句话说,您可能希望使用预先给定的第二个参数部分应用
R.lte
。不可能使用一个参数调用函数,而是将其标记为第二个参数

管理这种情况的一种方法是对函数解释为占位符的第一个参数使用一些特殊值,就像已经建议使用
R.\uuuu
占位符一样

另一种方法是更改函数的参数顺序,以便您要提前填充的参数排在第一位。对于二进制函数(包含两个参数的函数),唯一可能更改顺序的方法是翻转参数。Ramda用于:

const givenInAdvance = 42;
const isLTE42 = R.flip(R.lte)(givenInAdvance);
这是显式部分应用二进制函数的快捷方式,其中第二个参数提前给出:

const givenInAdvance = 42;
const isLTE42 = R.lte(R.__, givenInAdvance);
这反过来相当于手动转换
R.lte

const isLTE42 = (n) => R.lte(n, givenInAdvance)

// equivalent to
const isLTE42 = (n) => n <= givenInAdvance
const isLTE42=(n)=>R.lte(n,提前)
//相当于

const isLTE42=(n)=>n使用ramda进行currying的方式是,您总是在早期的部分应用程序中指定前面的参数:

lte(1, 2); // returns: true, because 1 is less than or equal to 2
lte(1); // returns something equivalent to: (number) => lte(1, number);
因此,如果你调用
lte(len)
,你会得到一个函数,当你在给它输入一个数字
n
时调用该函数,它会告诉你
len
是否小于或等于
n
,相当于下面的“普通”示例:

(n) => len <= n
(n) => n <= len
换句话说,您可能希望使用预先给定的第二个参数部分应用
R.lte
。不可能使用一个参数调用函数,而是将其标记为第二个参数

管理这种情况的一种方法是对函数解释为占位符的第一个参数使用一些特殊值,就像已经建议使用
R.\uuuu
占位符一样

另一种方法是更改函数的参数顺序,以便您要提前填充的参数排在第一位。对于二进制函数(包含两个参数的函数),唯一可能更改顺序的方法是翻转参数。Ramda用于:

const givenInAdvance = 42;
const isLTE42 = R.flip(R.lte)(givenInAdvance);
这是显式部分应用二进制函数的快捷方式,其中第二个参数提前给出:

const givenInAdvance = 42;
const isLTE42 = R.lte(R.__, givenInAdvance);
这反过来相当于手动转换
R.lte

const isLTE42 = (n) => R.lte(n, givenInAdvance)

// equivalent to
const isLTE42 = (n) => n <= givenInAdvance
const isLTE42=(n)=>R.lte(n,提前)
//相当于

const isLTE42=(n)=>n您的问题含糊不清,请添加更多细节。特别感谢,您能否提供一个失败的示例输入?我已经更新了上面的问题。我认为您应该
R.flip(lte)
,因为我假设您正在尝试测试
event.target.value
是否小于或等于您预先给定的数字。在本例中,
lte
的正常参数顺序是
[event.target.value,givenInAdvance]
@fredrik.hjarner如果你看一下他们的例子,他们使用的是compose,我只是想模仿这个函数的行为。你的问题很模糊,请添加更多细节。特别感谢,你能提供一个失败的示例输入吗?我已经更新了上面的问题。我想你应该
R.flip(lte)
,因为我假设您正在尝试测试
event.target.value
是否小于或等于您预先给定的数字。在本例中,
lte
的正常参数顺序是
[event.target.value,givenInAdvance]
@fredrik.hjarner如果你看一下他们的例子,他们使用compose,我只是想模仿这个函数的行为谢谢你的回答,但我肯定会看他们操纵所有ramda函数的方式。看看他们的例子你注意到他们在revalidator例子中翻转参数了吗?注释和这里的答案都给你提供了实现这一点的方法。谢谢你的回答,先生,但我确实看到了他们操纵所有ramda函数的方法。看看他们的示例你注意到他们在revalidator示例中翻转参数了吗?这里的评论和答案都给你提供了实现这一点的方法。谢谢你的帮助。现在就看我正在使用
co