React + 项目(从基础到实战) -- 第六期

引入ant design ui

ui 组件库介绍

组件总览 - Ant Design (antgroup.com)
安装 - Material-UI (mui.com)
Tailwind UI - Official Tailwind CSS Components & Templates

引入antd

Ant Design of React - Ant Design

常用组件

// 引入antd 美化

import { Layout } from 'antd';



const { Header, Footer, Content } = Layout;


//引入组件

import {Button,Space,Divider} from 'antd';

//引入图标

import {

   PlusOutlined ,

   BarsOutlined,

   StarOutlined,

   DeleteOutlined,

  } from '@ant-design/icons';



//引入组件

import {

    Space,

    Typography

} from 'antd';

  

//引入图标

import { FormOutlined } from '@ant-design/icons';

import { HOME_PATH } from '../router';

const { Title } = Typography;

定义常用的路由常量

export const HOME_PATH='/'

  

export const LOGIN_PATH='/login'

  

export const REGISTER_PATH='/register'

  

export const MANAGE_PATH='/manage/list'

我的问卷: 列表卡片

问卷卡片 : 气泡弹出框使用

 <Popconfirm

                    title="复制问卷?"

                    okText="确定"

                    cancelText="取消"

                    onConfirm={duplicate}

                >

                  <Button type="text" icon={<CopyOutlined/>} size="small">

                        复制

                  </Button>

                </Popconfirm>

问卷卡片:confirm弹出框

const {confirm} = Modal;


 confirm({

         title: '确定删除吗?',

         icon: <ExclamationCircleOutlined />,

         content: '删除后问卷将无法恢复',

         okText: '确定',

         cancelText: '取消',

         onOk() {

           message.success("删除成功")

         },

         onCancel() {

           message.error("取消删除")

         },

     })

问卷卡片

import React , { FC} from "react";

import styles from "./QuestionCard.module.scss";

import { Link, useNavigate } from "react-router-dom";

//引入组件

import{Divider, Space, Tag,Button, message, Popconfirm ,Modal} from "antd";

//引入icon图标

import { EditOutlined, StarOutlined ,BarsOutlined, CopyOutlined, DeleteOutlined ,ExclamationCircleOutlined} from "@ant-design/icons";

  

const {confirm} = Modal;

  

//组件传值

//定义属性

  

type PropsType={

    id:string,

    title:string,

    isPublished:boolean,

    isStar:boolean,

    answerCount:number

    createAt:string,

}

  
  

const QuestionCard:FC<PropsType> = (props:PropsType) => {

  

    const {id,title,isPublished,isStar,answerCount,createAt}=props

  

    const nav=useNavigate();

  

    function duplicate(){

        message.success("执行复制")

    }

  
  

    function del()

    {

     confirm({

         title: '确定删除吗?',

         icon: <ExclamationCircleOutlined />,

         content: '删除后问卷将无法恢复',

         okText: '确定',

         cancelText: '取消',

         onOk() {

           message.success("删除成功")

         },

         onCancel() {

           message.error("取消删除")

         },

     })

    }

  
  

    return (

        <>

       <div className={styles.container} >

        <div className={styles.title}>

            <div className={styles.left}>

             <Link to={isPublished ? `/question/stat/${id}` : `/question/edit/${id}`}>

                <Space>

                    {isStar && <StarOutlined style={{color:'red'}}/>}

                    {title}

                </Space>

             </Link>

            </div>

            <div className={styles.right}>

               <Space>

  

               {isPublished ? <Tag color="processing">已发布</Tag>: <Tag>未发布</Tag>}

                <span> 答卷数量: {answerCount}  </span>

                <span>{createAt}</span>

               </Space>

            </div>

        </div>

  

        <Divider style={{margin:'10px 0'}}></Divider>

  

        <div className={styles.bottom}>

            <div className={styles.left}>

               <Space>

                <Button icon={<EditOutlined/>} type="text" size='small' onClick={()=>nav(`/question/edit/${id}`)} >编辑问卷</Button>

                <Button icon={<BarsOutlined/>} type="text" size='small' onClick={()=>nav(`/question/stat/${id}`)}>问卷统计</Button>

               </Space>

            </div>

            <div className={styles.right}>

               <Space>

               <Button type="text" icon={<StarOutlined/>} size="small">

                {isStar ? "取消标星" : "标星问卷"}

               </Button>

               <Popconfirm

                    title="复制问卷?"

                    okText="确定"

                    cancelText="取消"

                    onConfirm={duplicate}

                >

                  <Button type="text" icon={<CopyOutlined/>} size="small">

                        复制

                  </Button>

                </Popconfirm>

  
  

                <Button type="text" icon={<DeleteOutlined/>} size="small" onClick={del}>

                        删除

                    </Button>

               </Space>

  

            </div>

        </div>

       </div>

        </>

    )

}

  

