如何基于lucian项目模板,打造一个基本列表展示 #99

简介: 如何基于lucian项目模板,打造一个基本列表展示 #99

基于lucian这套项目模板,引导大家如何创建列表展示,搜索,自动处理 load 状态等。全部代码在仓库下。

最终效果:

网站效果预览:https://downfuture.com


开始之前


  1. 确保 node 版本是 8.4 或以上
  2. 用 cnpm 或 yarn 能节约你安装依赖的时间

第 1 步。安装 lucian 并创建项目


$ git clone https://github.com/Cherry-Team/lucian.git
$ cd lucian
$ cnpm i
$ npm start

浏览器会自动开启,并打开 http://localhost:8080


第 2 步。生成订单/列表路由


我们要新增路由,新建页面文件和在routeConfig引入该文件即可。

新建 ,内容如下:src/pages/orderList/index.js

import React, { Component } from 'react';
class Index extends Component {
    constructor(props) {
        super(props);
    }
    render() {
        return (
            <section>
                123
            </section>
        );
    }
}
export default Index;

然后在 文件下,引入该组件src/routeConfig

// 路由配置文件
import React, { lazy } from 'react';
import PrivateRoute from './components/PrivateRoute/index';
const OrderList = lazy(() => import(/* webpackChunkName: "OrderList"*/'./pages/orderList/index'));
const routes = [
    {
        // 订单列表页
        path: '/order/list',
        component: orderList
    }
];
const RouteWithSubRoutes = route => {
    return <PrivateRoute exact path={route.path} component={route.component} />;
};
const routeConfig = routes.map((route, i) => <RouteWithSubRoutes key={i} {...route} />);
export default routeConfig;

然后访问 http://localhost:8080/#/order/list,你会看到 123 的输出。


第 3 步。构造冗余、服务


新增 文件, ,内容如下:Actionsrc/mobx/actions/orderList.js

import * as api from '../servers/table';
// 获取表格数据
export const GET_TABLE = 'getTable';
export function getTable(params) {
    return {
        type: GET_TABLE,
        payload: api.getTable(params)
    };
}

新建 文件,:servicesrc/servers/table.js

import request from '../request';
// 获取表格数据
export function getTable(params = {}) {
    return request({
        url: 'getTable',
        method: 'POST',
        data: params
    });
}

新建 文件,,内容如下:reducersrc/reducers/orderList.js

import { fromJS } from 'immutable';
import { createReducer } from 'redux-immutablejs';
import {
    GET_TABLE
} from './../actions/orderList';
const initialState = fromJS({
    datas: {}
});
export default createReducer(initialState, {
    [GET_TABLE]: (state, { payload }) => {
        return state.set('datas', payload);
    }
});


Step 4. 页面组件引入Redux


在文件中,引入:src/pages/orderList/index.js

import React, { Component } from 'react';
import { connect } from 'react-redux';
import { withRouter } from 'react-router';
import * as action from '../../actions/orderList';
import { isEmpty } from '../../utils/index';
const mapStateToProps = state => {
    let { orderList, actionType, loadingType } = state;
    orderList = orderList.toJS();
    return {
        datas: orderList.datas,
        actionType,
        loadingType
    };
};
const mapDispatchToProps = (dispatch) => ({
    getTable: (...args) => dispatch(action.getTable(...args))
});
class Index extends Component {
    constructor(props) {
        super(props);
        this.state = { };
    }
    componentDidMount() {
        const { getTable } = this.props;
        getTable();
    }
    render() {
        const { loadingType, actionType, datas } = this.props;
        return (
            <section>
                123
            </section>
        );
    }
}
export default withRouter(connect(mapStateToProps, mapDispatchToProps)(Index));


Step 5. 添加界面,让列表展现出来


在文件中,引入筛选组件和列表组件:src/pages/orderList/index.js

筛选组件:

import React, { Component } from 'react';
import { Button, Select, Input, Form } from 'antd';
import Icon from '../../../components/Icon/index';
import './orderListSearch.less';
const colWidth = 150;
const { Option } = Select;
class orderListSearch extends Component {
    constructor(props) {
        super(props);
    }
    // 表单提交
    handleSubmit = values => {
        console.log('Success:', values);
    }
    render() {
        return (
            <section className="orderListSearch">
                <article>
                    <Form layout="inline"
                        name="orderListSearch"
                        onFinish={this.handleSubmit}
                    >
                        <Form.Item
                            label="订单编号"
                            name="orderId"
                        >
                            <Input placeholder="请输入订单编号" style={{ width: colWidth }} />
                        </Form.Item>
                        <Form.Item
                            label="客户名称"
                            name="customerName"
                        >
                            <Input placeholder="请输入客户名称" style={{ width: colWidth }} />
                        </Form.Item>
                        <Form.Item
                            label="下单方式"
                            name="placeOrder"
                        >
                            <Select
                                allowClear
                                style={{ width: colWidth }}
                                placeholder="请选择下单方式"
                            >
                                <Option value={1}>自主下单</Option>
                                <Option value={2}>代下单</Option>
                            </Select>
                        </Form.Item>
                        <Form.Item>
                            <article className="button">
                                <Button
                                    type="primary"
                                    htmlType="submit"
                                    icon={<Icon type="icon-shipin" />}
                                >
                                    提交
                                </Button>
                            </article>
                        </Form.Item>
                    </Form>
                </article>
            </section>
        );
    }
}
export default orderListSearch;

