#javascript #reactjs #react-hooks #toggle #react-functional-component
#javascript #reactjs #реагирующие крючки #переключение #реагировать-функциональный компонент
Вопрос:
Я искал похожие вопросы, но не могу понять, что я делаю не так.
Я пытаюсь переключиться с фотографии на текст onClick, чтобы при нажатии на фотографию отображался текст, а не изображение. Но когда я нажимаю на фотографию, я получаю сообщение об ошибке: «setToggleImage не является функцией».
Я почти уверен, что что-то упускаю, но я этого не вижу. Вот код, любая помощь, прежде чем я сойду с ума, очень ценится:
import React, { useState } from 'react';
import Image from 'react-bootstrap/Image';
import profilePhoto from '../images/_MG_9807.JPG';
const contactInfo = {
title: 'Contact: ',
email: 'email: xxx@gmail.com',
Github: ' Github: ',
linkedin: 'linkedin: ',
};
const ImageContactDetails = () => {
const [ toggleImage, setToggleImage ] = useState(true);
return (
<div>
<div className='imageContactDetails' onClick={() => setToggleImage(!toggleImage)} >
{ toggleImage ? <Image id='imageDetails' src={profilePhoto} alt='professionalprofile' /> :
<div>
<h4> {contactInfo.title} </h4>
<h5> {contactInfo.email} </h5>
<h5> {contactInfo.Github} </h5>
<h5> {contactInfo.linkedin} </h5>
</div>
}
</div>
<div id='contactInfo'></div>
</div>
)
}
export default ImageContactDetails;
Ответ №1:
useState()
возвращает пару значений в массиве, поэтому вам следует использовать деструктурирование массива. Это должно быть:
const [toggleImage, setToggleImage] = useState(true);
Комментарии:
1. ах! спасибо, что исправили это. Однако после его изменения я все еще не заставляю код работать. Он не показывает мне ошибку, но она не меняется при нажатии (хотя предупреждение работает). У вас есть какие-либо предложения?
2. Отлично, я буду рад изучить ваш код @AOJ, если вы можете поделиться им. На данный момент я вижу, что вы
changeToText
ничего не должны возвращать. Я бы, вероятно, полностью отказался от него и добавил встроенную функцию в onClick, likeonClick={() => setToggleImage(!toggleImage)}
и визуализировал в вашемreturn
условно на основе значенияtoggleImage
.3. Большое вам спасибо! это действительно сделало трюк, который я пытался сделать. Вы не представляете, как я обрадовался, когда это сработало. Я обновил весь приведенный выше код. Это не так уж много, это все, что у меня есть для этого. Однако я столкнулся с другой небольшой проблемой. после «: » в троичном операторе я пытался вызвать несколько абзацев, и это не сработало, поэтому я создал эту переменную «allInformation» для хранения того, что я хотел использовать, и она печатает, но все это смешивается вместе. Любые советы о том, как я мог бы разбить их на несколько строк?
4. Не беспокойтесь. Однако вы не можете вставить массив таким образом. React преобразует его в список текстовых узлов, которые будут отображаться в одной строке. Вам нужно добавить необходимые HTML-теги (и я уверен
h4
, что это не тот, который нужно. Возможноul
,li
илиdl
список?)5. Привет, Жолт, у меня не было возможности вернуться и поблагодарить тебя за совет раньше. На самом деле, я понял, что я делал неправильно в первую очередь, что было очень простой вещью. Я не понимал, что в react все возвращаемые данные должны быть перенесены в один корневой элемент DOM, где имеется более одного элемента. Я думал, что это только для основного. код обновляется на случай, если он может помочь кому-либо еще.