react项目实战(1)-基础框架搭建

一、创建react项目

  • 脚手架创建
npx create-react-app my-app
  • 等待项目加载完成启动项目
cd my-app
npm start

启动成功后 自动跳转至浏览器 http://localhost:3000/
在这里插入图片描述
至此 react项目创建成功,接下来就是装修了

刚创建的项目结构
在这里插入图片描述

二、引入第三方UI框架

这里我们选择的是 Ant Design

  • 引入antd
npm install antd --save
  • 修改 src/App.js,引入 antd 的按钮组件
import React from 'react';
import { Button } from 'antd';
function App() {
  return (
    <div className="App">
    <Button type="primary">Button</Button>
  </div>
  );
}
export default App;

页面上出现按钮—表示antd入成功
在这里插入图片描述

三、引入路由

  • react本身没有提供路由,我们需要安装第三方插件react-router-dom
  • react路由v6版本地址:https://reactrouter.com/en/6.8.1/start/overview
  • v5版本地址:https://v5.reactrouter.com/
  • v6版本更偏向于函数式组件开发
  • v5版本兼容类组件和函数组件开发。

1、安装路由

yarn add react-router-dom@5.3.4
# or
npm i react-router-dom@5.3.4

2、配置一级路由

	1.创建页面 
  • src下新建pages文件夹
    在这里插入图片描述

  • 新建Login.jsx文件

import React, { Component } from 'react'

export default class Login extends Component {
  render() {
    return (
      <div>Login</div>
    )
  }
}
  • 新建Home.jsx文件
import React, { Component } from 'react'

export default class Home extends Component {
  render() {
    return (
      <div>Home</div>
    )
  }
}

2.配置路由
app.jsx

import React from "react";
import {
  BrowserRouter as Router,
  Switch,
  Route,
  Link
} from "react-router-dom";
import Login from "./pages/Login";
import Home from "./pages/Home";

export default function App() {
  return (
    <Router>
      <div>
        <nav>
          <ul>
            <li>
              <Link to="/">首页</Link>
            </li>
            <li>
              <Link to="/login">登录页面</Link>
            </li>
          </ul>
        </nav>
        <Switch>
          <Route path="/login">
            <Login />
          </Route>
          <Route path="/">
            <Home />
          </Route>
        </Switch>
      </div>
    </Router>
  );
}

此时可见页面
在这里插入图片描述

点击查看-关于路由的使用以及路由匹配信息

3、页面改造

1.从antd上引入布局组件
在这里插入图片描述
我们在这里使用最后一个
将其他的删除

import React from 'react';
import { Layout, Space } from 'antd';
const { Header, Footer, Sider, Content } = Layout;
const headerStyle = {
  textAlign: 'center',
  color: '#fff',
  height: 64,
  paddingInline: 50,
  lineHeight: '64px',
  backgroundColor: '#7dbcea',
};
const contentStyle = {
  textAlign: 'center',
  minHeight: 120,
  lineHeight: '120px',
  color: '#fff',
  backgroundColor: '#108ee9',
};
const siderStyle = {
  textAlign: 'center',
  lineHeight: '120px',
  color: '#fff',
  backgroundColor: '#3ba0e9',
};
const footerStyle = {
  textAlign: 'center',
  color: '#fff',
  backgroundColor: '#7dbcea',
};
const App = () => (
  <Space
    direction="vertical"
    style={{
      width: '100%',
    }}
    size={[0, 48]}
  >
  <Layout>
      <Sider style={siderStyle}>Sider</Sider>
      <Layout>
        <Header style={headerStyle}>Header</Header>
        <Content style={contentStyle}>Content</Content>
        <Footer style={footerStyle}>Footer</Footer>
      </Layout>
    </Layout>
  </Space>
);
export default App;

在这里插入图片描述

