我不知道为什么这不起作用
我有以下es6代码
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
仍然在输入中!什么给出了什么?我究竟做错了什么?这是一个错误吗?有解决方法吗?
答案 0 :(得分:18)
我发现这似乎是一个非常好的解决方案:使用key
道具强制渲染全新的input
。
在我的特定情况下,我不需要使用自己的input
道具来控制onChange
,因为它周围的form
最终会控制一些商店中的状态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;
答案 1 :(得分:5)
您只需指定其默认值,但不要告诉它通过更改道具来更改其值。
,input({value: this.props.name})
当this.props.name更改时,将更改该值。