4

我看的所有示例,实际withHandlers调用的函数似乎都是从 调用函数props,但我不知道该函数是如何定义的。这是人类文档中的一个小例子。

compose(
  withState('count', 'setCount', 0),
  withHandlers({
    incrementCount: props => event => {
      event.preventDefault()
      props.setCount(props.count + 1)
    }
  })
)(ComponentToEnhance)

我的理解是这将创建一个带有“状态”的 HOC 来跟踪count。我将能够通过使用定义的处理程序(例如onClick={incrementCount})的操作来增加计数。

那么我的问题是,setCount实际定义在哪里......我正在想象类似的东西

function setCount(i) {
    return i+1;
}

既然是从 props 调用的,那么在使用组件的时候,是不是必须要作为 props 传入呢?我很困惑为什么withState需要知道状态更新程序名称,或者如果是这种情况,它甚至是如何相关的。

它是否只是为您自动定义一个函数,该函数将用您传递的任何参数替换状态参数(如果是的话,则为facepalm ..)

4

2 回答 2

2

withHandlers采用咖喱/高阶函数来设置来自其他 HOC(高阶组件)的道具,例如withSate或形成它的用法。

增强组件示例:

import { compose } from 'recompose';
import React from 'react';

const enhance = compose(
  withState('count', 'setCount', 0),
  withHandlers({
    incrementCount: props => event => {
      // props would contain copy prop. 
      props.setCount(props.count + 1)
    },
    otherExample: () => event => {
      // If you didn't need props in your handler
    },
    otherIncrementCountExample: ({ count, setCount }) => () => {
      // you can exclude event also
      setCount(count + 1);
    }
  });

export default IncButton = ({ count, incrementCount, copy }) => (
  <div>
   <button onClick={incrementCount}> {copy} </button>
  </div>
);

用法:

import React from 'react';
import IncButton from './IncButton';
export default App = () => (
  <div>
    <IncButton copy="Increment Me"/>
  </div>
);
于 2017-05-26T00:45:33.037 回答
0

找到了答案,我这里的例子比我的组件简单,但我会尽力翻译我的发现......虽然这在下面没有测试。

compose(
  withState('count', 'setCount', 0),
  withHandlers({
    incrementCount: props => event => {
      props.setCount(props.count + 1)
    }
  })

(捂脸),正如我在我的问题中所怀疑的那样。withHandlers只是自动为您定义一个函数,它将用您传递的任何参数替换状态参数。它不是一个智能功能,虽然很有用。它将接受您提供的任何参数,并使用该参数更新您的 HOC 状态。你会这样使用它...

function ComponentToEnhance({someProp="default str", ...props}) {
  return (
    <div>
      <h1>{props.count}</h1>
      <button onClick={props.setCount}/>
    </div>
  );
}

someProp如果您想要一些具有默认值的道具或传入您想要特别调用的道具,那么是否可以显示使用传播运算符...干杯

于 2017-05-25T21:51:49.657 回答