用React搭建一个简单的菜单系统

用react搭建一个简单的菜单列表,点击跳转菜单详情,作为Demo学习使用。
先来个效果图
image.png
话不多说,上代码
1:搭建一个react项目

create-react-app my-react

2:安装url模块,方便解析url地址,获取参数,安装axios,发送get请求

cnpm install url axios -S

3:启动项目,将静态文件html、css、拷贝到src/static下面
4:新建一个router.js用来实现路由跳转
router.js

import React from "react";
import {
  BrowserRouter as Router,
  Switch,
  Route,
  Link
} from "react-router-dom";

import Home from './component/Home';
import Detail from './component/Detail.js';
//exact 就是执行严格匹配路由 
export default function BasicExample() {
  return (
    <Router>
      <div>
        <Switch>
          <Route exact path="/" component={Home}></Route>
          <Route path="/detail" component={Detail}></Route>
        </Switch>
      </div>
    </Router>
  );
}

5:在index.js中引入我们定义好的router.js
image.png

好了,现在可以再home页面初始化页面获取数据并且显示了
6:在构造器中定义一个公共的domain变量和list

constructor(){
		super();
		this.state={
			domain:"http://a.itying.com/",
			list:[]
		};
	};

7:在componentDidMount中具体些请求方法

	initGetData(){
		let api = this.state.domain+"api/productlist";
		axios.get(api).then((res)=>{
			let list = res.data.result;
			//console.log(list);
			this.setState({
				list
			});
		}).catch(err=>{
			console.log(err)
		});
	};

8:在render中具体获取数据

	render(){
		return(
			<div>
				<header className="index_header">
					<div className="hlist">
						<img src={require("../static/image/rexiao.png")} />
						<p>热销榜</p>				
					</div>
					<div className="hlist">
						<img src={require("../static/image/caidan.png")} />
						<p>点过的菜</p>				
					</div>
					<div className="hlist">
						<img src={require("../static/image/sousuo.png")} />
						<p>搜你喜欢</p>				
					</div>
				</header>			
				<div className="content">
					{
					this.state.list.map((value,key)=>{
						return (
						<div className="item" key={key}>
							<h3 className="item_cate">{value.title}</h3>
							<ul className="item_list">
							{
								value.list.map((values,k)=>{
									return(
										<li key={k} >
											<Link to={`/detail?id=${values._id}` } >
												<div className="inner">
													<img src={`${this.state.domain}${values.img_url}`} />
													<p className="title">{values.title}</p>						
													<p className="price">¥{values.price}</p>
												</div>
											</Link>
										</li>
									)
									
								})
							}	
							</ul>
						</div>
							
						)
					})	
					}
				</div>
				<div className="bg" id="bg"></div>
			</div>
		)
	}

ps:这里要注意几个小问题,我就稍微搞错了,1列表Link跳转用了最新的ES6的语法,使用了query传递id,2双层循环里面记得也要return返回,3双层循环注意变量不能一样,防止冲突
####好了,当我们点击列表的时候,就可以实现页面跳转到详情页
效果图
image.png
然后我们再详情页获取url中id,然后查询数据库,获取数据填充页面就OK啦。
Detail.js

1:引入需要的包

import React,{Component} from 'react';
import '../static/css/pcontent.css';
import axios from 'axios';
import  url from 'url';
import {Link} from 'react-router-dom';

2:组件初始化后获取url参数id,查询接口,获取数据

	componentDidMount(){
		//这里只能获取一个query
		let goUrl= url.parse(this.props.location.search,true);
		console.log(goUrl);
		let id = goUrl.query.id;
		this.initGetData(id);
	};

3:获取数据

initGetData(id){
		let api = this.state.domain+'api/productcontent?id='+id;
		axios.get(api).then(res=>{
			//注意 这里直接转对象方便后面获取 不会出现bug  render直接获取list[0]会有bug
			let list =res.data.result[0]
			this.setState({
				list
			});
		}).catch(err=>{
			console.log(err);
		});
	};

4:render渲染数据

	render(){
		return(
			<div>
				<div className="back"><a href='/'>返回</a></div>
					<div className="p_content">		
						<div className="p_info">				
							<img src={`${this.state.domain}${this.state.list.img_url}`}/>				
							<h2>{this.state.list.title}</h2>				
							<p className="price">{this.state.list.price}/份</p>
						</div>
						<div className="p_detial">
							<h3>
								商品详情					
							</h3>
							<div className="p_content"> 
								<br />
								{this.state.list.content}
								<br />
								<p>{this.state.list.description}</p>
							</div>
						</div>
					</div>
					<footer className="pfooter">
						<div className="cart">				
							<strong>数量:</strong>
							<div className="cart_num">
							  <div className="input_left">-</div>
							  <div className="input_center">
								  <input type="text"  readOnly="readonly" value="1" name="num" id="num" />
							  </div>
							  <div className="input_right">+</div>				      
							</div>								
						</div>
						<button className="addcart">加入购物车</button>			
					</footer>
			</div>
		)
	}

OK,这样一个简单的列表+详情就完成啦~~~~

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值