【发布时间】:2021-02-04 18:10:43
【问题描述】:
class SearchInput extends React.Component {
constructor(props) {
super(props);
this.searchInputRef = React.createRef(); // ????️ LOOK HERE
}
onFormSubmit = (e) => {
e.preventDefault();
// const query = e.target.querySelector("#searchInput").value; // ????️ LOOK HERE
const query = this.searchInputRef.current.value;
console.log(query);
};
render() {
return (
<form onSubmit={this.onFormSubmit}>
<div className="input-group-text">
{this.props.label}
<input
type="text"
className="form-control"
id="searchInput"
aria-describedby="emailHelp"
placeholder="Search"
ref={this.searchInputRef}
/>
<button type="submit" className="btn btn-primary">
<i className="fas fa-search"></i>
</button>
</div>
</form>
);
}
}
我对 ReactJS 很陌生,但我很难用它,我对上面的组件有两个问题:
- 在上面的第一个
// ????️ LOOK HERE评论中,您会看到,我正在保存对类实例本身的引用(在构造函数中),这会导致两个缺点:
- 稍后当我在其中添加 7 或 8 个引用时,构造函数会变得非常混乱,这使得它的代码不干净。
- 我们正在保存对类实例的对象主体的引用,您认为这是一个干净的代码吗?也许 React 中应该有一些东西可以让我将所有引用存储在一个属性中,可能称为“refs”,因此该类的实例如下所示:
{
refs: {
searchInputRef: ...
// later
buttonRef: ...
button2Ref: ...
iconRef: ...
}
state: ...
// the rest of the component object
}
如果你问我,哪个更干净。 如果我错了,请告诉我。
- 在第二条评论
// ????️ LOOK HERE当然你可以看到我实际上并不需要参考,那么为什么我使用 ref sys~?我可以简单地从e.target.querySelector("#searchInput")获取输入,看起来很简单,为什么人们总是说在使用 React 时使用我心爱的 querySelector 来引用 DOM 元素是一种耻辱和不好的做法?
【问题讨论】:
标签: reactjs