#reactjs #react-hooks
#reactjs #реагирующие хуки
Вопрос:
Это родительский компонент.
export default function CanvasPanel(props) {
const [sketchCoordinates, setSketchCoordinates] = useState([]);
useEffect(() => {
console.log(sketchCoordinates);
}, [sketchCoordinates]);
const onAddPoint = function (mousePos) {
setSketchCoordinates([
...sketchCoordinates,
{ x: mousePos.x, y: mousePos.y }
]);
};
const onPrintObject = (toPrint) => {
console.log(toPrint);
};
return (
<div className="canvas-panel">
Points:
<hr />
{sketchCoordinates.join(", ")}
<Canvas
sketchCurveCoordinates={sketchCoordinates}
addPoint={onAddPoint}
printObject={onPrintObject}
/>
<Sidepanel createPoint={onAddPoint} />
</div>
);
}
Это дочерний компонент
export default function Canvas(props) {
const getMousePos = function (event) {
const offset = canvasRef.current.getBoundingClientRect();
return {
x: event.clientX - offset.left,
y: event.clientY - offset.top
};
};
const handleOnMouseUp = (event) => {
const mousePos = getMousePos(event);
props.printObject(mousePos);
props.addPoint(mousePos);
};
return (
<div className="canvas-container">
<PureCanvas
handleOnMouseUp={handleOnMouseUp}
/>
</div>
);
};
Это компонент PureCanvas
export default class PureCanvas extends Component {
shouldComponentUpdate() {
return false;
}
render() {
return (
<canvas
className="canvas"
width="750"
height="500"
onMouseUp={this.props.handleOnMouseUp}
></canvas>
);
}
}
Код неполон, поскольку я удалил все материалы, связанные с canvas, потому что на самом деле это не имеет значения, но этого достаточно, чтобы объяснить и воспроизвести поведение. Функция addPoint должна добавлять объект со свойствами x и y в массив sketchCoordinates с помощью оператора spread и функции update из useState. Это работает при вызове addPoint({x: (any int), y: ({any int})
компонента CanvasPanel, но при вызове компонента Canvaspanel через props это работает только один раз. Массив добавляет первый элемент, но затем он просто заменяет этот же элемент новым, когда он должен добавить этот элемент. Итак, я знаю, что мог бы сделать это с классами, но я не могу понять, почему это не будет работать с хуками. На следующем рисунке показана консоль после некоторых обновлений массива sketchCoordinates:
Консоль
Редактировать
Пожалуйста, рассмотрите эту кодовую среду для дальнейшего просвещения.
Комментарии:
1. опечатка при написании вопроса, извините… Уже исправлено, спасибо, приятель.
2. 1. Вы должны ссылаться
props
, а неthis.props
. 2. Вы ссылаетесьthis.props.handleOnMouseUp
, что не является prop.3. Исправлена еще одна ошибка записи, надеюсь, сейчас их нет! Первый пост, мне действительно жаль.
4. Фокус -это хук, как я уже упоминал, что-нибудь приходит на ум?
5. На какой хук вы ссылаетесь? Единственными перехватчиками, которые вы используете, являются
useState
иuseEffect
, а последний ничего не делает.
Ответ №1:
Похоже, что это не проблема с чем-либо конкретным для перехвата: если мы заменим <canvas>
на кнопку, которая просто вызывает handleOnMouseUp
по щелчку, она работает так, как ожидалось.
Я подозреваю, что это не имеет ничего общего с перехватом, и, возможно, это какая-то деталь, которая была упрощена из вашего примера:
Вот изолированная среда кода с этой упрощенной версией, которая заменяет холст просто кнопкой.
Комментарии:
1. Спасибо за ответ. Я вижу, что это сработало с кнопкой, но мне действительно нужно, чтобы она работала на холсте… Что вы имеете в виду под «упрощенной детализацией»?
2. Я создал эту кодовую среду для просвещения.
3. Похоже, что ваша изолированная среда кода работает? Я нажимаю, и точки появляются при наведении курсора мыши, разве это не то поведение, которого вы ожидаете?
4. Нет, должна быть линия, соединяющая точки, хранящиеся в
sketchCoordinates
массиве. Но, как вы можете видеть в верхней части холста и на консоли, эти точки просто заменяютsketchCoordinates[0]
позицию вместо добавления, как указано вonAddPoint
функции в компоненте CanvasPanel.5. Вы можете проверить эту другую программную среду , чтобы понять ее соответствующее поведение. Весь вопрос в том, почему
setSketchCoordinates([ ...sketchCoordinates, { x: mousePos.x, y: mousePos.y } ]);
не работает, когдаonAddPoint
вызывается в компоненте Canvas, но работает при вызове нажатием кнопки в компоненте Sidepanel.