JEASYUI-REACT 项目应用。

目录

jeasyUI-REACT项目应用。

使用PYTHON+REACT+jeasyUI-REACT制作一个小项目。项目主要用于课程报名、课程打卡、课程相关的提醒。与公众号相关联,可以发送自定义消息。

写写jeasyUI-REACT的使用心得。jeasyUI-REACT,以下简写JUR 参考网址:https://www.jeasyui.com/documentation5/index.php

jur感觉还可以,写一些轻便的项目完全够用。也有比较坑的地方,下面一一说明下。

来一张最复杂的页面构成。[图一]

此图包含了JUR里绝大多数的控件。

1.Layout 构成了页面的整体部局。上 下 左 右

render() {
        return (
            <div>
                <Layout>
                    {/*上--顶部*/}
                    <LayoutPanel region="north" style={{height: 136}}>
                        <Header/>
                    </LayoutPanel>
                    {/*下--底部*/}
                    <LayoutPanel region="south" style={{height: 50}}>
                        <Weather/>
                    </LayoutPanel>
                    {/*左--菜单*/}
                    <LayoutPanel region="west" split className="menuLeft" title={<span style={{color:'#666'}}>隐藏</span>} iconCls="icon-tags_grey" collapsible  expander>
                        <Menus/>
                    </LayoutPanel>
                    {/*右*/}
                    <LayoutPanel region="center" style={{height: '850px', padding: '5px 0px 5px 5px'}}>
                        <div>
                            操作区域
                        </div>
                    </LayoutPanel>
                </Layout>
            </div>
        );
    }

 2.DataGrid 数据表格。这个有几个点 挺坑的 也许是我没做对。

a.常见的就是表格中再嵌套表格的方法。不要看官方给的例子。发现无论是JUR还是其他任何一种REACT的第三方插件库 给出类似的数据表格都一这样的问题,即:事例中给出的数据源全是定义好的数据,实际 使用中都是要使用AJAX技术从数据接口中取出在再行渲染。图1的嵌套表格研究了好几天才算把坑填平。

a.代码段。
<div style={{padding: '5px 5px 5px 5px'}}>
    <DataGrid 
        ref={ref => this.dataGrid = ref} 
        data={this.state.data} 
        defaultLoadMsg={'数据加载中,请稍后...'} 
        loading={this.state.loading} border="0" 
        renderDetail={this.renderDetail} 
        onRowExpand={(row) => {row.expander_row = true; this.renderGrid(row);}}             
        onRowCollapse={(row) => {row.expander_row = false; row.students = []}} 
        toolbar={() => (<div style={{padding: 4}}>
                        <LinkButton style={{marginRight: '10px'}} className='c2' iconCls="icon-book_open_mark" plain onClick={this.handDeleted.bind(this, 0)}>未删课程</LinkButton>
                        <LinkButton style={{marginRight: '10px'}} className='c2' iconCls="icon-book_open_mark" plain onClick={this.handDeleted.bind(this, 1)}>已删课程</LinkButton>
                        <LinkButton className='c2' iconCls="icon-book_open_mark" plain onClick={this.handDeleted.bind(this, -1)}>所有课程</LinkButton>
                        </div>
                            )}>
                                <GridColumn expander width="30px"></GridColumn>
                                <GridColumn field="id" title="序号" width="60px" align="center" render={({rowIndex}) => (
                                    this.operation_id(rowIndex)
                                )}/>

                                <GridColumn align="center" field="wechat_num" width="110px" title="课程编号"></GridColumn>
                                <GridColumn field="name" width="280px" title="课程名称"></GridColumn>
                                <GridColumn align="center" field="type" width="60px" title="课程类型"></GridColumn>
                                <GridColumn align="center" field="teacher" width="65px" title="教师"></GridColumn>
                                <GridColumn align="center" field="btime" width="80px" title="开课日期"></GridColumn>
                                <GridColumn align="center" field="etime" width="80px" title="结课日期"></GridColumn>
                                <GridColumn align="center" field="start" width="120px" title="课程状态" render={({row}) => (this.start_status(row))}/>
                                <GridColumn align="center" field="period" width="55px" title="课时"></GridColumn>
                                <GridColumn align="center" field="price" width="55px" title="价格"></GridColumn>

                                <GridColumn field="menu_list" title="操作" align="center" width="250px" render={({row}) => (this.operation(row))}
                                />
                                <GridColumn align="left" field="synopsis" title="简介"></GridColumn>
                            </DataGrid>
