将自定义道具传递给TypeScript中的Redux Form Field

时间:2017-09-08 07:49:28

标签: reactjs typescript react-redux redux-form

我想将自定义属性传递给我的Redux-Form-Field。在文档中说:

  

传递给Field的任何自定义道具都将合并到与输入和元对象相同级别的道具对象中。

但是将自定义道具传递给Field组件会引发编译错误:

<Field
    name="E-Mail"
    component={MaterialTextField}
    myProp="Test"
/>

财产&#39; myProp&#39;类型&#39;上不存在(IntrinsicAttributes&amp; IntrinsicClassAttributes&gt;&amp; ...

在props属性中,我只能添加一组预定义的属性,如占位符或类型。传递另一个道具将抛出此错误:

<Field
    name="E-Mail"
    component={MaterialTextField}
    props = {{
        myProps: 'Test'
    }}
/>

输入&#39; {姓名:&#34;电子邮件&#34 ;;组件:(props:any)=&gt;元件;道具:{myProps:string; }; }&#39;不能分配类型&#39;(IntrinsicAttributes&amp; ...

是否有可能将自定义道具传递给TypeScript中的Field组件?

3 个答案:

答案 0 :(得分:11)

经过一些实验,我找到了传递自定义道具的解决方案:

<Field 
    name="myName"
    props={{
        type: 'text'
    }}
    component={myComponent}
    {...{
        myCustomProps1: 'myCustomProp1',
        myCustomProps2: 'myCustomProp2'
    }}
/>

在myComponent中,您在属性的根级别拥有自定义道具:

const myComponent = (props) => {
    return <div>{props.myCustomProp1 + " " props.myCustomProp2}</div>
}

答案 1 :(得分:3)

要将自定义道具传递给 Redux表单Field组件,您需要声明所有界面 > props 您要通过的

interface YourCustomProps {
    myProp1: string;
    myProp2: number;
}

现在,使用 Redux表单中的GenericFieldField设为YourCustomField,您将可以通过YourCustomProps

import { Field, GenericField } from 'redux-form';

const YourCustomField = Field as new () => GenericField<YourCustomProps>;

现在,您可以按照界面中的声明将自定义道具传递给YourCustomField

<YourCustomField
    myProp1="Hi"
    myProp2={123}
    component={MaterialTextField}
/>

通过这种方式,您可以通过自定义道具传递任何内容,例如反应成分! :)

答案 2 :(得分:0)

我不是打字稿用户,所以我不确定类型定义是如何工作的,但我发现this thread about type definitions for Redux-form v6。最后,它们链接到this repository,它应该具有(如果我理解正确的话)更新的类型定义。

我想另一种方法是切换到vanilla JS来实现这一特定功能。或者也许可以定义一个获取自定义prop的函数,然后返回一个准备好接受Redux表单道具并合并它们的组件。

编辑:我已尝试在下面的代码中说明上一个建议的基本概念,即所谓的HOC(高阶组件)。

&#13;
&#13;
const inputWithCustomFields = (customFields) => ComponentToGetExtraFields => (props) => {
	const mergedProps = {...props, ...customFields};
	return (<ComponentToGetExtraFields {...mergedProps} />);
};

const ComponentThatNeedsCustomStuff = ({myCustomField1, myCustomField2, ...rest}) => {
	console.log('doing stuff with the custom props',myCustomField1, myCustomField2);
	return (<div><h1>{myCustomField1 + myCustomField2}</h1><input {...rest} /></div>);
}

const Parent = () => {
  const myCustomFields = {
     myCustomField1: "Hello, ", 
     myCustomField2: "world!", 
     value: 'can\'t change me',
     onChange: () => { /* do nothing */ }
   };
  const MergedComponent  = inputWithCustomFields(myCustomFields)(ComponentThatNeedsCustomStuff);
  return (<div>
      <MergedComponent />
    </div>);
};

ReactDOM.render(<Parent />, document.getElementById('root'));
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>
&#13;
&#13;
&#13;