Saat meneruskan gambar melalui useContext dari login dan gambar tidak ditampilkan

Selama onSubmit di Login, saya melakukan setLoginPhoto(res.data.photo)dan kemudian menggunakan useContext() untuk meneruskan informasi foto ke Navigasi. Namun ternyata informasi foto tersebut semakin hilang setelah login berhasil dan menampilkan layar Beranda. Juga loginPhoto.photo, foto saja adalah undefined, tetapi saya dapat melihat detail gambar di loginPhoto sambil mengarahkan kursor ke sana.

Saat mengklik Login, saya telah menetapkan berbagai break point dan melihat informasi gambar diteruskan ke UserLoginProvider dan kemudian tersedia di Navigation. (silakan lihat lihat tangkapan layar)

catatan: Jalur file gambar disimpan ke database menggunakan multer, yaitu, [ var imagePath = req.file.path;] dan gambar ditampilkan di layar lain, seperti layar Beranda, layar Profil.

Langkah demi langkah: Tekan Masuk, saya dapat melihat loginPhoto di UserLoginProvider sudah ada gambarnya (lihat tangkapan layar)

masukkan deskripsi gambar di sini

Sekarang saya bisa melihat loginPhoto tersedia di Navigasi:

masukkan deskripsi gambar di sini

Namun setelah login berhasil dan halaman Beranda ditampilkan, loginPhoto menjadi nol dan gambar tidak ditampilkan di navigasi. Adakah saran tentang cara memperbaiki masalah ini?

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 (
       <UserLoginContext.Provider value={value}>
           {children}
       </UserLoginContext.Provider>
    )   
}
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);
    
     <img className="nav_profile" src={loginUserImg}></img>

App.js

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


const App = () => {

  return (
  <BrowserRouter>
  <UserLoginProvider>
    <UserProfileProvider>
          <>
        <Navigation />
          <Switch>
              <ProtectedRoute exact path="/" component={Home} />
              <ProtectedRoute path="/profile" component={Profile} />
              <ProtectedRoute path="/aboutus" component={Aboutus} />
              <ProtectedRoute path="/availability" component={Availability} />
              <Route path="/register" component={Register} />
              <Route path="/login" component={Login} />
              <Route exact path="*" component={ErrorPage} />
          </Switch>
          </>
      </UserProfileProvider>
    </UserLoginProvider>
   </BrowserRouter>
  );
};
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 (
    <div className="App">
      <div className="wrapper">
        <div className="playerList_header">
          <h2>Players</h2>
          <label>
            <div className="playerSearch_Home">
              <div className="playerSearch_Icon">
                <img alt="" src="/images/search-image-player.jpg"></img>
              </div>
              <input type="text" className="playerSearch_Home_Input" placeholder="Search players..." value={searchTerm} onChange={handleChange} />
            </div>
          </label>
        </div>
        <div>
        {!searchResults.length && !isLoading && (<div> <p className="noSearchData"> Does not match any results! </p> </div>)}
        <div className="playerList_home_page">
        {isLoading ? (
        <div className="loader">
        <div className="bubble"></div>
        <div className="bubble"></div>
        <div className="bubble"></div>
        <div className="bubble"></div>
      </div>
      ) : (
          <div className="grid-container">
            {
              searchResults.map(({ id, photo, position, phonenumber, name }) => (
                <div key={id} className="grid-item">
                  {
                    deleteIcon.show && (
                      <span className="deletePlayerButton" onClick={deletePlayer(id)}>
                        <img className="deletePlayerimg" src="/images/delete.png"></img>
                      </span>
                    )}
                  <div>
                    <img alt="" className="playerProfilePic_home_tile" key={photo} src={photo}></img>
                  </div>
                  <div className="playerProfile_grid_border">
                    <span className="rec_name_position_data">
                      <h3 key={name}>{name}</h3>
                      <span className="playerPosition_home_tile" key={position}>{position}</span>
                    </span>
                  </div>
                  <span className="phoneNumber_home">
                    <img src="/images/phone.png" alt={"phoneTooltip.show"} key={id} name="phoneNumberhomeicon" onClick={displayPhoneToolTip(id)} />
                  </span>
                  {phoneTooltip === id && (
                    <div className="tooltip_PhoneNumber_home" key={phonenumber}>{phonenumber}</div>
                  )}
                </div>
              ))
            }
          </div>
         )}
        </div>
       </div> 
      </div>
      <AlertDialog
        onDelete={onDelete}
        open={deleteDialog}
        onClose={() => setDeleteDialog(false)}
        playerId={playerId}
      />
    </div>
  );
}

export default Home;