2.从antd官网上引入menu组件
在这里插入图片描述
在app.jsx中引入相关组件

  • 将header中的内容替换成menu组件
 <Header style={headerStyle}>
  <Menu style={menuStyle} onClick={onClick} selectedKeys={[current]} mode="horizontal" items={items} />
  </Header>
  • 将content中的内容替换为路由出口
  <Content style={contentStyle}>
      <Route exact path="/login">
        <Login />
      </Route>
      <Route exact path="/home">
        <Home />
      </Route>
  </Content>
  • 修改路由配置
    修改index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import {  HashRouter as Router} from "react-router-dom";//引入高阶组件 HashRouter 
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  //<React.StrictMode> 注释掉 否则组件会加载两次
  <Router> //使用router 包裹app 不然路由高阶组件不生效
    <App />
  </Router>
  // </React.StrictMode>
);
reportWebVitals();

app.jsx

import React, { useState } from 'react';
import { Layout, Space,Menu } from 'antd';
import { AppstoreOutlined, MailOutlined, SettingOutlined } from '@ant-design/icons';
import {useHistory,Route,} from "react-router-dom";
import Login from "./pages/Login";
import Home from "./pages/Home";
const { Header, Footer, Content } = Layout;
const headerStyle = {
  textAlign: 'center',
  color: '#fff',
  height: 64,
  lineHeight: '64px',
  padding: 0,
  position: 'fixed',
  top: 0,
  width: '100%',  
};
const menuStyle = {
  display:'flex',
  justifyContent:'center',
}
const contentStyle = {
  textAlign: 'center',
  minHeight: 900,
  color: 'black',
  marginTop: 64,
};
const footerStyle = {
  textAlign: 'center',
  color: 'black',
  borderTop: '1px solid #e8e8e8',
};
const items = [
  {
    label: '首页',
    key: 'home',
    icon: <MailOutlined />,
  },
  {
    label: '登录',
    key: 'login',
    icon: <AppstoreOutlined />,
  },
  {
    label: '菜单二',
    key: 'SubMenu',
    icon: <SettingOutlined />,
    children: [
      {
        type: 'group',
        label: 'Item 1',
        children: [
          {
            label: 'Option 1',
            key: 'setting:1',
          },
          {
            label: 'Option 2',
            key: 'setting:2',
          },
        ],
      },
      {
        type: 'group',
        label: 'Item 2',
        children: [
          {
            label: 'Option 3',
            key: 'setting:3',
          },
          {
            label: 'Option 4',
            key: 'setting:4',
          },
        ],
      },
    ],
  },
  {
    label: (
      <a href="https://ant.design" target="_blank" rel="noopener noreferrer">
        超链接
      </a>
    ),
    key: 'alipay',
  },
];
const App = () => {
  const history = useHistory();
  const [current, setCurrent] = useState('/');
  console.log(history);
  const onClick = (e) => {
    setCurrent(e.key);
    history.push('/'+e.key);
      };
 return <Space
    direction="vertical"
    style={{
      width: '100%',
    }}
    size={[0, 48]}
  >
    <Layout>
      <Header style={headerStyle}>
      <Menu style={menuStyle} onClick={onClick} selectedKeys={[current]} mode="horizontal" items={items} />
      </Header>
      <Content style={contentStyle}>
          <Route exact path="/login">
            <Login />
          </Route>
          <Route exact path="/home">
            <Home />
          </Route>
      </Content>
      <Footer style={footerStyle}>Footer</Footer>
    </Layout>
  </Space>
};
export default App;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[2\]中提到了一个使用React框架的实战案例,即构建一个电影搜索应用程序。这个项目可以帮助你在2020年成为前端大师。你可以使用React的hook来完成这个项目。具体的代码实现可以参考\[1\]中的示例代码,其中展示了如何创建一个ToDoList组件的基本框架。你可以在这个基础上进行修改和扩展,实现你的电影搜索应用程序。另外,\[3\]中提供了一个改进的项目结构和index.js文件的内容,你可以参考这个结构来组织你的项目。记住,实际构建项目是最有帮助的,所以勇往直前,让你的头脑变得敏锐,让它成为现实。 #### 引用[.reference_title] - *1* [React入门实战实例——ToDoList实现](https://blog.csdn.net/CherishTheYouth/article/details/107455652)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [9个不错的前端开源项目](https://blog.csdn.net/frontend_frank/article/details/105963656)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [项目实战:使用React框架搭建一个B/S架构能够记录"任务事务"完成与否的任务栏](https://blog.csdn.net/u012335228/article/details/99107990)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值