У меня есть HO C, в настоящее время я хочу обновить его до версии 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;
}
f () всегда будет вызываться, если триггер setSelected из WrappedComponent
посмотрим на другой пример:
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 () будет вызывать только один раз
Как решить этот случай, если я должен использовать формат Ho c, но просто хочу, чтобы c сам стал функциональным компонентом?
или я просто меняю
const [selected, setSelected] = useState(f());
на
const [selected, setSelected] = useState(() => f());