0

recompose调用此函数withHandlers可让您在保持组件纯净的同时定义事件处理程序。

例如,如果你在你的render()方法中有这样的东西:

<TextInput value={value} onChange={ev => this.handleChange(ev.target.value)} />

它不会是纯粹的,因为每次您的组件呈现时,它都会通过将不同的onChange函数传递给您的TextInput组件。

这很好,但是如何扩展它以支持输入数组?或者以其他方式提供辅助数据?

例如,以他们为例并对其进行一些扩展:

const enhance = compose(
    withState('values', 'updateValue', ''),
    withHandlers({
        onChange: props => inputName => event => {
            props.updateValue(inputName, event.target.value)
        },
        onSubmit: props => event => {
            event.preventDefault();
            submitForm(props.value)
        }
    })
)

const Form = enhance(({ value, onChange, onSubmit, inputs }) =>
    <form onSubmit={onSubmit}>
        <label>Value
            {inputs.map(input => (
                <TextInput value={value} onChange={onChange(input)} />    
            ))}
        </label>
    </form>
)

我稍微捏造了一些细节,但假装inputs是作为输入名称数组出现的。例如["firstName","lastName"]将呈现两个文本框,每个文本框一个。

我想将每一个的值存储在我的状态中,但我不想为每个定义单独的更新器函数。因此,我需要将一些元数据附加到onChange={...}道具,以便我知道在我的状态下我正在更新哪个字段。

我怎样才能做到这一点?

在我的示例中,我编写onChange(input)并向withHandlers.onChange函数添加了一个额外的“级别”以接受额外的参数,但withHandlers实际上并没有这样工作。有没有办法做到这一点——即,确保每次呈现时每个都TextInput接收相同的函数实例?<Form>

4

1 回答 1

2

这是您需要直接在 TextInput 组件内定义更改句柄的典型情况。您需要将 updateValue 函数作为道具传递给 TextInput 组件。

于 2017-07-23T21:12:50.347 回答