当前位置: 首页 > 知识库问答 >
问题:

如何使redux-form与TypeScript和styled-components一起工作?

罗淮晨
2023-03-14

我正在尝试让redux-form与TypeScript和Styled-Components一起工作。在下面的代码示例中,为什么它不能与样式化的输入组件一起工作?输入呈现出来,但每个按键都失去了焦点。还需要单击两次来聚焦元素。看起来redux-form试图控制Styled-Components返回的包装元素?redux-form和styled-components都使用HOC高阶组件将道具传递给底层元素。

export interface ITxtProps extends WrappedFieldProps {
  label?: string;
}

export const FieldHack = class extends Field<any> {};

const renderTxt = (props: ITxtProps & GenericFieldHTMLAttributes) => {
  const StyledInput = styled.input`
    background-color: deeppink;
  `;
  const notWorking = <StyledInput {...props.input} />;
  const worksPerfectly = <input {...props.input} />;
  return (
  <div>
    <div>{props.label}</div>
    {notWorking}
  </div>
);
}

const NormalLoginComponent = (props: {
  handleSubmit?: SubmitHandler<{}, {}>;
}) => {
  const { handleSubmit } = props;
  return (
    <form onSubmit={handleSubmit}>
      {/* this does not work when using styled components: */}
      <Field name={'email'} component={renderTxt}  />

      {/* this gives an error, property label does not exist on type... */}
      {/*<Field name={'email'} component={renderTxt} label="email" />*/}

      {/* this works, but no intellisense/static types */}
      <FieldHack name={'email2'} component={renderTxt} label="email" />

      <Field name={'password'} component={'input'} type="password" />
      <Button text={'log in'} onClick={handleSubmit} />
    </form>
  );
};

export interface ILoginForm {
  email: string;
  password: string;
}

const LoginForm = reduxForm<Readonly<ILoginForm>, {}>({
  form: 'loginNormal',
})(NormalLoginComponent);

共有1个答案

张嘉
2023-03-14

是的,我终于想通了..我犯了一个错误,那就是在render方法中创建了样式化组件包装:

const StyledInput = styled.input`
  background-color: deeppink;
;

显然,在render()中应用一个hoc-high-order组件是不安全的。因此当将HOC移到外部呈现时,它应该可以工作:

export interface ITxtProps extends WrappedFieldProps {
  label?: string;
}

export const FieldHack = class extends Field<any> {};

// wrap you HOC outside render:
const StyledInput = styled.input`
    background-color: deeppink;
  `;

const renderTxt = (props: ITxtProps & GenericFieldHTMLAttributes) => {
  // works now :)
  const notWorking = <StyledInput {...props.input} />;
  const worksPerfectly = <input {...props.input} />;
  return (
  <div>
    <div>{props.label}</div>
    {notWorking}
  </div>
);
}

我在阅读另一个HOC库的文档时弄清楚了这一点,这里有一个链接解释了在HOC上应用(任何)HOC:redux-auth-wrapper文档是安全的

 类似资料:
  • 问题内容: 我正在尝试使SystemJS与Typescript一起使用,但是它们似乎彼此冲突。 我如何利用System.js的自动加载功能而不会与Typescript上的关键字发生冲突?使用import / require可以使Typescript使用它自己的方式来加载和引用文件,尽管它转换为,但对于 是否有可能完全做到这一点,否则我将不得不等待Typescript支持ES6关键字? 问题答案:

  • 让我们从建立一个计数器组件开始。这个组件将负责跟踪其被点击多少次并显示该数量。 app/components/counter-component.ts View Example 在这种情况下,点击事件绑定到从 ActionCreatorService调用我们的动作创建者的表达式。 让我们来看看@select的使用。 是Ng2-Redux的一个功能,它旨在帮助您以声明方式将 store 的状态附加到

  • 我最近开始将样式化组件与React一起使用,我不确定我是否正确地处理了一个不断重复出现的特定情况。 假设我有一个非常简单的组件,比如,它只需要非常多的样式和一些给定的内容。我现在要处理的事情如下: 我发现首先定义基本组件,如,只针对样式,然后再定义另一个组件,它接受道具并使用该样式组件。 有没有更短的方法只在一个组件中完成这两个任务?我希望能有一些像... ...但那似乎不起作用。

  • 到目前为止,我们已经习惯了tsd或(更好的版本)打字 但是现在 TypeScript 2 提供了新的@types功能,我应该如何将我当前的项目转换为与一起使用? 我有tsd.json(在某些情况下是typings.json)和所有的依赖项,迁移到TypeScript 2的步骤是什么? 有哪些新的最佳实践?@types是否支持特定版本?

  • 我的pom。xml如下所示 我已经尝试了三天,使用REdhat入门指南让这个简单的示例代码与Infinispan一起使用,并下载了快速入门zip来运行它,但仍然不起作用!我一直收到Spring JMS的错误“无法连接到foo: 11222”或“池未打开”,然后是关于混合Uber和Jars版本的警告。我开始使用ehcache,这很难实现,因为只有有限的简单示例展示了如何从rest调用等中存储、检索和

  • 我最近安装了privacy vpn,结果发现启用的openvpn会破坏Docker。 当我尝试运行时,我得到以下错误 禁用vpn可以解决这个问题(不过,我宁愿不禁用它)。有没有办法使这两者和平共处?我使用debian jessie,我的openvpn有以下版本字符串 null