React 实现列表页和列表详情页功能

1.简介

本篇文章将会基于react 实现列表页和列表详情的功能,后续会完善更多的功能细节。

2.实现

一、列表页 && 详情页

a.app.js

 入口类,实现路由功能

import './App.css';
import {BrowserRouter, Route, Routes} from 'react-router-dom';
import {UserList} from "./page/user-list";
import {UserDetail} from "./page/user-detail";

function App() {
    return (
        <div className="App">
            <BrowserRouter>
                <Routes>
                        <Route exact path="/users" element={<UserList/>}/>
                        <Route exact path="/user/:id" element={<UserDetail/>}/>
                </Routes>
            </BrowserRouter>
        </div>
    );
}

export default App;

b.user-list.js

列表页

import {useRequest} from "../hook/http";
import {useEffect} from "react";
import {Link} from "react-router-dom"

export const UserList = () => {
    // 这个是自定义请求hook(可以看之前文章),state为请求执行状态和结果,doRequest会发起请求
    const {state, doRequest} = useRequest();


    useEffect(() => {
        // 可以mock下数据
        doRequest('http://vicyor.com/crm/users', {page: 1, pageSize: 20}, {}, 'POST');
    }, []);

    return (
        <div>
            <h1>user list</h1>
            <ul>
                {state.isLoading === false && state.val.map(user => (
                    <li key={user.id}><Link to={`/user/${user.id}`}>{user.name}</Link></li>
                ))}
            </ul>
        </div>
    )


}

c.user-detail.js

import {useEffect} from "react";
import {useRequest} from "../hook/http";

export const UserDetail = ({match}) =>{
    const {state, doRequest} = useRequest();
    useEffect(()=> {
        doRequest('http://vicyor.com/user/1', {}, {}, 'POST')
    },[])

    return (<div>
        {state.val && `username:${state.val.name}`}
    </div>)
}

使用效果

二、列表页 && 详情抽屉

a.user-list-detail.js

export const UserList = () => {

    const {state, doRequest} = useRequest();


    useEffect(() => {
        doRequest('http://vicyor.com/crm/users', {page: 1, pageSize: 20}, {}, 'POST')
    }, []);

    return (
        <div>
            <h1>user list</h1>
            <ul>
                {state.isLoading === false && state.val.map(user => (
                    <li key={user.id}>{user.name}</li>
                    <UserDetail userId = user.id/>
                ))}
            </ul>
        </div>
    );


}



export const UserDetail = ({userId}) =>{
    // 抽屉是否打开
    const [isOpen, setIsOpen]  = useState(false);
    
    const toggleDrawer = () =>{
        setIsOpen(!isOpen);
    };

    
    // 加载详情数据
    const {state, doRequest} = useRequest();
    useEffect(()=> {
        doRequest(`http://vicyor.com/user/${userId}`, {}, {}, 'POST')
    },[])

    return (
    <div>
        <button onClick = {toggleDrawer}>{isOpen ? 关闭详情 : 查看详情}</button>
        {isOpen && 
            // 抽屉
            <div style={{ backgroundColor: 'grey', width: '200px', height: '200px' }}>        
                {state.val && `username:${state.val.name}`}
            </div>}
    </div>);
}



b.app.js


function App() {
    return (
      <UserList/>
    );
}

export default App;

三、列表页借助useMemo优化

1.user-list.js

        使用useMemo hook替换useEffect, 给用户列表添加缓存,减少请求次数。

export const UserList = () => {

    const {state, doRequest} = useRequest();

    const [key,setKey] = useState('');
    
    // 使用useMemo,若key搜索过,则会返回之前的结果
    useMemo(()=>{
        doRequest(`http://vicyor.com/crm/key=${key}`, {}, {}, 'POST')
    },[key])
  

    return (
        <div>
            <h1>user list</h1>
            搜索: <input type = 'text' 
                   value = 'key' 
                   onChange = {event => setKey(event.target.value)})>
             <ul>
                {state.isLoading === false && state.val.map(user => (
                    <li key={user.id}>{user.name}</li>
                    <UserDetail userId = user.id/>
                ))}
            </ul>
        </div>
    );


}

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现点击商品跳转到详情页功能,你可以使用React Router库来管理路由。首先,你需要在你的应用程序中安装React Router,然后在你的代码中导入它。 然后,你可以创建一个商品列表组件,这个组件会显示所有的商品。在这个组件中,你可以使用React Router的Link组件创建每个商品的链接,这个链接会在被点击时跳转到对应的商品详情页。例如: ```jsx import { Link } from "react-router-dom"; function ProductList({ products }) { return ( <div> {products.map(product => ( <div key={product.id}> <h2>{product.name}</h2> <p>{product.description}</p> <Link to={`/products/${product.id}`}>View details</Link> </div> ))} </div> ); } ``` 这个Link组件会渲染成一个a标签,当它被点击时,React Router会在应用程序的URL中添加商品ID,例如"/products/123",并加载相应的商品详情组件。 接下来,你需要在你的应用程序中定义路由规则,以告诉React Router应该在哪些URL上加载哪些组件。这可以在应用程序的根组件中完成,例如: ```jsx import { BrowserRouter as Router, Switch, Route } from "react-router-dom"; function App() { return ( <Router> <Switch> <Route path="/products/:productId"> <ProductDetails /> </Route> <Route path="/"> <ProductList products={...} /> </Route> </Switch> </Router> ); } ``` 这个例子中,我们定义了两个路由规则,一个是匹配"/products/:productId"的,另一个是匹配根路径"/"的。当URL匹配到这些规则时,React Router会加载相应的组件。 希望这可以回答你的问题!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值