【问题标题】:How to pass a default value to an input in React (using props)如何将默认值传递给 React 中的输入(使用道具)
【发布时间】:2018-10-06 08:36:56
【问题描述】:

我有这个字段,它呈现一个输入组件RenderInput。我需要给它传递一个默认值,比如value="100"

      <Field
        name="hours"
        type="number"
        placeholder="Ingrese las horas para esta categoría"
        component={RenderInput}
        onChange={(event) => {
          handleSubmit(currentValues => this.debounceSubmitProduction({
            ...currentValues,
            hours: event.target.value,
          }))();
        }}
      />

这是 RenderInput 组件:

const RenderInput = ({
  input,
  type,
  disabled,
  readOnly,
  placeholder,
  meta: { touched, error },
  onKeyDown,
  innerRef,
}) => (
  <div>
    <input
      {...input}
      type={type}
      disabled={disabled}
      readOnly={readOnly}
      placeholder={placeholder}
      className={`font-300 ${touched && error && 'has-error'}`}
      onKeyDown={onKeyDown}
      ref={innerRef}
    />
  </div>
);

如果我将value="100" 放在 RenderInput 组件中,它可以正常工作,但如果我尝试将该值作为道具传递给 RenderInput 组件,它就不起作用。如何将属性 value&lt;Field /&gt; 传递到 RenderInput?

【问题讨论】:

    标签: javascript reactjs input field


    【解决方案1】:

    https://reactjs.org/docs/uncontrolled-components.html#default-values

    对于一个不受控制的组件,你经常希望 React 指定 初始值,但不控制后续更新。处理 在这种情况下,您可以指定 defaultValue 属性而不是 value

    【讨论】:

    • 要捎带这个答案:如果您不希望用户控制输入的状态,请仅使用 defaultValue 属性。如果他们要更改输入,请改用value 属性。这将使输入受到控制,并将通过您从父组件传递到 Field 组件的 setState 函数进行更新。
    【解决方案2】:

    嗯,你有几个选择,你的问题是错误的,因为默认值是通过 defaultProps 完成的,但你可以做的是

    <Field
            name="hours"
            type="number"
            placeholder="Ingrese las horas para esta categoría"
            component={() => (<RenderInput input={{ value: 100 }}/> )}
            onChange={(event) => {
              handleSubmit(currentValues => this.debounceSubmitProduction({
                ...currentValues,
                hours: event.target.value,
              }))();
            }}
          />
    

    请注意它在 RenderInput 中是如何解构的

    const RenderInput = ({
      input,
      type,
      disabled,
      readOnly,
      placeholder,
      meta: { touched, error },
      onKeyDown,
      innerRef,
    }) => (
    

    这意味着在input 键上传递的任何内容都将被解构为输入道具,因此如果您需要发送值,则必须使用input={{value: 100}} 而不是value=100,此道具不会被解构。

    如果你想有默认值,你可以添加静态到 RenderInput

    RenderInput.defaultProps = {
      input: { value: 100 }
    }
    

    编辑

    还有克隆功能

    const ComponentWithProps = React.CloneElement(RenderInput, { props })
    

    【讨论】:

    • 我希望默认值为空字符串,但是当我使用默认值传递道具时,会显示该值。我试过了,但没有用:(
    • 错误是:Uncaught (in promise) TypeError: Cannot read property 'replaceChild' of null
    • 您可以使用static defaultProps = {} 在组件和无状态组件(您在渲染输入中拥有)上设置默认值,就像我上面所说的RenderInput.defaultProps = { input: { value: 100 } },除非您将在stackblitz.com 上提供完整示例未捕获的错误可能与您提出的问题无关
    【解决方案3】:
      <Field
        name="hours"
        type="number"
        someValue='100'
        placeholder="Ingrese las horas para esta categoría"
        component={RenderInput}
        onChange={(event) => {
          handleSubmit(currentValues => this.debounceSubmitProduction({
            ...currentValues,
            hours: event.target.value,
          }))();
        }}
      />
    

    然后

    const RenderInput = ({
      input,
      type,
      disabled,
      readOnly,
      placeholder,
      meta: { touched, error },
      onKeyDown,
      innerRef,
      someValue
    }) => (
      <div>
        <input
          {...input}
          type={type}
          disabled={disabled}
          readOnly={readOnly}
          placeholder={placeholder}
          className={`font-300 ${touched && error && 'has-error'}`}
          onKeyDown={onKeyDown}
          ref={innerRef}
          defaultValue={someValue}
        />
      </div>
    );
    

    【讨论】:

    • 这是我之前尝试过的,valuedefaultValue 但它们都不起作用:(
    • 那么您在控制台中收到任何错误吗?以及答案更新
    • 错误是:Uncaught (in promise) TypeError: Cannot read property 'replaceChild' of null
    猜你喜欢
    • 2021-11-01
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 2017-11-19
    • 2020-06-13
    • 2021-09-11
    • 2021-01-27
    相关资源
    最近更新 更多