person soccerway    schedule 19.06.2020    source sumber
comment
Hai, jadi saya tidak sempat melihat semuanya di Codesandbox, tetapi dari apa yang saya lihat sekilas saja Anda mencoba mengakses properti photo di loginPhoto tetapi di Login.js Anda menyetel konteks loginPhoto sebagai string dengan setLoginPhoto(res.data.photo) jadi properti ini tidak ada. Oleh karena itu mengapa debugger Anda menampilkan string gambar yang benar saat diarahkan. Beri tahu saya jika ini penyebab kesalahannya   -  person itsanewabstract    schedule 23.06.2020
comment
Saya rasa seperti yang Anda katakan, saya dapat melihat string saat login di sini setLoginPhoto(res.data.photo) segera setelah login berhasil dan menampilkan halaman Beranda, pada titik tertentu menjadi nol...   -  person soccerway    schedule 23.06.2020
comment
Maksud saya ketika halaman Beranda ditampilkan, saya tidak dapat melihat string gambar lagi..   -  person soccerway    schedule 23.06.2020
comment
Setelah saya mendapatkan gambar di sana, gambar tersebut perlu dikonversi ke base64 untuk disimpan di Penyimpanan Lokal ... sehingga saya dapat menampilkannya di Navigasi sebagai login user image/photo   -  person soccerway    schedule 23.06.2020
comment
Mungkinkah ada masalah saat menjalankan window.location.reload(true) di fungsi fetchData di Login.js? Mungkin memuat ulang menyebabkan nilai dalam konteks hilang. Jika itu tidak memperbaikinya, posting tautan ke aplikasi lengkap dan saya akan melihat lebih dalam di sana   -  person itsanewabstract    schedule 23.06.2020
comment
Saya telah mencoba mengomentari bagian reload //window.location.reload(true)   -  person soccerway    schedule 23.06.2020
comment
Saat saya menyetel break point, saya dapat melihat gambar muncul di sini var loginUserImg = localStorage.getItem('imgData'); .tetapi sambil melanjutkan break point, gambar tersebut kembali mengarah ke baris ini const { loginPhoto } = useContext(UserLoginContext);   -  person soccerway    schedule 23.06.2020
comment
pada saat itu menjadi nol..   -  person soccerway    schedule 23.06.2020
comment
Semoga segera setelah login berlalu dan menampilkan halaman beranda...   -  person soccerway    schedule 23.06.2020
comment
Kode sumber lengkap? Komponen Router dan komponen Halaman Beranda akan sangat membantu   -  person itsanewabstract    schedule 23.06.2020
comment
Saya telah menambahkan komponen App.js dan Home untuk referensi Anda   -  person soccerway    schedule 23.06.2020


Jawaban (1)


Saya telah membuat contoh versi aplikasi yang lebih kecil yang dapat mengatasi masalah Anda. Dari apa yang saya tahu, masalahnya adalah loginPhoto diteruskan sebagai string, bukan objek dalam bentuk {photo: "image/example.jpeg"}.

Masalah lainnya adalah window.location.reload(true) dipanggil setelah mendorong ke halaman Home. Hal ini menghilangkan konteksnya.

Anda dapat mengunjungi Codesandbox saya untuk melihat apa sebenarnya Aku berubah. Isi login tambahan Anda di dalam shell ini dan lihat apakah semuanya berfungsi sekarang.

person itsanewabstract    schedule 23.06.2020
comment
Terima kasih, ini abstrak baru, jawaban yang sangat mengesankan dan bagus. Ini berfungsi sekarang, tetapi saya melihat ada masalah jika saya menyegarkan browser, gambarnya sekarang hilang - person soccerway; 24.06.2020
comment
Adakah cara untuk memperbaiki gambar penyegaran browser yang hilang... - person soccerway; 24.06.2020
comment
@soccerway Ah ya, itu salah ketik di pihak saya. Saya menggunakan localStorage.setItem("imgData", loginPhoto.photo) padahal seharusnya saya menyetel res.data.photo. Saya mengedit kode saya dan gambarnya akan tetap ada sekarang - person itsanewabstract; 24.06.2020
comment
Teman yang luar biasa, hargai semua bantuan Anda. - person soccerway; 24.06.2020
comment
Pernahkah Anda mengetahui mengapa asosiasi model tidak berfungsi dalam kasus ini. Saya mendapat dua tabel sederhana, yaitu pengguna, ketersediaan. Tapi saya masih mendapatkan pengguna tidak terkait dengan ketersediaan: judul stackoverflow.com/questions/62525061/ - person soccerway; 25.06.2020
comment
@soccerway Saya akan melihat dan melihat apa yang bisa saya lakukan - person itsanewabstract; 25.06.2020
comment
Terima kasih itanewabstrak.. Sesuai pertanyaan saya ingin mendapatkan data dari photo, position kolom dari tabel pengguna dan dailystatus kolom dari tabel ketersediaan. Model diberikan dalam pertanyaan. MySQL adalah database saya dan menggunakan alat dbeaver untuk terhubung ke database dan melihat tabel..Saya telah membuat database, tetapi tabel secara otomatis dibuat dari model Sekuel saat menjalankan file server.js - person soccerway; 25.06.2020
comment
@soccerway Saya melihat pertanyaannya tetapi sepertinya ini lebih merupakan pertanyaan SQL daripada pertanyaan React. Sayangnya saya tidak terlalu paham dengan SQL jadi menurut saya pertanyaannya di luar bidang keahlian saya. Namun jika Anda memiliki pertanyaan spesifik React lainnya, silakan beri tahu saya - person itsanewabstract; 25.06.2020
comment
Saya punya masalah array react-hooks lainnya, bisakah Anda melihatnya jika Anda punya waktu: -are-not-completely-displaying-in-react-ho" title="saat mengulangi array, catatan tidak sepenuhnya ditampilkan di react ho">stackoverflow.com/questions/62586105/ - person soccerway; 26.06.2020