考虑这个带有自定义表单钩子来处理输入更改的基本表单字段组件:
import React, { useState, useCallback } from 'react';
const useFormInputs = (initialState = {})=> {
const [values, setValues] = useState(initialState);
const handleChange = useCallback(({ target: { name, value } }) => {
setValues(prev => ({ ...prev, [name]: value }));
}, []);
const resetFields = useCallback(() =>
setValues(initialState), [initialState]);
return [values, handleChange, resetFields];
};
const formFields = [
{ name: 'text', placeholder: 'Enter text...', type: 'text', text: 'Text' },
{ name: 'amount', placeholder: 'Enter Amount...', type: 'number',
text: 'Amount (negative - expense, positive - income)' }
];
export const AddTransaction = () => {
const [values, handleChange, resetFields] = useFormInputs({
text: '', amount: ''
});
return <>
<h3>Add new transaction</h3>
<form>
{formFields.map(({ text, name, ...attributes }) => {
const inputProps = { ...attributes, name };
return <div key={name} className="form-control">
<label htmlFor={name}>{text}</label>
<input {...inputProps} value={values[name]}
onChange={handleChange} />
</div>;
})}
<button className="btn">Add transaction</button>
</form>
<button className="btn" onClick={resetFields}>Reset fields</button>
</>;
};
我真的有什么理由/优势可以使用 useCallback 在我的自定义钩子中缓存函数吗?我阅读了文档,但我只是无法理解 useCallback 的这种用法背后的想法。它究竟是如何记住渲染之间的功能的?ti 究竟是如何工作的,我应该使用它吗?
在同一个自定义钩子中,您可以看到通过扩展先前状态并创建一个新对象来更新新值状态,如下所示:
setValues(prev => ({ ...prev, [name]: value }));
如果我这样做会有什么不同吗?setValues({ ...prev, [name]: value })
据我所知,看起来没有什么区别吧?我只是直接访问状态..我错了吗?