【发布时间】:2021-04-23 05:42:15
【问题描述】:
我是 React 新手。我知道 UseEffect 对于保持相关数据彼此同步很有用。
示例 1:
每当道具 rawDateInput 更新时,下面的代码都会更新 calendarDate 和 inputDate。
const DATE_FORMAT = 'MM/DD/YY';
type Props = {
name: string;
label: string;
required?: boolean;
value?: Date | undefined;
readOnly?: boolean;
};
const DatePicker: FunctionComponent<Props> = ({ name, value: rawDateInput, label, required, readOnly }) => {
const inputId = name.replace(/[\W]+/g, '_');
const [calendarDate, setCalendarDate] = useState<Date | null>();
const [inputDate, setInputDate] = useState<string>('');
useEffect(() => {
const momentDate = moment(rawDateInput);
setCalendarDate(momentDate.toDate());
setInputDate(momentDate.format(DATE_FORMAT));
}, [rawDateInput]);
return (
<Fragment>
<Label htmlFor={inputId} text={label} />{required && <span className='text-danger'>*</span>}
<input
id={inputId}
name={name}
value={inputDate}
readOnly={readOnly}
placeholder={DATE_FORMAT}
maxLength={8}
/>
<Calendar value={calendarDate} />
</Fragment>
);
}
export default DatePicker;
示例 2:
下面的代码剪辑器完成了与示例 1 相同的事情,但它只是将逻辑放在功能组件内部,而不是调用 useEffect 钩子。
const DATE_FORMAT = 'MM/DD/YY';
type Props = {
name: string;
label: string;
required?: boolean;
value?: Date | undefined;
readOnly?: boolean;
};
const DatePicker: FunctionComponent<Props> = ({ name, value: rawDateInput, label, required, readOnly }) => {
const inputId = name.replace(/[\W]+/g, '_');
const momentDate = moment(rawDateInput);
const calendarDate = momentDate.toDate();
const inputDate = momentDate.format(DATE_FORMAT);
return (
<Fragment>
<Label htmlFor={inputId} text={label} />{required && <span className='text-danger'>*</span>}
<input
id={inputId}
name={name}
value={inputDate}
readOnly={readOnly}
placeholder={DATE_FORMAT}
maxLength={8}
/>
<Calendar value={calendarDate} />
</Fragment>
);
}
export default DatePicker;
我的问题是:
-
当我们有依赖于 prop 的数据时,我们应该使用 UseEffect(示例 #1)还是简单地将逻辑放入功能组件中(示例 #2)?
-
UseEffect 在这种情况下是否提供任何性能提升?比如尽量减少重新加载的次数。
【问题讨论】:
标签: reactjs react-hooks