在 Recompose for React 中为 withHandler 定义函数
Defining function for withHandler in Recompose for React
我看的所有例子,withHandlers
中实际调用的函数似乎是从props
中调用的函数,但我不知道该函数是如何定义的。这是来自 docs for humans.
的一个小例子
compose(
withState('count', 'setCount', 0),
withHandlers({
incrementCount: props => event => {
event.preventDefault()
props.setCount(props.count + 1)
}
})
)(ComponentToEnhance)
我的理解是这将创建一个具有 "state" 的 HOC 来跟踪 count
。我将能够通过使用定义的处理程序的操作来增加计数(例如 onClick={incrementCount}
)。
那么我的问题是,setCount
实际定义在哪里..我正在想象
function setCount(i) {
return i+1;
}
既然是props调用的,那你在使用组件的时候是不是也得把它作为props传入?我很困惑为什么 withState
需要知道状态更新程序名称,或者如果是这样的话它是如何相关的。
它是否只是自动为您定义一个函数,用您传递给它的任何参数替换 state 参数(如果是,则为 facepalm...)
找到答案了,我这里的例子比我的组件简单,但我会尽力翻译我的发现...虽然下面没有测试。
compose(
withState('count', 'setCount', 0),
withHandlers({
incrementCount: props => event => {
props.setCount(props.count + 1)
}
})
(facepalm),正如我在问题中所怀疑的那样。 withHandlers
只是自动为您定义一个函数,它将用您传递给它的任何参数替换状态参数。这不是一个智能功能,虽然很有用。它会接受您提供的任何参数,并用该参数更新您的 HOC 的状态。你会像这样使用它...
function ComponentToEnhance({someProp="default str", ...props}) {
return (
<div>
<h1>{props.count}</h1>
<button onClick={props.setCount}/>
</div>
);
}
someProp
只是为了展示传播运算符的使用,如果你想要一些具有默认值或传入的道具,你想特别调出......欢呼
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>
);
我看的所有例子,withHandlers
中实际调用的函数似乎是从props
中调用的函数,但我不知道该函数是如何定义的。这是来自 docs for humans.
compose(
withState('count', 'setCount', 0),
withHandlers({
incrementCount: props => event => {
event.preventDefault()
props.setCount(props.count + 1)
}
})
)(ComponentToEnhance)
我的理解是这将创建一个具有 "state" 的 HOC 来跟踪 count
。我将能够通过使用定义的处理程序的操作来增加计数(例如 onClick={incrementCount}
)。
那么我的问题是,setCount
实际定义在哪里..我正在想象
function setCount(i) {
return i+1;
}
既然是props调用的,那你在使用组件的时候是不是也得把它作为props传入?我很困惑为什么 withState
需要知道状态更新程序名称,或者如果是这样的话它是如何相关的。
它是否只是自动为您定义一个函数,用您传递给它的任何参数替换 state 参数(如果是,则为 facepalm...)
找到答案了,我这里的例子比我的组件简单,但我会尽力翻译我的发现...虽然下面没有测试。
compose(
withState('count', 'setCount', 0),
withHandlers({
incrementCount: props => event => {
props.setCount(props.count + 1)
}
})
(facepalm),正如我在问题中所怀疑的那样。 withHandlers
只是自动为您定义一个函数,它将用您传递给它的任何参数替换状态参数。这不是一个智能功能,虽然很有用。它会接受您提供的任何参数,并用该参数更新您的 HOC 的状态。你会像这样使用它...
function ComponentToEnhance({someProp="default str", ...props}) {
return (
<div>
<h1>{props.count}</h1>
<button onClick={props.setCount}/>
</div>
);
}
someProp
只是为了展示传播运算符的使用,如果你想要一些具有默认值或传入的道具,你想特别调出......欢呼
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>
);