如何在 ReactJS 中单击时更改我的 URL
How do I change my URL on click in ReactJS
下面的代码添加了一个下一个按钮以从我的后端获取接下来的 20 个项目,单击该按钮时数据发生变化并且我获得了接下来的 20 个项目,但是 url 没有改变。
function PokemonList() {
const classes = useStyles();
let [pageNum, setPageNum] = useState(0);
const { loading, error, data } = useQuery(pokemonList, { variables: { pageNum: pageNum } });
function handleClick(e){
e.preventDefault();
setPageNum(parseInt(pageNum)+1)
}
if(error) {
return <h1> error</h1>;
}
if(loading) {
return <h1> loading</h1>;
}
return (
<div className="App">
{data.pokemonList.map((data) => (
<Card className={classes.card} variant='outlined'>
<CardHeader className={classes.titleHead} title={data.id} />
<CardMedia
className={classes.media}
component='img'
image={data.url}
title='image'
/>
<CardContent>
<Typography variant='body2' color='textSecondary' component='span'>
<p>{data.name}</p>
<br/>
<br/>
<br></br>
</Typography>
</CardContent>
</Card>
))}
<Link onClick={handleClick} className='characterlink2' to={`/pokemon/page/${parseInt(pageNum)+1}`}>
<button>
Next
</button>
</Link>
</div>
);
}
export default PokemonList;
我该如何解决这个问题?我不确定“to”和“onClick”是否一起工作。如何更改 url 和数据?
问题
单击处理程序中的 e.preventDefault();
阻止了默认导航操作的发生。
解决方案
我看不出有任何理由阻止此操作,因此我建议删除此调用以阻止默认操作。
function handleClick(e){
setPageNum(page => page + 1);
}
首选方案
假设您有一个带有 path="/pokemon/page/:page"
的路由,您应该使用 useParams
挂钩并“嗅探”当前页面。这完全消除了同步 URL 路径和本地 React 状态的需要,只有一个真实来源,即 URL 路径。
import { useParams } from 'react-router-dom';
...
function PokemonList() {
const classes = useStyles();
const { page } = useParams();
const { loading, error, data } = useQuery(
pokemonList,
{ variables: { pageNum: page } },
);
if (error) {
return <h1>error</h1>;
}
if (loading) {
return <h1>loading</h1>;
}
return (
<div className="App">
{data.pokemonList.map((data) => (
...
))}
<Link
className='characterlink2'
to={`/pokemon/page/${Number(page) + 1}`}
>
<button type="button">Next</button>
</Link>
</div>
);
}
下面的代码添加了一个下一个按钮以从我的后端获取接下来的 20 个项目,单击该按钮时数据发生变化并且我获得了接下来的 20 个项目,但是 url 没有改变。
function PokemonList() {
const classes = useStyles();
let [pageNum, setPageNum] = useState(0);
const { loading, error, data } = useQuery(pokemonList, { variables: { pageNum: pageNum } });
function handleClick(e){
e.preventDefault();
setPageNum(parseInt(pageNum)+1)
}
if(error) {
return <h1> error</h1>;
}
if(loading) {
return <h1> loading</h1>;
}
return (
<div className="App">
{data.pokemonList.map((data) => (
<Card className={classes.card} variant='outlined'>
<CardHeader className={classes.titleHead} title={data.id} />
<CardMedia
className={classes.media}
component='img'
image={data.url}
title='image'
/>
<CardContent>
<Typography variant='body2' color='textSecondary' component='span'>
<p>{data.name}</p>
<br/>
<br/>
<br></br>
</Typography>
</CardContent>
</Card>
))}
<Link onClick={handleClick} className='characterlink2' to={`/pokemon/page/${parseInt(pageNum)+1}`}>
<button>
Next
</button>
</Link>
</div>
);
}
export default PokemonList;
我该如何解决这个问题?我不确定“to”和“onClick”是否一起工作。如何更改 url 和数据?
问题
单击处理程序中的e.preventDefault();
阻止了默认导航操作的发生。
解决方案
我看不出有任何理由阻止此操作,因此我建议删除此调用以阻止默认操作。
function handleClick(e){
setPageNum(page => page + 1);
}
首选方案
假设您有一个带有 path="/pokemon/page/:page"
的路由,您应该使用 useParams
挂钩并“嗅探”当前页面。这完全消除了同步 URL 路径和本地 React 状态的需要,只有一个真实来源,即 URL 路径。
import { useParams } from 'react-router-dom';
...
function PokemonList() {
const classes = useStyles();
const { page } = useParams();
const { loading, error, data } = useQuery(
pokemonList,
{ variables: { pageNum: page } },
);
if (error) {
return <h1>error</h1>;
}
if (loading) {
return <h1>loading</h1>;
}
return (
<div className="App">
{data.pokemonList.map((data) => (
...
))}
<Link
className='characterlink2'
to={`/pokemon/page/${Number(page) + 1}`}
>
<button type="button">Next</button>
</Link>
</div>
);
}