export default QuestionCard;

星标问卷:列表卡片+分页

和上面差不多

回收站 : 表格


/表格列

const tableColums=[

    {

        title:"标题",

        dataIndex:"title",

        // key:"title"//循环的key,他会默认取dataIndex的值

    },

    {

        title:"是否发布",

        dataIndex:"isPublished",

        render:(isPublished:boolean)=>{

            return isPublished ?  <Tag color="processing">已发布</Tag> : <Tag>未发布</Tag>

        }

    },

    {

        title:"答卷",

        dataIndex:"answerCount"

    },

    {

        title:"创建时间",

        dataIndex:"createAt"

    }

]

  
  

//问卷列表数据模拟

const rawQuestionList=[

    {

        //_id:"1"  mondob数据库

        id:'1',

        title:"问卷1",

        isPublished:false,

        isStar:true,

        answerCount:100,

        createAt:"4月5日 12:23"

    },

    {

        id:'2',

        title:"问卷2",

        isPublished:true,

        isStar:false,

        answerCount:100,

        createAt:"4月5日 12:23"

    },

  

    {

        id:'3',

        title:"问卷3",

        isPublished:true,

        isStar:true,

        answerCount:100,

        createAt:"4月5日 12:23"

    },

    {

        id:'4',

        title:"问卷4",

        isPublished:false,

        isStar:false,

        answerCount:100,

        createAt:"4月5日 12:23"

    }

]



<Table

                dataSource={questionList}

                columns={tableColums}

                pagination={false}

                rowKey={(record)=>record.id}

                />

添加恢复删除功能

 //将jsx片段提取成为变量

   //表格项提取出来

   const TableElem = <>

   <div style={{marginBottom:"16px"}}>

       <Space>

           <Button type="primary" disabled={selectedIds.length==0}>恢复</Button>

           <Button danger disabled={selectedIds.length==0} onClick={del}>彻底删除</Button>

       </Space>

   </div>

   <Table

               dataSource={questionList}

               columns={tableColums}

               pagination={false}

               rowKey={(record)=>record.id}

               rowSelection={{

                     type:"checkbox",

                     onChange:(selectedRowKeys)=>{

                    setSelectedIds(selectedRowKeys as string[])

                   }

                 }}

               />

      </>
  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 为了搭建一个React项目,首先要确保你的开发环境已经配置好了。你需要安装Node.js和npm(Node包管理器)。 2. 使用命令行工具进入你想要保存项目的文件夹,并执行以下命令来创建一个新的React应用: ```shell npx create-react-app my-app ``` 这将使用create-react-app脚手架工具创建一个新的React应用,并在my-app文件夹中初始化项目结构。 3. 进入my-app文件夹,并启动开发服务器: ```shell cd my-app npm start ``` 这将启动一个本地开发服务器,并在浏览器中打开http://localhost:3000以查看你的React应用。 4. 现在你可以开始编写你的React组件了。你可以创建函数组件或类组件来定义你的UI。函数组件是一个纯函数,接收props对象并返回一个React元素;而类组件需要继承React.Component,并实现一个render函数来返回React元素。 5. 如果你需要在组件之间进行通信,可以使用Redux这样的状态管理库。Redux可以帮助你管理全局的状态,并使不同组件之间共享数据变得更加容易。你可以使用npm来安装Redux和相关的库: ```shell npm install redux react-redux ``` 然后,你可以在你的应用中创建Redux的store,并通过Provider组件将它提供给整个应用。你可以使用connect函数来连接你的组件,使其能够访问Redux中的状态。 6. 最后,你可以使用第三方UI库来加快你的开发速度。Ant Design是一个流行的React UI框架,它提供了丰富的组件和样式,可以帮助你快速构建漂亮的用户界面。你可以使用npm来安装Ant Design: ```shell npm install antd ``` 然后,你可以在你的组件中引入Ant Design的组件,并使用它们来构建你的UI。Ant Design的文档提供了详细的使用说明和示例代码,可以帮助你更好地了解和使用该框架。 以上是从0到1搭建一个React项目的一般步骤。你可以根据实际需求和项目要求进行相应的调整和扩展。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [REACT实战项目从0到1搭建(仅供参考)](https://blog.csdn.net/qq_31851435/article/details/121740400)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [react-从0到1新建react项目](https://blog.csdn.net/weixin_40220492/article/details/127145343)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值