【发布时间】:2018-03-26 12:32:12
【问题描述】:
我想在 Input 组件中实现一个 X 图标,它将清除输入字段。如果我控制状态,我可以轻松做到。但是无状态组件真的可以吗? 我使用 react-semantic-ui,它们的有状态组件具有自动控制状态。
所以我想创建一个可以像这样使用的输入:
//Controlled
class App extends React.Component {
state = {
value:''
}
onChange = (event, props) => {
this.setState({value: props.value});
}
onClearInput = () => {
this.setState({value: ''});
}
render() {
return (
<MyInput
clearable
value={this.state.value}
onChange={this.onChange}
onClearInput={this.onClearInput}
/>
)
}
}
或者
// Uncontrolled
class App extends React.Component {
onChange = (event, props) => {
doSomething(props.value);
}
render() {
return (
<MyInput
clearable
onChange={this.onChange}
/>
)
}
}
在第二个示例中,clearable 功能将不起作用,因为我们没有控制值。
MyInput 可以这样实现:
import React from 'react';
import { Input } from 'semantic-ui-react';
import ClearIcon from './ClearIcon';
function MyInput(props) {
const prepareProps = {...props};
if (props.clearable) {
prepareProps.icon=<ClearIcon onClick={props.onClearInput} />;
delete prepareProps.clearable;
}
delete prepareProps.onClearInput;
return (
<div className="my-input">
<Input {...prepareProps} />
</div>
);
}
...etc.
我的问题:
clearable功能必须以受控和不受控的方式工作。clearable功能不需要处理程序。最好只提供一个道具并处理引擎盖下 X 按钮的渲染和行为。
我看不出有任何方法可以完成这项工作。有什么想法吗?
【问题讨论】:
-
为什么它必须在不受控制的输入上工作?
-
@trixn,为什么不呢? :-) 我只想创建一个多功能组件,而不强迫人们以任何特定方式使用它。因此,如果您只是在您的应用程序中输入
<MyInput clearable />,您将获得一个带有 X 按钮的输入,该按钮可以开箱即用。我不认为这是可能的,但也许我错过了一些东西。这就是我问这个问题的原因。 -
是的,但如果你编写的组件被其他人使用,他们为什么要关心它在内部使用受控输入还是不受控输入?我不明白这个问题。
-
我同意@trixn。您可以使用渲染道具reactjs.org/docs/render-props.html,这将让使用您的组件的人将您控制的道具消耗到他们自己的视图中,或者只是控制输入。我能看到的唯一其他情况是,您的组件的用户必须将
ref传递给他们的输入。 -
对,人们不应该关心我在内部做什么。但是他们应该能够以受控/不受控的方式使用组件。问题是我无法在内部控制
value,因为这样用户将无法设置自己的value。另一方面,如果我不控制value,我无法清除它。 @pkuzhel 我看不到渲染道具如何帮助我。请解释一下好吗?
标签: javascript reactjs semantic-ui