Я пытаюсь преобразовать эту классную анимацию <canvas>
я нашел здесь, в повторно используемый компонент React. Похоже, что для этого компонента потребуется один родительский компонент для холста и много дочерних компонентов для function Ball()
.
По соображениям производительности, вероятно, было бы лучше превратить Balls
в компоненты без состояния, так как их будет много. Я не так хорошо знаком с созданием компонентов без сохранения состояния, и мне было интересно, где я должен определить функции this.update()
и this.draw
, которые определены в function Ball()
.
Функции для компонентов без состояния идут внутри компонента или снаружи? Другими словами, что из следующего лучше?
1:
const Ball = (props) => {
const update = () => {
...
}
const draw = () => {
...
}
return (
...
);
}
2:
function update() {
...
}
function draw() {
...
}
const Ball = (props) => {
return (
...
);
}
Каковы плюсы/минусы каждого из них и являются ли они лучше для конкретных случаев использования, таких как мой?
Прежде всего следует отметить, что функциональные компоненты без состояния не могут иметь методы, вы не должны рассчитывать на вызов update
или draw
на рендеринге Ball
, если это функциональный компонент без состояния.
В большинстве случаев вы должны объявлять функции вне функции компонента, поэтому вы объявляете их только один раз и всегда повторно используете одну и ту же ссылку. Когда вы объявляете функцию внутри, каждый раз, когда компонент отображается, функция будет определена снова.
Есть случаи, когда вам нужно определить функцию внутри компонента, например, назначить ее как обработчик события, который ведет себя по-разному на основе свойств компонента. Но вы можете определить функцию вне Ball
и связать ее со свойствами, делая код намного чище и делая функции update
или draw
повторно используемыми.
// You can use update somewhere else
const update (propX, a, b) => { ... };
const Ball = props => (
<Something onClick={update.bind(null, props.x)} />
);
вместо:
const Ball = props => {
function update(a, b) {
// props.x is visible here
}
return (
<Something onClick={update} />
);
}
this.draw
внутри Ball
. Он использует ctx
из того, что будет родительским <canvas>
а также использует ключевое слово this
для того, что будет дочерним компонентом Ball
. Как лучше интегрировать реализацию компонента без сохранения состояния, чтобы оба эти свойства были доступны?
this
при использовании апатридов функциональных компонентов, имеют в виду. Для контекста холста, вы должны будете передать его каждому Ball
, что звучит не очень хорошо.
Мы можем иметь функции внутри функциональных компонентов без сохранения состояния, ниже приведен пример:
const Action = () => {
function handlePick(){
alert("test");
}
return (
<div>
<input type="button" onClick={handlePick} value="What you want to do ?" />
</div>
);
}
Но это не очень хорошая практика, так как функция handlePick()
будет определяться каждый раз, когда вызывается компонент.