在哪里声明React函数组件的辅助函数。内部还是外部?

时间:2019-03-25 14:28:14

标签: javascript reactjs react-hooks

我正在构建一个<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>使用的所有功能(onChangeonBluronFocussetInputInitialStatevalidateAllFieldscheckValidationAndSubmit)在我的BasicForm React组件函数的主体内部。

这是最佳做法吗?如果我使用的是类,则这些函数可能是我的BasicForm类的方法。但是由于我改用了钩子并摆脱了大多数类,所以我一直对将辅助函数放置在我的React组件函数的主体内部或外部感到怀疑。有最佳实践吗?

当辅助函数可能需要主函数中的某些变量或状态时,我总是可以在调用它们时将它们作为参数传递(如果它们在外部声明)。

如果我在BasicForm函数之外声明它们,我会得到或失去任何东西吗?请记住,这是一个与Webpack捆绑在一起的模块。

1 个答案:

答案 0 :(得分:1)

如果函数不依赖道具或状态,那么最好在组件函数之外定义它。如果确实依赖道具或状态,则通常在组件函数中定义它是有意义的,但是如果要将函数作为道具传递给子组件,则通常应使用useCallback

当函数依赖道具或状态时,如果将函数移出组件并传递参数,最终将需要将该调用包装在另一个函数(例如()=>helperFunc(prop1, someState))中以进行传递它作为子组件的道具。如果函数很大,您可能仍希望以这种方式将其从组件中拉出,但这仅取决于样式首选项。

有关useCallback的更多信息,请在这里查看我的答案:Trouble with simple example of React Hooks useCallback