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

defaultValue更改不重新呈现输入

冯澄邈
2023-03-14

我不知道为什么这不起作用

const {createFactory, createClass, DOM: { label, input, button }} = React;

const tester = createFactory(createClass({
  render() {
      return label({}
               ,`Name: ${this.props.name}`
               ,input({defaultValue: this.props.name})
               ,button({onClick: this.changeName}, "Change")
             )
  },
  changeName() {
    this.setProps({name: "Wilma"})
  }
}) )

React.render(tester({name: "Fred"}), document.querySelector('body'))

单击该按钮显然会更改道具,但旧的DefaultValue仍在输入中!那么什么给了?我做错了什么?这是虫子吗?有变通办法吗?

共有1个答案

全心思
2023-03-14

我发现了一个很好的解决方案:使用道具强制呈现一个全新的输入

在我的特殊情况下,我不需要输入用它自己的onchange道具来控制,因为围绕它的表单最终控制填充DefaultValue的某个存储区中的状态。但是存储区的状态可能是异步初始化/更新的,在这种情况下,应该更新DefaultValue。下面是我的具体案例的浓缩版本:

import React, { PropTypes } from 'react';
import { Form } from 'provide-page';

const GatherContact = ({
  classes,
  onSubmit,
  movingContactName,
  movingContactEmail,
  movingContactPhone,
  userName,
  userEmail,
  userPhone
}) => (
  <Form onSubmit={onSubmit}>
    <div className={classes.GatherContact}>
      <h2 className={classes.GatherHeading}>
        How can we contact you?
      </h2>

      <input
        type="text"
        className={classes.GatherContactInput}
        placeholder="Name"
        name="movingContactName"
        key={`movingContactName:${movingContactName || userName}`}
        defaultValue={movingContactName || userName}
        required={true}
      />

      <input
        type="email"
        className={classes.GatherContactInput}
        placeholder="Email"
        name="movingContactEmail"
        key={`movingContactEmail:${movingContactEmail || userEmail}`}
        defaultValue={movingContactEmail || userEmail}
        required={true}
      />

      <input
        type="tel"
        className={classes.GatherContactInput}
        placeholder="Phone"
        name="movingContactPhone"
        key={`movingContactPhone:${movingContactPhone || userPhone}`}
        defaultValue={movingContactPhone || userPhone}
        required={true}
      />

      {userName
        ? undefined
        : (
          <input
            type="password"
            className={classes.GatherContactInput}
            placeholder="Password"
            name="userPassword"
            required={true}
            autoComplete="new-password"
          />
        )
      }
    </div>
  </Form>
);

GatherContact.propTypes = {
  classes: PropTypes.object.isRequired,
  onSubmit: PropTypes.func.isRequired,
  movingContactName: PropTypes.string.isRequired,
  movingContactEmail: PropTypes.string.isRequired,
  movingContactPhone: PropTypes.string.isRequired,
  userName: PropTypes.string.isRequired,
  userEmail: PropTypes.string.isRequired,
  userPhone: PropTypes.string.isRequired
};

export default GatherContact;
 类似资料:
  • 我猜这可能与从父级打开有关,但我有其他组件,它们内部的状态发生变化,所以我有点困惑,为什么这个组件不尊重它的新状态。 谢谢

  • 问题内容: 我有一段代码 单击“ Hi”消息时,仅组件会继续重新渲染,而组件不会重新渲染。 为什么在状态更改时不重新渲染组件? 我想说,由于它是组件的一个属性而不会发生,但是仍然会被JSX中的组件评估,所以不确定。 完整示例https://codesandbox.io/s/529lq0rv2n(检查控制台日志) 问题答案: 这个问题已经很老了,但是由于您似乎没有得到满意的答案,因此我也会尝试一下。

  • 问题内容: 我一直在看这些页面(1,2,3)。我基本上想更改自己的,但是我不想重新加载页面。 我目前在页面上,当我单击按钮并使URL变为时,我想进入编辑模式。 我的状态很简单,所以没有必要重新加载整个页面。但是,我确实希望and和or 进行更改,以便如果用户刷新页面,则页面将以编辑模式启动。 我能做什么? 问题答案: 对于此问题,您可以仅创建既不具有也不具有的子状态,并在正常情况下向前移动: 这里

  • 我已经开始在React中编写一个简单的UI,在ajax调用后重新呈现输入字段对所有组件(text、select)都能正常工作,除了单选组和复选框。 代码如下: 我对此有些困惑,并希望得到任何帮助… 编辑它似乎每个DOM元素和值都设置正确,唯一没有发生的事情是它在视觉上被反映出来。怀疑这可能是一般的Browser/JS问题,而不是具体的反应?

  • 请考虑以下示例: 我希望将值传递到中,作为哑输入组件的道具。然而,它从不重新呈现它。