#javascript #reactjs #react-hooks #react-props
#javascript #reactjs #реагирующие крючки #реагировать-реквизит
Вопрос:
В настоящее время я изучаю React и работаю над проектом, в котором я пытаюсь отобразить пользовательский компонент изображения. Компонент должен отображаться поочередно в левой или правой части экрана.
Я настроил метод handleSide, который просто возвращает перевернутое логическое значение. Но я пытаюсь вызвать этот метод и передать его возвращаемое значение в качестве prop:
Обработка:
const side = true;
const handleSide = () => {
side = !side;
return side;
};
В моем render():
<Image side={handleSide} src="*not including here*">
Как я могу вызвать handleSide, а затем передать возвращаемое значение для props.side? В настоящее время кажется, что он просто вызывает метод (я думаю), но на самом деле не передает его как prop. Я также пробовал что-то вроде этого:
<Image side={handleSide} sideBool={side} src="*not including here*>
По сути, надеясь, что будет вызван handleSide, а затем принять новое значение стороны и поместить его в sideBool. Но, похоже, это не сработало — каждый рендеринг возвращал True, а не изменял True False . Спасибо!
Комментарии:
1. Вы не можете повторно назначить константу
side = !side;
, которая приведет к:TypeError: Assignment to constant variable.
Ответ №1:
Вы могли бы сделать следующее:
const { useState, useCallback } = React;
const Image = ({ handleSide, sideBool }) => (
<div>
side is:{String(sideBool)}
<button onClick={handleSide}>toggle side</button>
</div>
);
const App = () => {
const [side, setSide] = useState(true);
const handleSide = useCallback(
() => setSide((side) => !side),
[]
);
return <Image handleSide={handleSide} sideBool={side} />;
};
ReactDOM.render(<App />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="root"></div>
Комментарии:
1. Спасибо за помощь! Я не смог заставить ваш код работать, но понял, что когда я изменил свою побочную переменную на let, а не на const, а затем использовал handleSide() вместо handleSide, это работает. Все еще изучаю JavaScirpt, но многому научился из этого!
2. @Sameer
I couldn't get your code to work
: вы можете буквально щелкнуть фрагмент кода Run , доказывающий, что он работает. Возможно, что-то пошло не так при копировании и вставке в ваш проект.