【发布时间】:2020-04-20 19:36:03
【问题描述】:
考虑这个带有自定义表单钩子的基本表单字段组件来处理输入更改:
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 })据我所知,它看起来没有任何区别,对吧?我只是直接访问状态..我错了吗?
【问题讨论】:
标签: javascript reactjs react-hooks