[英]How to pass function as initial value of an object inside useState()?
I'm trying to migrate legacy code-base from class-based to function based using hooks.我正在尝试使用钩子将遗留代码库从基于类迁移到基于 function。
The legacy code was like:遗留代码如下:
constructor(props){
super(props)
this.state = {
pickerProps: {
onPickDate: this.onPickDate,
activeColor: "#119955",
date: "12-12-2012"
},
inputStyle: "",
selectedDate: null
}
}
onPickDate = date => {
this.setState((state) => ({
selectedDate: date
}))
}
onInputChange = (prop, value) => {
this.setState((state) => ({
pickerProps: {
...state.pickerProps,
[prop]: value
}
}))
}
changeInputStyle = e => {
const value = e.target.value
this.setState((state) => ({inputStyle: value}))
}
and the new code is:新代码是:
const [inputStyle, setInputStyle] = useState("");
const [selectedDate, setSelectedDate] = useState(null);
const [pickerProps, setPickerProps] = useState({
onPickDate:onPickDate, // How to pass function here
activeColor: "#119955",
date: "12-12-2012",
});
// This is the function I want to pass to useState()
const onPickDate = (date) => {
setSelectedDate(date);
};
const onInputChange = (prop, value) => {
setPickerProps({ [prop]: value });
};
const changeInputStyle = (e) => {
const value = e.target.value;
setInputStyle(value);
};
I receive a warning: The onPickDate was used before defined
我收到警告:
The onPickDate was used before defined
Also when I send pickerProps
to DatePicker
:另外,当我将
pickerProps
发送到DatePicker
时:
<div className="date-picker">
<DatePicker {...pickerProps} />
</div>
It invokes an error:它调用一个错误:
OnPickDate is not defined ()
The problem here is related to function hoisting.这里的问题与function吊装有关。 The function you have declared is of type const and such variables with const or let declaration are not hoisted.
您声明的 function 属于 const 类型,并且不会提升具有 const 或 let 声明的此类变量。
If you declare the function with function definition
it will work without having to write it above useState如果您使用
function definition
声明 function ,则无需在 useState 上方编写即可
const [inputStyle, setInputStyle] = useState("");
const [selectedDate, setSelectedDate] = useState(null);
const [pickerProps, setPickerProps] = useState({
onPickDate:onPickDate, // How to pass function here
activeColor: "#119955",
date: "12-12-2012",
});
function onPickDate(date) {
setSelectedDate(date);
};
const onInputChange = (prop, value) => {
setPickerProps({ [prop]: value });
};
const changeInputStyle = (e) => {
const value = e.target.value;
setInputStyle(value);
};
However you need to store functions in state as it will make it difficult for you to update state, you can directly pass them as props to children但是您需要将函数存储在 state 中,因为它会使您难以更新 state,您可以将它们作为道具直接传递给孩子
const [inputStyle, setInputStyle] = useState("");
const [selectedDate, setSelectedDate] = useState(null);
const [pickerProps, setPickerProps] = useState({
activeColor: "#119955",
date: "12-12-2012",
});
// This is the function I want to pass to useState()
const onPickDate = (date) => {
setSelectedDate(date);
};
const onInputChange = (prop, value) => {
setPickerProps({ [prop]: value });
};
const changeInputStyle = (e) => {
const value = e.target.value;
setInputStyle(value);
};
return (
<div className="date-picker">
<DatePicker {...pickerProps} onPickDate ={onPickDate}/>
</div>
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.