如何基于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相关工作中扮演不同的角色。
|
Cloud Native 云计算 Docker
云原生之旅:从容器化到微服务
【8月更文挑战第27天】在这篇文章中,我们将一起踏上云原生的旅程,探索它如何改变现代软件开发。我们将从容器化的基础开始,逐步深入到微服务的架构设计,并了解它们如何协同工作以构建更灵活、可扩展的应用。这不仅是一段技术的演进史,更是一次对软件本质和开发哲学的深刻洞察。让我们开始吧!
|
存储 数据安全/隐私保护 文件存储
Xamarin.Android SharedPreferences的使用方法
  SharedPreferences的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data//shared_prefs目录下。   这里只讲有关SharedPreferences的基本增删改查操作,模拟一个登陆记住账号密码的功能。
1467 0
|
存储 安全 网络协议
网络安全与信息安全:保护我们的数字世界
【6月更文挑战第11天】在数字化时代,网络安全与信息安全的重要性日益凸显。本文将探讨网络安全漏洞、加密技术以及安全意识等方面的问题,并提供一些实用的解决方案和建议。通过了解这些知识,我们可以更好地保护自己的数字身份和隐私。
207 0
|
安全 Java
Burp Suite应用分享之Web漏洞扫描
Burp Suite应用分享之Web漏洞扫描
|
存储 区块链
DAPP二二复制合约系统开发|步骤逻辑|详情方案
智能合约是一种计算机协议,在协议制定和部署后,不需要外加人为干预,即可实现自我执行和自我验证
|
网络协议 关系型数据库 MySQL
【JavaWeb-03】Tomcat
【JavaWeb-03】Tomcat
|
Python
Python 刷Leetcode题库,顺带学英语单词(33)
Python 刷Leetcode题库,顺带学英语单词(33)
244 0
|
测试技术 Python
(Python)列表基础操作
(Python)列表基础操作