reactjs - 在 Hook 版本中使用 WrappedComponent 反应 HOC 总是重新初始化状态
问题描述
我有一个 HOC,目前我想将它改造成 Hook 版本,但是我发现它总是呈现
让我们看看这个例子:
const f = ()=> { console.log("init"); return "";}
const hoc = ({someProp = ""}) => WrappedComponent => {
const HOC = ({...props}) => {
const [selected, setSelected] = useState(f());
return <WrappedComponent {...props} setSelected={setSelected}/>
}
return HOC;
}
当从 WrappedComponent 触发 setSelected 时,f() 将始终调用
让我们看看另一个例子:
const f = ()=> { console.log("init"); return "";}
const hoc = ({someProp = ""}) => WrappedComponent => {
class HOC extends Component {
constructor(props) {
super(props);
this.state = {selected: f()}
this.setSelected = this.setSelected.bind(this);
}
setSelected(value) {
this.setState({selected:value})
}
render() {
return <WrappedComponent {...props} setSelected={this.setSelected}/>
}
}
return HOC;
}
f() 只会调用一次
如果我必须使用 Hoc 格式,但只想让 hoc 本身成为一个功能组件,我该如何解决这个问题?
或者我只是改变
const [selected, setSelected] = useState(f());
至
const [selected, setSelected] = useState(() => f());
解决方案
你在滥用useState
.
每次 HOC 渲染时,f()
都会被调用。
在这里啰嗦一下,也许下面的代码会让你看得更清楚
const hoc = ({someProp = ""}) => WrappedComponent => {
const HOC = ({...props}) => {
const state = f(); // Sure, this line would be executed every time.
const [selected, setSelected] = useState(state);
...
}
...
}
我猜您想f()
在初始化 Component 时执行以获取 init 状态,然后让 Component 自己处理状态,尽管不建议这样做。
对于这种情况,我更喜欢以下方法之一:
将结果
f()
从父组件传递给 HOC 组件这是同时创建 HOC 和生成 init 状态的最简单方法
useEffect
如果第一次渲染空白状态很好,请使用。您可以将
useEffect
其视为旧的didMount
生命周期 API。
推荐阅读
- ms-access - Microsoft Access 2010 - 如何根据 VBA 或 SQL 中的先前列创建查找条件
- python - Python可能会短路函数调用
- java - Java 打印 API 向打印机发送命令
- matplotlib - 绘制 Scipy ODE 解决方案
- java - 如何在 Bukkit 模组中使用 Minecraft 的 WorldEdit 撤消堆栈
- c++ - 特征稀疏矩阵的零拷贝构造
- javascript - 如何使用(“+ text here +”)将文本从一个javascript函数传递到另一个
- python - 如何将 OpenCV 图像与颜色进行比较
- atom-editor - Atom 中用于 lint 错误的 ESLint“修复”按钮停止工作
- linear-programming - PuLP MILP 约束:至少一个变量必须低于 0