老师您好!想问一下新的Menu组件写法如何添加Link跳转?
来源:4-3 使用动态路由获取不同列表内容(3)
小青晞
2022-05-08 18:31:22
问题描述:
使用新的Menu组件写法,没有单独的item项可添加Link标签,在Menu上添加onClick事件,使用window.location.href会直接让整个页面刷新,而不是只刷新NewList列表组件(NewList组件每次执行componentDidMount生命周期函数,而UNSAFE_componentWillReceiveProps函数不执行),请老师帮忙看一下,感谢!!!
相关代码:
import React, { Component, Fragment } from "react";
import { Link } from "react-router-dom";
import { Menu } from "antd";
import { UsergroupDeleteOutlined,IdcardOutlined,DingdingOutlined,GoogleOutlined,WechatOutlined,DribbbleOutlined} from '@ant-design/icons';
import axios from "axios";
import logo from './logo.png';
import './style.css';
class AppHeader extends Component {
constructor(props){
super(props);
// this.handleClick=this.handleClick.bind(this);
this.state={
list:[]
}
}
handleClick(e){
window.location.href=`/${e.key}`;
}
render() {
return (
<Fragment>
<img src={logo} className="app-header-logo"></img>
<Menu
onClick={this.handleClick}
items={this.state.list}
mode="horizontal"
className="app-header-menu"
></Menu>
</Fragment>
)
}
componentDidMount(){
axios.get("https://www.fastmock.site/mock/2d0bfbad91781ac90165c031f3ee88d0/news/api/indexHeader")
.then(res=>{
const resData=res.data.data;
for(const item of resData){
if(item.icon==='<UsergroupDeleteOutlined />'){
item.icon=<UsergroupDeleteOutlined />;
}else if(item.icon==='<IdcardOutlined />'){
item.icon=<IdcardOutlined />;
}else if(item.icon==='<DingdingOutlined />'){
item.icon=<DingdingOutlined />;
}else if(item.icon==='<GoogleOutlined />'){
item.icon=<GoogleOutlined />;
}else if(item.icon==='<WechatOutlined />'){
item.icon=<WechatOutlined />;
}else if(item.icon==='<DribbbleOutlined />'){
item.icon=<DribbbleOutlined />;
}
}
this.setState({
list:resData
});
})
.catch(err=>{
console.log(err);
});
}
}
export default AppHeader;相关代码:
import React, { Component } from 'react';相关代码:
import ReactDOM from 'react-dom/client';
import { Layout } from 'antd';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
import AppHeader from './components/Header';
import AppList from './containers/List';
import AppDetail from './containers/Detail';
import 'antd/dist/antd.css';
import './style.css';
const { Header, Footer, Sider, Content } = Layout;
class App extends Component {
render() {
return (
<BrowserRouter>
<Layout style={{
minWidth: 1200,
height: '100%'
}}>
<Header className="header">
<AppHeader></AppHeader>
</Header>
<Content className="content">
<Switch>
<Route path="/detail" component={AppDetail}></Route>
<Route path="/:id?" component={AppList}></Route>
</Switch>
</Content>
<Footer className="footer">@copy Jia-Jia 2022</Footer>
</Layout>
</BrowserRouter>
)
}
}
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<App></App>
);相关代码:
import React,{Component} from "react";
import { List } from 'antd';
import axios from "axios";
class AppList extends Component {
constructor(props){
super(props);
this.state={
listData:[]
};
}
UNSAFE_componentWillReceiveProps(){
//不执行
console.log('test');
}
componentDidMount(){
//每次执行
const id=this.props.match.params.id;
axios.get(`http://www.dell-lee.com/react/api/list.json?id=${id}`)
.then(res=>{
this.setState({
listData:res.data.data
});
})
.catch(err=>{
console.log(err);
});
}
render(){
return (
<List
style={{
backgroundColor: "#fff"
}}
bordered
dataSource={this.state.listData}
renderItem={item => <List.Item>{item.title}</List.Item>}
/>
)
}
}
export default AppList;相关代码:
插件版本如下: "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^13.2.0", "@testing-library/user-event": "^14.1.1", "antd": "^4.20.2", "axios": "^0.27.2", "cra-template": "1.2.0", "react": "^18.1.0", "react-dom": "^18.1.0", "react-router-dom": "^4.3.1", "react-scripts": "5.0.1", "web-vitals": "^2.1.4"
1回答
同学你好,可以参考官网示例设置链接菜单项,如下:

调整下数据结构中的label属性值,直接添加Link跳转,如下:

示例:

祝学习愉快~
相似问题