在哪里为 React 功能组件声明辅助功能。里面还是外面?
Where to declare auxiliar functions for a React functional component. Inside or outside?
我正在构建一个 <BasicForm>
组件,它将用于在我的应用程序中构建表单。它应该处理提交、验证,还应该跟踪输入状态(如触摸、脏等)。
因此,它需要一些函数来完成所有这些,我一直在想放置这些声明的最佳位置是什么(关于代码组织和性能优化,考虑 React 和 JavaScript 最佳实践)。
我正在使用 React 16.8 挂钩并与 Webpack 捆绑在一起。
到目前为止,我得到的是:
BasicForm.js
/* I moved those validating functions to a different file
because I thought they are helpers and not directly related
to my BasicForm functionality */
import { validateText, validatePassword, validateEmail } from './Parts/ValidationHelpers';
function BasicForm(props) {
const [inputs, setInputs] = useState({});
const [isSubmitting, setIsSubmitting] = useState(false);
// These are functions to handle these events
function onChange(event) {...}
function onBlur(event) {...}
function onFocus(event) {...}
// This function creates the initial state for each form input
function setInputInitialState(inputProps) {...}
// This functions does what it name says
function validateAllFields() {...}
// This one also
function checkValidationAndSubmit() {...}
return(
<FormContext.Provider value={{
onBlur: onBlur,
onFocus: onFocus,
onChange: onChange,
inputs: inputs,
setInputInitialState: setInputInitialState
}}>
<form onSubmit={onSubmit} method='POST' noValidate>
{props.children}
</form>
</FormContext.Provider>
);
}
我的问题是:如您所见,到目前为止,我正在声明我的 <BasicForm>
使用的所有函数(onChange
、onBlur
、onFocus
、setInputInitialState
、validateAllFields
、checkValidationAndSubmit
) 在我的 BasicForm
React 组件函数的主体 内。
这是最佳做法吗?如果我使用 classes,那些函数可能是我的 BasicForm
class 的方法。但是自从我改用钩子并摆脱了大多数 classes 之后,我总是对将辅助函数放在我的 React 组件函数体内部或外部有疑问。有这方面的最佳实践吗?
当辅助函数可能需要一些来自我的主函数的变量或状态时,我总是可以在调用它们时将它们作为参数传递(如果它们在外部声明)。
如果我在 BasicForm
函数之外声明它们,我会得到或失去任何东西吗?请记住,这是一个与 Webpack 捆绑在一起的模块。
如果函数不依赖于 props 或 state,那么最好在你的组件函数之外定义它。如果它确实依赖于 props 或 state,那么在组件函数中定义它通常是有意义的,但是如果你将函数作为 prop 传递给子组件,那么你应该考虑使用 useCallback
(though this generally only adds value if the child component is memoized).
当函数依赖于 props 或 state 时,如果将函数移出组件并向其传递参数,则最终需要将该调用包装在另一个函数中(例如 ()=>helperFunc(prop1, someState)
)将其作为道具传递给子组件。如果函数很大,您可能仍希望以这种方式将其从组件中拉出,但这只是归结为样式偏好。
有关 useCallback
的更多信息,请在此处查看我的回答:
我正在构建一个 <BasicForm>
组件,它将用于在我的应用程序中构建表单。它应该处理提交、验证,还应该跟踪输入状态(如触摸、脏等)。
因此,它需要一些函数来完成所有这些,我一直在想放置这些声明的最佳位置是什么(关于代码组织和性能优化,考虑 React 和 JavaScript 最佳实践)。
我正在使用 React 16.8 挂钩并与 Webpack 捆绑在一起。
到目前为止,我得到的是:
BasicForm.js
/* I moved those validating functions to a different file
because I thought they are helpers and not directly related
to my BasicForm functionality */
import { validateText, validatePassword, validateEmail } from './Parts/ValidationHelpers';
function BasicForm(props) {
const [inputs, setInputs] = useState({});
const [isSubmitting, setIsSubmitting] = useState(false);
// These are functions to handle these events
function onChange(event) {...}
function onBlur(event) {...}
function onFocus(event) {...}
// This function creates the initial state for each form input
function setInputInitialState(inputProps) {...}
// This functions does what it name says
function validateAllFields() {...}
// This one also
function checkValidationAndSubmit() {...}
return(
<FormContext.Provider value={{
onBlur: onBlur,
onFocus: onFocus,
onChange: onChange,
inputs: inputs,
setInputInitialState: setInputInitialState
}}>
<form onSubmit={onSubmit} method='POST' noValidate>
{props.children}
</form>
</FormContext.Provider>
);
}
我的问题是:如您所见,到目前为止,我正在声明我的 <BasicForm>
使用的所有函数(onChange
、onBlur
、onFocus
、setInputInitialState
、validateAllFields
、checkValidationAndSubmit
) 在我的 BasicForm
React 组件函数的主体 内。
这是最佳做法吗?如果我使用 classes,那些函数可能是我的 BasicForm
class 的方法。但是自从我改用钩子并摆脱了大多数 classes 之后,我总是对将辅助函数放在我的 React 组件函数体内部或外部有疑问。有这方面的最佳实践吗?
当辅助函数可能需要一些来自我的主函数的变量或状态时,我总是可以在调用它们时将它们作为参数传递(如果它们在外部声明)。
如果我在 BasicForm
函数之外声明它们,我会得到或失去任何东西吗?请记住,这是一个与 Webpack 捆绑在一起的模块。
如果函数不依赖于 props 或 state,那么最好在你的组件函数之外定义它。如果它确实依赖于 props 或 state,那么在组件函数中定义它通常是有意义的,但是如果你将函数作为 prop 传递给子组件,那么你应该考虑使用 useCallback
(though this generally only adds value if the child component is memoized).
当函数依赖于 props 或 state 时,如果将函数移出组件并向其传递参数,则最终需要将该调用包装在另一个函数中(例如 ()=>helperFunc(prop1, someState)
)将其作为道具传递给子组件。如果函数很大,您可能仍希望以这种方式将其从组件中拉出,但这只是归结为样式偏好。
有关 useCallback
的更多信息,请在此处查看我的回答: