V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
winglight2016
V2EX  ›  程序员

熟悉 reactjs、dva 的哥们请进(外包项目)

  •  
  •   winglight2016 · 2017-12-26 09:31:08 +08:00 · 3198 次点击
    这是一个创建于 2531 天前的主题,其中的信息可能已经有所发展或是发生改变。

    情况是这样的,之前接到一个外包项目,前端做了三分之一左右的工作,然后项目中断了一段时间,现在那个前端没时间参与了,所以我想在 v2 找个有兴趣的前端工程师来合作,工期大约一个月,框架:react+webpack+dva,有意请加 weixin:chy447648 ——注明:reactjs 外包

    第 1 条附言  ·  2017-12-28 12:03:02 +08:00
    已经顺利找到前端工程师,谢谢🙏
    7 条回复    2017-12-27 01:37:25 +08:00
    wxsm
        1
    wxsm  
       2017-12-26 09:38:45 +08:00
    推倒重来的要不要,超烦半路接手
    rover5056
        2
    rover5056  
       2017-12-26 10:13:08 +08:00
    我也觉得。。
    半路接手真的神烦。。
    天天要揣摩他是怎么写的。。。
    winglight2016
        3
    winglight2016  
    OP
       2017-12-26 10:53:55 +08:00
    @wxsm
    @rover5056
    推倒重来不是个事儿,但是涉及时间、成本和风险,我觉得要慎重衡量,我贴一段代码,你们可以参考一下:

    ···
    import React from 'react'
    import {Modal, Form} from 'components'
    import {
    Input,
    Radio,
    InputNumber,
    DatePicker,
    Table,
    Popover,
    Cascader
    } from 'antd'
    import {Operation} from 'components'
    import moment from 'moment'
    const RadioButton = Radio.Button;
    const RadioGroup = Radio.Group;
    import {china_area_data} from 'utils'

    const modal = ({
    onOk,
    onAudit,
    payload = {}
    }) => {
    const {type, data} = payload
    const handleAudit = (key, event, record) => {
    let values = {
    uid: payload.uid,
    isAgree: key === 'agree',
    comment: '',
    aid: record.id
    }
    onAudit(values)
    }
    const columns = [
    {
    title: '审核名称',
    dataIndex: 'name'
    }, {
    title: '审核类型',
    width: 100,
    dataIndex: 'auditTypeEnum',
    render: text => ['实名审核', '快递协议审核', '提现审核', '分仓任务审核'][text]
    }, {
    title: '审核内容',
    width: 220,
    dataIndex: 'content',
    render: text =>< Popover content = {
    text
    } > <a href='#' style={{
    maxWidth: '200px',
    display: 'inline-block',
    whiteSpace: 'nowrap',
    overflow: 'hidden',
    textOverflow: 'ellipsis'
    }}>{text}</a>
    </Popover>
    }, {
    title: '更新时间',
    width: 140,
    dataIndex: 'lastUpdateTime'
    }, {
    title: '审核',
    width: 120,
    render: (text, record) =>< Operation options = {
    [
    {
    name: '同意',
    key: 'agree'
    }, {
    name: '拒绝',
    key: 'refuse',
    confirm: <Input placeholder='理由'/>
    }
    ]
    }
    onClick = {
    (key, event) => handleAudit(key, event, record)
    } />
    }
    ]
    const handleOk = (close, form) => {
    form.validateFields((err, values) => {
    if (!err) {
    values.birth = values.birth
    ? values.birth.format('YYYY-MM-DD')
    : undefined
    if (values.area.length == 3) {
    values.province = values.area[0],
    values.city = values.area[1],
    values.zone = values.area[2]
    delete values.area
    } else if (values.area.length == 2) {
    values.province = ''
    values.city = values.area[0]
    values.zone = values.area[1]
    delete values.area
    }
    for (let key in values) {
    if (values[key] === undefined || values[key] === null) {
    delete values[key]
    }
    }
    onOk(values, type)
    close()
    }
    })
    }
    return (<Modal id='modal' title={{
    audit: '审核',
    update: '更新'
    }[type]} onOk={handleOk} width={type == 'audit'
    ? 800
    : 416}>
    {
    type == 'update'
    ? (<Form labelCol={4}>
    <InputNumber name='id' initialValue={data.id} hidden="hidden"/>
    <Input name='name' initialValue={data.name} label='昵称' placeholder='昵称'/>
    <Input name='shopName' initialValue={data.shopName} label='店铺名称' placeholder='店铺名称'/>
    <Cascader name='area' initialValue={[data.province, data.city, data.zone]} options={china_area_data} placeholder="地址" label='地址' type='array'/>
    <Input name='address' initialValue={data.address} label='详细地址' placeholder='详细地址'/>
    <DatePicker name='birth' initialValue={data.birth && moment(data.birth)} type='object' label='生日' placeholder='生日' style={{
    width: '100%'
    }}/>
    <RadioGroup name='sexEnum' label='性别' initialValue={data.sexEnum} type='number' prefixCls='ant-radio-group'>
    <RadioButton value={1}>男</RadioButton>
    <RadioButton value={2}>女</RadioButton>
    </RadioGroup>
    </Form>)
    : ''
    }{
    type == 'audit'
    ? <Table columns={columns} dataSource={data} size="middle" pagination={false} scroll={{
    y: 440
    }} rowKey={record => record.id}/>
    : ''
    }
    </Modal>)
    }

    export default Modal.connect('modal')(modal)
    ···
    Manweill
        4
    Manweill  
       2017-12-26 11:04:23 +08:00
    能不能推倒重来,react+dva+antd 全家桶专业户
    kuxuan
        5
    kuxuan  
       2017-12-26 12:38:20 +08:00
    不喜欢用 dva 啊。
    wxsm
        6
    wxsm  
       2017-12-26 13:02:32 +08:00
    @winglight2016

    既然推倒重来不是事,那也没必要限制 react 技术栈吧。

    至于时间、风险跟成本:

    * 对陌生项目来说,重新开始一定比从 1/3 开始省时;
    * 你找外包永远都会有风险,主要看你找的人靠不靠谱而已;
    * 如果你要求一个开发者半路接手,你觉得你可以省下一些成本(因为别人只需完成剩下的 2/3 ),实际上开发者却要付出比 3/3 更多的劳动。
    vicvinc
        7
    vicvinc  
       2017-12-27 01:37:25 +08:00 via iPhone
    这应该是 ant design pro 那套东西,楼主可以联系下~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   953 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 22:54 · PVG 06:54 · LAX 14:54 · JFK 17:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.