Получение ошибки при попытке отображения изображений

# #reactjs #firebase-realtime-database #jsx

Вопрос:

Я пытаюсь создать приложение для фотолибрарии с помощью React js. Я сохраняю URL-адрес изображений в базе данных firebase в реальном времени, но когда я пытаюсь отобразить эти изображения с помощью тега img, это выдает ошибку.

 Error: img is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.
 
 The above error occurred in the <img> component:
Consider adding an error boundary to your tree to customize error handling behavior.
Visit https://reactjs.org/link/error-boundaries to learn more about error boundaries.
 
 Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in the componentWillUnmount method.
 

вот как я получаю URL-адреса из firebase

 componentDidMount(){

    axios.get('/Data.json')
    .then(response => {
       const fetchedData = [];

       for(let key in response.data){
               fetchedData.push({
               ...response.data[key],
               id: key
           });
       }
       this.setState({loading: false, data: fetchedData});
    })

    .catch(error => {
        console.error(error)
        this.setState({loading:false});
    });

}

 

и вот как я пытаюсь отобразить изображения

 this.state.data.reverse().map((res) => (    
        <div className="card1">
                   <Card
                   key={res.id}
                   style={{backgroundColor:"#343a40", textAlign:"left" , 
                   margin:"20px" ,color: "white",
                   left:"370px", borderRadius:"10px",
                   overflow:"hidden", width:"600px", 
                    height:"200px", boxShadow:"0 10px 18px 0 rgba(0,0,0,0.2)"}}
                   >

                  <Card.Body
                  className="container">
                       <h4>
                       ANONYMOUS
                        </h4>
                       <Card.Text>
                        {res.Comment} 
                       </Card.Text>
                        
                        <Card.Img>
                        <img src={res.ImageUrl} width = "400px" height="150px" />
                            </Card.Img>
                 
                 <Button className="btn btn-danger" 
                 style={{float:"right", width:"40px"}}
                 onClick={() => this.DeleteCommentHandler(res.id)}>
                     
                     <FontAwesomeIcon icon={faTrash}/>
                     
                     </Button> 
                   </Card.Body>
                   <Card.Footer>
                       {res.Date}
                   </Card.Footer>
                   </Card>                                
                   
           </div>
       )
)}
 

Пожалуйста, помогите.

Ответ №1:

<Card.Img> является тегом img, поэтому вы должны обновить его, чтобы изменить элемент по умолчанию:

 <Card.Img as="div">
  <img src={res.ImageUrl} width="400px" height="150px" />
</Card.Img>
 

И вы можете добавить переменную для проверки смонтированного или размонтированного компонента перед вызовом setState

 componentDidMount(){
  this.mounted = true;

  ...
  this.mounted amp;amp; this.setState({loading: false, data: fetchedData});
  ...AbortController
}

componentWillUnmount(){
  this.mounted = false
}