【发布时间】:2017-09-15 13:03:30
【问题描述】:
在 ReactJS 中,我正在编写一个无状态组件;
因为我已经阅读了避免不必要的状态是最佳实践。
该组件表示一个输入字段,当输入框包含一个值时执行一个函数。
export const InputField = (props) => {
const InputFieldContentsChanged = (event) => {
props.onChange(event.target.value);
};
return (
<div data-component="input-field"
className={(props.value !== "" ? "value": "")}>
<input type={props.type} value={props.value} onChange={InputFieldContentsChanged} />
<span className="bar"></span>
<label>{props.label}</label>
</div>
);
};
InputField.PropTypes = {
type: PropTypes.oneOf([ "text", "password" ]).isRequired,
label: PropTypes.string.isRequired,
value: PropTypes.string,
onChange: PropTypes.func.isRequired
}
现在, 我创建了另一个组件,它只是用于测试上述组件的示例。 如下所示:
export const SampleComponent = (props) => {
let componentUsername = "";
const onUsernameChanged = (username) => {
componentUsername = username;
};
return (
<InputField type="text" label="Username" value={componentUsername} onChange={onUsernameChanged} />
);
};
所以,我将value 绑定到组件中的自定义变量,当输入字段的内容发生更改时,该变量也会更改。
为什么输入框组件没有用新的用户名更新自己?
亲切的问候,
【问题讨论】:
-
你能搞定一个小提琴并运行吗?
-
无状态组件是无状态的。它们应该被实现为纯函数。返回值应仅取决于参数(道具)。由于没有任何东西改变道具 - 不会发生重新渲染。但是您的组件实际上并不是无状态的,它们确实具有可变的内部状态(输入值)。因此,您需要同时实现这两者或容器一个作为有状态组件。
标签: reactjs react-hooks react-state react-functional-component react-class-based-component