列表组件:

import React from 'react';
import {
    Table
} from 'antd';
// 表格列配置
const columns = [
    {
        title: '订单编号',
        dataIndex: 'orderId'
    },
    {
        title: '客户名称',
        dataIndex: 'customerName'
    },
    {
        title: '下单方式',
        dataIndex: 'placeOrder'
    },
    {
        title: '商品名称',
        dataIndex: 'goodsName'
    },
    {
        title: '价格',
        dataIndex: 'price'
    },
    {
        title: '下单时间',
        dataIndex: 'placeOrderTime'
    }
];
export default function orderTable({ listData, isLoading }) {
    return (
        <Table
            columns={columns}
            dataSource={listData || []}
            loading={isLoading}
            rowKey="orderId"
        />
    );
}

在下引入两个组件:src/pages/orderList/index.js

render() {
        const { loadingType, actionType, datas } = this.props;
        return (
            <section className="orderList">
                <OrderListSearch />
                <OrderTable listData={!isEmpty(datas) ? datas.listData : []} isLoading={loadingType.get('getTable')} />
            </section>
        );
    }

loadingType.get('getTable')用于判断请求是否完成,bool值,true ||假

目录
相关文章
|
机器学习/深度学习 人工智能 运维
什么是AIOps智能运维?
AIOps(智能运维)是一种利用人工智能和机器学习技术的软件,用于实时分析和处理业务和运营数据,以提供规范性和预测性答案。它通过收集和汇总大量数据,并使用智能筛选和识别重要事件和模式,帮助团队快速解决问题并避免事件发生。AIOps不依赖于人为指定规则,而是通过机器学习算法自动学习和提炼规则。它可以分析异常告警、故障分析、趋势预测等,并在某些情况下自动解决问题。AIOps的团队包括SRE团队、开发工程师团队和算法工程师团队,他们在AIOps相关工作中扮演不同的角色。
|
消息中间件 Dubbo Java
24年国内头条最牛的Java面试八股文1000集,不接受反驳!
年后这个时间段, 找工作面试不要停!! 很多朋友据我了解,技术水平和工作经验都很不错,但是面试频频败北。 大家复盘下来发现问题不严重,但是很普遍,10个人里面8个都存在,那就是面试前不做准备。 技巧和避坑先不论,面试题型就不熟悉,没有系统过下大厂真题和必问项目,真正对线上面试官时被打的措手不及。 想要从容应对,就要提前建立把握和自信,这不但来自自身的技术能力水平,更来源于对面试时将要发生的各种情况有预判,做到心中有数。 这里整理了一套跳槽涨薪大厂Java知识点解析及面试题解析,涵盖20个技术栈的大厂面试题及详解文档,各大厂技术重点、面试难点、进阶要点,帮助大家“临阵磨枪”,如有需要的
|
C# Windows
一款.NET开源、简洁易用的Windows桌面小说阅读应用
一款.NET开源、简洁易用的Windows桌面小说阅读应用
372 5
|
JavaScript
Vue 编写(preventReClick)防暴点 +防抖(debounce)和节流(throttle)函数
Vue 编写(preventReClick)防暴点 +防抖(debounce)和节流(throttle)函数
713 0
|
Kubernetes 应用服务中间件 nginx
Nginx Ingress Controller
如果需要再部署一套完全独立的Nginx Ingress Controller,以下是推荐的详细步骤:
248 2
|
网络协议
av_interleaved_write_frame -32 broken pipe
av_interleaved_write_frame -32 broken pipe
647 0
av_interleaved_write_frame -32 broken pipe
|
网络协议 数据格式
Teredo 是一项 IPv6/IPv4 转换技术
Teredo 是一项 IPv6/IPv4 转换技术,能够实现在处于单个或者多个 IPv4 NAT 后的主机之间的 IPv6 自动隧道。来自 Teredo 主机的 IPv6 数据流能够通过 NAT,因为它是以 IPv4 UDP 数据格式发送的。
|
算法 数据安全/隐私保护
从零学习 CA 系列 (八) -- 数字信封
本文参考《PKI/CA 与数字证书技术大全》书籍,如有理解bug, 请大家指正。 对称密码优点是加解密运算非常快,适合处理大批量数据,但其密码的分发与管理比较复杂。
2208 0
|
安全 Java
Burp Suite应用分享之Web漏洞扫描
Burp Suite应用分享之Web漏洞扫描
|
消息中间件 存储 缓存
双十一期间Kafka以这种方式丢消息让我猝不及防
双十一期间Kafka以这种方式丢消息让我猝不及防
双十一期间Kafka以这种方式丢消息让我猝不及防