javascript - 为什么我们不应该使用 ref?
问题描述
不要过度使用
Refs
你的第一个倾向可能是在你的应用程序中使用 refs 来“让事情发生”。如果是这种情况,请花点时间更批判性地思考state
组件层次结构中应该拥有的位置。通常,很明显“拥有”该状态的适当位置位于层次结构中的更高级别。有关此示例,请参阅Lifting State Up
指南。
在我当前的 React 应用程序中,我有几个div
节点要根据条件进行修改。render()
这些 div 节点是在'schained 的深处创建的returns
。我当然不能使用 Document.queryselector()。我想不出别的了。
文档还试图用文章“提升状态”来解释,但我不明白。有人可以解释一下吗?(ELI5
如果可以的话。)
解决方案
提升状态意味着子组件引发事件而不是自己处理状态更改。在React 文档中,他们从每个组件管理自己的状态(handleChange)开始。onTemperatureChange
再往下,他们通过添加道具来提升状态。现在,孩子们将状态更改委托给他们最接近的共同父母,Calculator
. Calculator
更改状态并通过道具向下推新值。
我只在需要调用 DOM 元素上的特定函数时才使用 refs,focus()
这是迄今为止我的应用程序中最常见的用法。这个SO 答案有一个很好的例子,在这里复制是因为链接不好:
class App extends React.Component{
componentDidMount(){
this.nameInput.focus();
}
render() {
return(
<div>
<input
defaultValue="Won't focus"
/>
<input
ref={(input) => { this.nameInput = input; }}
defaultValue="will focus"
/>
</div>
);
}
}
ReactDOM.render(<App />, document.getElementById('app'));
还请务必阅读链接答案下方的答案,autoFocus
这是安装时聚焦的正确答案,但您肯定会在某些时候动态地聚焦元素。
推荐阅读
- javascript - 如何在 Jquery AutoComplete 中检测手动输入或选择
- reactjs - TypeError: Object(...) 不是 Reactjs/Redux 中的函数
- intel-oneapi - DPCT 迁移失败并出现错误代码 (-5)
- json - org.json.JSONException: JSONObject["pathValue"] not found error when @RequestBody is JSONObject in SpringBoot @PostMapping API调用
- c# - 计算数据集中每个日期的类别项目(带有 linq 的 C#)
- reactjs - webpack-dev-server 正在路由 axios 请求而不是链接
- jmeter - 在jMeter中启动多个firefox实例,其中一些不运行
- php - Laravel Lumen Collection - 按总和分组并保留值
- testing - 向 testacafe-resizeWindow 添加额外的尺寸
- python - 机器人未检测到 Webscraping 时在循环中添加到站点的新产品 [Python]