Прежде всего следует отметить, что функциональные компоненты без состояния не могут иметь методов, вы не должны рассчитывать на вызов update
или draw
визуализацию, Ball
если это функциональный компонент без состояния.
В большинстве случаев вам следует объявлять функции вне функции компонента, поэтому вы объявляете их только один раз и всегда повторно используете одну и ту же ссылку. Когда вы объявляете функцию внутри, каждый раз при визуализации компонента функция будет определяться снова.
Бывают случаи, когда вам нужно определить функцию внутри компонента, например, назначить ее в качестве обработчика событий, который ведет себя по-разному в зависимости от свойств компонента. Но все же вы можете определить функцию снаружи Ball
и связать ее со свойствами, сделав код намного чище и сделав функции update
или draw
многоразовыми.
const update (propX, a, b) => { ... };
const Ball = props => (
<Something onClick={update.bind(null, props.x)} />
);
Если вы используете хуки , вы можете использовать их, useCallback
чтобы гарантировать, что функция переопределяется только при изменении одной из ее зависимостей ( props.x
в данном случае):
const Ball = props => {
const onClick = useCallback((a, b) => {
}, [props.x]);
return (
<Something onClick={onClick} />
);
}
Это неправильный путь :
const Ball = props => {
function update(a, b) {
}
return (
<Something onClick={update} />
);
}
При использовании useCallback
определение update
функции в самом useCallback
хуке, за пределами компонента, становится дизайнерским решением больше, чем что-либо, вы должны принять во внимание, собираетесь ли вы повторно использовать update
и / или если вам нужно получить доступ к области закрытия компонента, чтобы, например, чтение / запись в состояние. Лично я предпочитаю определять его внутри компонента по умолчанию и делаю его повторно используемым только в случае необходимости, чтобы предотвратить чрезмерную разработку с самого начала. Вдобавок ко всему, повторное использование логики приложения лучше выполнять с помощью более конкретных хуков, оставляя компоненты для презентационных целей. Определение функции вне компонента при использовании хуков действительно зависит от степени разделения от React, которую вы хотите для логики вашего приложения.