</div>
renderDetail:数据表格拓展--学员信息 点击第一层表格第一列加号的时候 展开的数据表格。这个方法的返回就是返回另一个 return DataGrid
onRowExpand:这个方法最重要。点击加号后要获取数据来源的方法,只能通过个方法去获取具体的子表格数据源。也许有人会问,子表格的数据为什么不在第一层表格获取数据源的时候一起获取下,这不是什么难事。我的回答是因为这么做了 数据不够准确,一旦有人再报名时 这时候数据就不对了。最起码最新的数据你是获取不到的。
    /*
    * 拓展内容 onRowExpand方法
    * */
    renderGrid(row) {
        let that = this;
        let params = new URLSearchParams();
        params.set('course_id', row.id);
        axios({
            method: 'POST',
            url: '/sys/api/course_applies',
            responseType: 'json',
            data: params,
        }).then(resp => {
            const result = resp.data;
            if (result.status === 0) {
                row.students = result.applies;
                let _applies = that.state.applies;
                if (_applies.find((s) => s.course_id === row.id) === undefined) {
                    let arr = {
                        'course_id': row.id,
                        'applies': result.applies
                    };
                    _applies.push(arr);
                    that.setState({
                        applies: _applies
                    });
                } else {
                    let arr = {
                        'course_id': row.id,
                        'applies': result.applies
                    };
                    _applies.splice(_applies.indexOf(_applies.find((s) => s.course_id === row.id)), 1, arr);
                    that.setState({
                        applies: _applies
                    });
                }
            } else {
                Message({
                    message: result.msg,
                    type: 'warning'
                });
            }
        }).catch(error => {
            console.log(error);
        });
    }

onRowCollapse: 关闭某一行的嵌套表格。

看到子表格中的多选checkbox了吗?这个地方我是没太理解出来到底为什么不能实现。你们看到的效果是我用最原始的方法实现的。如果按照官方给出的方法去做,永远也不能马上渲染出来。也可能是我技术不到家吧。这地方太折腾人了,我就用了个比较偷懒的方法。

checkbox all
    /*
    * 全部选择、取消全选
    * 这个问题完全没有按REACT的思想实现 我是按JQUERY的方法实现的。查找对应ID的checkbox,判断是否是选中状态 如果选中了 那么做出对应的样式的改变。注意这个不能自定义什么样式 ,因为总体框架下还在使用JUR的样式,只能按照已经给出的样式做出相应的调整。
    * */
    handleAllCheck(checked, column, r) {
        let data = r.students.slice();
        r.students.map(row => {
            let index = r.students.indexOf(row);
            data.splice(index, 1, Object.assign({}, row, {_selected: checked}));
        });
        r.students = data;
        let sapns = document.getElementById('render_' + r.id).getElementsByTagName('span');
        if (checked) {
            for (let i = 0; i < sapns.length; i++) {
                if (sapns[i].className === 'f-full') {
                    sapns[i].className = 'f-full checkbox-checked';
                    sapns[i].innerHTML = '<svg class="checkbox-inner" space="preserve" focusable="false" version="1.1" viewBox="0 0 24 24"><path d="M4.1,12.7 9,17.6 20.3,6.3" fill="none" stroke="white"></path></svg>';
                }
            }
        } else {
            for (let i = 0; i < sapns.length; i++) {
                if (sapns[i].className === 'f-full checkbox-checked') {
                    sapns[i].className = 'f-full';
                    sapns[i].innerHTML = '';
                }
            }
        }
    }

项目历时一个月 一个人完成。遇到最大的坑就是上边这两。其他还好说。就写这吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值