請教各位
我用 react-create-app 建立專案
想從 url 片段中取一部分值 然後顯示對應資料夾內的圖片
像這樣
// 假設首頁是這個網址
pseudo.com
// 在這個網址時就顯示名為 projectName 資料夾內的圖片
pseudo.com/categoryName/projectName
我用 react-router-dom 處理路由
用 useLocation 這個 Hook 來取得 routing 間傳遞的 data
但會顯示 module not found error
import() 的部分(會出現 module not found 錯誤)
function ImageGallery({ galleryDirectory }) {
const [images, setImages] = useState([]);
useEffect(() => {
const loadImages = async () => {
try {
const imageContext = await import(
`./img/portfolio/${galleryDirectory}`
);
const imagePaths = imageContext.keys();
const imageComponents = await Promise.all(
imagePaths.map(async (path) => {
const module = await import(
`./img/portfolio/${galleryDirectory}/${path.slice(2)}`
);
const imageSrc = module.default;
return <img keys={path} src={imageSrc} alt={path} />;
})
);
setImages(imageComponents);
} catch (error) {
console.error("error loading images:", error);
}
};
loadImages();
}, [galleryDirectory]);
return <>{images}</>;
}
export default ImageGallery;
如果用 require.context() 而不是import()的話 其中 directory 似乎不能是變數?
require.context(
directory,
(useSubdirectories = true),
(regExp = /^\.\/.*$/),
(mode = 'sync')
);
資料夾結構
public/
src/
api/
projectData.js
img/
portfolio/
graphic1/
graphic_1.jpg
graphic_2.jpg
...
web1/
web_1.png
web_2.jpg
...
App.js
ImageGallery.js // 進行 import() 的檔案
SingleProject.js
index.js
提供 package.json 版本資訊
"dependencies":{
...
"react": "^18.2.0",
"react-router-dom": "^6.14.2",
...
}
"devDependencies": {
...
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
}
另外附上線上demo的codesandbox
謝謝!
如果你是要用Rest URL的方式傳遞參數,可以參考以下寫法
MyRouter.jsx
export const router = createBrowserRouter([
{
path: "/",
element: <App></App>,
children: [{ path: 'test/:TID', element: <TestComp /> },]
}
])
TestComp
import React, { useState } from 'react'
import { useParams } from 'react-router-dom'
const TestComp = (props) => {
let { TID } = useParams()
return(
<div>Hello World{TID}</div>
)
}
export default TestComp
如果是public的圖片,那我會這樣秀出來。
logo.png就放在public那個資料夾底下
<img src={process.env.PUBLIC_URL + '/logo.png'}
如果是要控制顯示的圖片,我在別的網站有看到Sample Code
Adding Images, Fonts, and Files
import React from 'react';
import logo from './logo.png'; // Tell webpack this JS file uses this image
console.log(logo); // /logo.84287d09.png
function Header() {
// Import result is the URL of your image
return <img src={logo} alt="Logo" />;
}
export default Header;