При передаче изображения через useContext из входа в систему и изображение не отображается - PullRequest
0 голосов
/ 19 июня 2020

Во время onSubmit в логине я сделал setLoginPhoto(res.data.photo), а затем использовал useContext(), чтобы передать информацию о фотографии в Navigation. Но, видимо, информация о фотографии исчезает после успешного входа в систему и отображения главного экрана. Также loginPhoto.photo, одна фотография - undefined, но я могу видеть детали изображения в loginPhoto при наведении на нее.

При нажатии на «Вход в систему» ​​я установил различные точки останова и увидел информацию об изображении. фактически передается в UserLoginProvider, а затем доступно в Navigation. (см. снимки экрана)

примечание: путь к файлу изображения сохранен в базе данных с помощью multer, ie, [var imagePath = req.file.path;], и изображения отображаются на других экранах, например на главном экране и экранах профиля.

Пошагово: Нажмите «Войти», я увидел loginPhoto в UserLoginProvider с изображением (см. Снимок экрана)

enter image description here

Now I could see the loginPhoto available in Navigation:

enter image description here

But once the login is successful and Home page displays, the loginPhoto become null and the image is not displaying in navigation. Any advise on how to fix this problem ?

Login.js

import React, { useContext, useEffect, useState } from "react";
import { UserProfileContext, UserLoginContext } from '../context';

  const {loginPhoto, setLoginPhoto} = useContext(UserLoginContext);
  const [helperText, setHelperText] = useState('');
  const [value, setValue] = React.useState('');
const onSubmit = () => {
    const fetchData = async () => {
      try {
        const res = await axios.post('http://localhost:8000/service/login', { email, password });
        //setLoginData(res.data.loginData);  
        console.log("Front End success message:" + res.data.success);
        console.log("My Photo Data:" + res.data.photo);
        setLoginPhoto(res.data.photo);
        if (res.data.success) {
          setHelperText("Login successfully");
          setValue(res.data.privilege);
          localStorage.setItem('Privilege', res.data.privilege);
          localStorage.setItem('loginEmail', email);
          history.push('/')
          window.location.reload(true)
        }
        else {
          const failMessage = res.data.fail;
          setHelperText(failMessage);
        }
      } catch (e) {
        console.log(e.response.data);
        setHelperText(e.response.data.fail);
      }
    }
    fetchData();
  };

UserLoginProvider.js

import { UserProfileContext, UserLoginContext } from '../context';

const UserLoginProvider = ({children}) => {

    const [loginPhoto, setLoginPhoto] = useState({ photo: ''});

    console.log("Nav Image:"+loginPhoto);

     const value = useMemo(() => ({
        loginPhoto, setLoginPhoto
    }), [loginPhoto]);

    return (
       
           {children}
       
    )   
}
export default UserLoginProvider;

Navigation.js

import { UserProfileContext, UserLoginContext } from '../context';
    const { loginPhoto } = useContext(UserLoginContext);
    
        useEffect(() => {
            if (loginPhoto.photo) {
            
            const reader = new FileReader();
            reader.addEventListener('load', () => {
                setImgSrc(reader.result);
                localStorage.setItem("imgData", reader.result);
            });
            reader.readAsDataURL(loginPhoto.photo);
            }
        }, [loginPhoto.photo])
    
        var loginUserImg = localStorage.getItem('imgData');
    
        console.log(loginUserImg);
    
     
image

App.js

var ReactDOM = require("react-dom");


const App = () => {

  return (
  
  
    
          <>
        
          
              
              
              
              
              
              
              
          
          </>
      
    
   
  );
};
ReactDOM.render(
  React.createElement(App, null),
  document.getElementById("root")
);

export default App;

home.js

import React, { useRef, useEffect, useState } from "react";
import AlertDialog from "../modal/Dialog";
import Axios from "axios";


const Home = () => {

  const [phoneTooltip, setPhoneTooltip] = useState({ show: false, position: "absolute" });
  const [playerList, setPlayerList] = useState([]);
  const [searchTerm, setSearchTerm] = useState("");
  const [searchResults, setSearchResults] = useState([]);
  const [deleteIcon, setDeleteIcon] = useState({ show: false });
  const [deleteDialog, setDeleteDialog] = useState(false);
  const [playerId, setPlayerId] = useState("");
  const isMounted = useRef(false);
  const [isLoading, setIsLoading] = useState(true);


  const handleChange = event => {
    setSearchTerm(event.target.value);
  };


  useEffect(() => {
    isMounted.current = true;
    return () => isMounted.current = false;
  }, []);


  useEffect(() => {
    setTimeout ( () => {
    const fetchData = async () => {
      try {
        const res = await Axios.get('http://localhost:8000/service/players');
        if (isMounted.current) {
          setPlayerList(res.data.players);
          setSearchResults(res.data.players);
          const privilege = localStorage.getItem('Privilege');
          console.log("What is getting in Front End:" + privilege);
          showDeleteIcon(privilege);
          setIsLoading(false);
        }
      } catch (e) {
        if (isMounted.current) {
          setIsLoading(false);
        }
        console.log(e);
      }
    }
    fetchData();
    }, 1500);
  }, []);


  useEffect(() => {
    const results = playerList.filter(player =>
      player.name.toLowerCase().includes(searchTerm) || player.name.toUpperCase().includes(searchTerm) || player.position.toLowerCase().includes(searchTerm)
      || player.position.toUpperCase().includes(searchTerm)
    );
    setSearchResults(results);
  }, [searchTerm, playerList]);


  const displayPhoneToolTip = (userId) => e => {
    e.preventDefault();
    setPhoneTooltip(userId); // show tooltip
    setTimeout(() => {
      setPhoneTooltip(false); // remove/hide tooltip
    }, 4000);
  };

  const showDeleteIcon = (privilege) => {
    if (privilege === "ADMIN") {
      setDeleteIcon({ show: true })
    } else {
      setDeleteIcon({ show: false })
    }
  }
  const deletePlayer = (id) => e => {
    setPlayerId(id);
    setDeleteDialog(true);
  }

  const onDelete = id => () => {
    try {
      Axios.delete('http://localhost:8000/service/player', {
        headers: {
          'Content-Type': 'application/json'
        },
        data: {
          'id': id
        }
      });
      setDeleteDialog(false);
      const restOfPlayerResults = searchResults.filter((result) => result.id !== id)
      setSearchResults(restOfPlayerResults);
    } catch (e) {
      console.log(e);
    }
  }


  return (
      Игроки    {! SearchResults.length &&! IsLoading && ( Не соответствует ни одному результату!  )} {isLoading? (     ): ( {searchResults.map (({идентификатор, фото, должность, номер телефона, имя}) => ( {deleteIcon.show && (  )}   {имя}  {позиция}    {"phoneTooltip.show"}  {phoneTooltip === id && ( {номер телефона} )} ))} )}    setDeleteDialog (false)} playerId = {playerId} /> ); } экспорт по умолчанию Home; 

1 Ответ

1 голос
/ 24 июня 2020

Я создал уменьшенную версию приложения, в которой решена ваша проблема. Из того, что я мог сказать, проблема заключалась в том, что loginPhoto передавался в виде строки вместо объекта формы {photo: "image/example.jpeg"}.

Другая проблема заключалась в том, что window.location.reload(true) вызывался после нажатия на страницу Home. Это стерло контекст.

Вы можете посетить мой Codesandbox , чтобы увидеть, что именно я изменил. Введите дополнительный логин в эту оболочку и посмотрите, работает ли сейчас что-нибудь.

...