RN开工

rn开工了  满脸懵逼的要开工了,初步估计要1月左右能玩起来,语法什么的还是不太清楚。

getDefaultProps

object getDefaultProps()

执行过一次后,被创建的类会有缓存,映射的值会存在this.props,前提是这个prop不是父组件指定的 
这个方法在对象被创建之前执行,因此不能在方法内调用this.props ,另外,注意任何getDefaultProps()返回的对象在实例中共享,不是复制

getInitialState

object getInitialState()

控件加载之前执行,返回值会被用于state的初始化值

componentWillMount

void componentWillMount()

执行一次,在初始化render之前执行,如果在这个方法内调用setStaterender()知道state发生变化,并且只执行一次

render

ReactElement render()

render的时候会调用render()会被调用 
调用render()方法时,首先检查this.propsthis.state返回一个子元素,子元素可以是DOM组件或者其他自定义复合控件的虚拟实现 
如果不想渲染可以返回null或者false,这种场景下,react渲染一个<noscript>标签,当返回null或者false时,ReactDOM.findDOMNode(this)返回null 
render()方法是很纯净的,这就意味着不要在这个方法里初始化组件的state,每次执行时返回相同的值,不会读写DOM或者与服务器交互,如果必须如服务器交互,在componentDidMount()方法中实现或者其他生命周期的方法中实现,保持render()方法纯净使得服务器更准确,组件更简单

componentDidMount

void componentDidMount()

在初始化render之后只执行一次,在这个方法内,可以访问任何组件,componentDidMount()方法中的子组件在父组件之前执行

从这个函数开始,就可以和 js 其他框架交互了,例如设置计时 setTimeout 或者 setInterval,或者发起网络请求

shouldComponentUpdate

boolean shouldComponentUpdate(
  object nextProps, object nextState
)
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

这个方法在初始化render时不会执行,当props或者state发生变化时执行,并且是在render之前,当新的props或者state不需要更新组件时,返回false

shouldComponentUpdate: function(nextProps, nextState) {
  return nextProps.id !== this.props.id;
}
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

shouldComponentUpdate方法返回false时,讲不会执行render()方法,componentWillUpdatecomponentDidUpdate方法也不会被调用

默认情况下,shouldComponentUpdate方法返回true防止state快速变化时的问题,但是如果·state不变,props只读,可以直接覆盖shouldComponentUpdate用于比较propsstate的变化,决定UI是否更新,当组件比较多时,使用这个方法能有效提高应用性能

componentWillUpdate

void componentWillUpdate(
  object nextProps, object nextState
)
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

propsstate发生变化时执行,并且在render方法之前执行,当然初始化render时不执行该方法,需要特别注意的是,在这个函数里面,你就不能使用this.setState来修改状态。这个函数调用之后,就会把nextPropsnextState分别设置到this.propsthis.state中。紧接着这个函数,就会调用render()来更新界面了

componentDidUpdate

void componentDidUpdate(
  object prevProps, object prevState
)
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

组件更新结束之后执行,在初始化render时不执行

componentWillReceiveProps

void componentWillReceiveProps(
  object nextProps
)
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

props发生变化时执行,初始化render时不执行,在这个回调函数里面,你可以根据属性的变化,通过调用this.setState()来更新你的组件状态,旧的属性还是可以通过this.props来获取,这里调用更新状态是安全的,并不会触发额外的render调用

componentWillReceiveProps: function(nextProps) {
  this.setState({
    likesIncreasing: nextProps.likeCount > this.props.likeCount
  });
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

componentWillUnmount

void componentWillUnmount()

当组件要被从界面上移除的时候,就会调用componentWillUnmount(),在这个函数中,可以做一些组件相关的清理工作,例如取消计时器、网络请求等

总结

React Native的生命周期就介绍完了,其中最上面的虚线框和右下角的虚线框的方法一定会执行,左下角的方法根据props state是否变化去执行,其中建议只有在componentWillMount,componentDidMount,componentWillReceiveProps方法中可以修改state

英文地址:https://facebook.github.io/react/docs/component-specs.html#lifecycle-methods

http://blog.youkuaiyun.com/ElinaVampire/article/details/51813677


详细理解以下代码,我稍后与你沟通 -- 删除已存在的视图 DROP VIEW IF EXISTS bj_database.view_work_order_list_filter; -- 创建或替换视图 CREATE OR REPLACE VIEW bj_database.view_work_order_list_filter AS WITH -- 1. 生成日期维度:从前天到未来第7天(共10天) date_dimension AS ( SELECT DATE_SUB(CURDATE(), INTERVAL 2 DAY) AS target_date, 1 AS day_order UNION ALL SELECT DATE_SUB(CURDATE(), INTERVAL 1 DAY), 2 UNION ALL SELECT CURDATE(), 3 UNION ALL SELECT DATE_ADD(CURDATE(), INTERVAL 1 DAY), 4 UNION ALL SELECT DATE_ADD(CURDATE(), INTERVAL 2 DAY), 5 UNION ALL SELECT DATE_ADD(CURDATE(), INTERVAL 3 DAY), 6 UNION ALL SELECT DATE_ADD(CURDATE(), INTERVAL 4 DAY), 7 UNION ALL SELECT DATE_ADD(CURDATE(), INTERVAL 5 DAY), 8 UNION ALL SELECT DATE_ADD(CURDATE(), INTERVAL 6 DAY), 9 UNION ALL SELECT DATE_ADD(CURDATE(), INTERVAL 7 DAY), 10 ), -- 2. 定义班次维度(白班:8:00-20:00,夜班:20:00-次日8:00) shift_dimension AS ( -- 白班:当天 08:00 - 20:00 SELECT target_date, '白班' AS shift_type, TIMESTAMP(target_date, '08:00:00') AS shift_start, TIMESTAMP(target_date, '20:00:00') AS shift_end FROM date_dimension UNION ALL -- 夜班:当天 20:00 - 次日 08:00 SELECT target_date, '夜班' AS shift_type, TIMESTAMP(target_date, '20:00:00') AS shift_start, TIMESTAMP(DATE_ADD(target_date, INTERVAL 1 DAY), '08:00:00') AS shift_end FROM date_dimension ), -- 3. 获取每个工单在"今天"的最新状态(含:已完工、已挂起) latest_daily AS ( SELECT w.*, ROW_NUMBER() OVER (PARTITION BY w.workOrderNo ORDER BY w.updateTime DESC) AS rn FROM bj_database.work_order_daily w WHERE DATE(w.updateTime) = CURDATE() AND w.workOrderStatus IN ('已提交', '已开工', '拟制中', '已完工', '已挂起') ), current_status AS ( SELECT * FROM latest_daily WHERE rn = 1 ), -- 4. 获取前两天各班次的实际产出和目标产出(按班次切分) actual_by_shift AS ( SELECT w.workOrderNo, s.target_date, s.shift_type, MAX(w.outputQty) AS actual_output, ROUND( COALESCE( (CAST(MAX(w.taskQty) AS DECIMAL(10,2)) - CAST(MAX(w.outputQty) AS DECIMAL(10,2))) * GREATEST( TIMESTAMPDIFF(SECOND, GREATEST(w.scheduleStartDate, s.shift_start), LEAST(w.scheduleEndDate, s.shift_end) ), 0 ) / NULLIF(TIMESTAMPDIFF(SECOND, w.scheduleStartDate, w.scheduleEndDate), 0), 0 ), 2 ) AS target_output FROM bj_database.work_order_daily w JOIN shift_dimension s ON DATE(w.updateTime) = s.target_date AND ( (s.shift_type = '白班' AND HOUR(w.updateTime) >= 8 AND HOUR(w.updateTime) < 20) OR (s.shift_type = '夜班' AND (HOUR(w.updateTime) >= 20 OR HOUR(w.updateTime) < 8 AND DATE(w.updateTime) = DATE(s.shift_end))) ) WHERE DATE(w.updateTime) BETWEEN DATE_SUB(CURDATE(), INTERVAL 2 DAY) AND CURDATE() AND w.workOrderStatus IN ('已提交', '已开工', '拟制中', '已完工', '已挂起') GROUP BY w.workOrderNo, s.target_date, s.shift_type ), -- 5. 计算工单静态参数(责任人、线体、剩余数量等) work_order_params AS ( SELECT c.workOrderNo, c.prodplanId AS `批次`, -- 映射为“批次” COALESCE(m.line_name, c.lineCode) AS `线体`, -- 映射为“线体” c.itemNo AS `单板代码`, -- 映射为“单板代码” c.itemName AS `单板名称`, -- 映射为“单板名称” CAST(c.taskQty AS DECIMAL(10,2)) AS `计划总数`, CAST(c.outputQty AS DECIMAL(10,2)) AS `当前产出`, (CAST(c.taskQty AS DECIMAL(10,2)) - CAST(c.outputQty AS DECIMAL(10,2))) AS `剩余数量`, MIN(c.scheduleStartDate) AS scheduleStartDate, MAX(c.scheduleEndDate) AS scheduleEndDate, GREATEST(TIMESTAMPDIFF(SECOND, MIN(c.scheduleStartDate), MAX(c.scheduleEndDate)), 1) AS total_duration_seconds, COALESCE( pc.计调员, CASE WHEN c.factoryName = '河源' AND c.craftSection IS NOT NULL AND LOCATE('背板', c.craftSection) > 0 THEN '徐捷如' WHEN c.factoryName = '河源' AND c.itemName REGEXP '^PPC|^PA|^PD|^PN|^ZXSDR BS8800 C100 PSUB0' THEN '何东' WHEN c.factoryName = '河源' AND c.externalType IN ('ES', 'MSR(R10)', 'CLS', 'IC', 'MSTP') THEN '钟慧珊' WHEN c.factoryName = '河源' AND c.externalType = '5G-WS' THEN '无线' WHEN c.factoryName = '河源' AND c.externalType IN ( '5G_CMxU', '5G_COLT', '5G_CONT', 'A10', 'CHS', 'CPE', 'DSL', 'EODN', 'J10', 'ONT', 'POL', 'PON_MxU', 'PON_OLT', 'PONG', 'POND', 'OTN', 'ITPS', 'MSAP', 'CLOUD', 'CT', 'ESI', 'IAD', 'iCDN', 'uSmartView', 'VCS', 'VCT' ) THEN '肖应仲' WHEN c.factoryName = '河源' AND c.externalType IN ('C-SPN', 'IPRAN-A', 'SPN', 'D-SPN', 'IPRAN', 'IPTN') THEN '徐捷如' WHEN c.factoryName = '河源' AND c.externalType IN ('CDCG', 'DC_P', 'DPS', 'POWER', 'PS_S', 'SSE', 'TSE', '3GPLAT', 'DC_S', 'SE') THEN '祁思佳' WHEN c.factoryName = '河源' AND c.externalType = 'RRS' THEN '何东' WHEN c.factoryName = '深圳' AND c.externalType IN ('ITPS', 'RSS') THEN '江启一' WHEN c.factoryName = '深圳' AND c.externalType IN ('OTN', 'WDM') THEN '杨港会' WHEN c.factoryName = '深圳' AND c.externalType = 'CP' THEN '周旭升' ELSE '未分配' END ) AS `责任人`, c.factoryName AS `工厂`, c.craftSection AS `主工序`, l.`线体` IS NOT NULL AS is_valid_line FROM current_status c LEFT JOIN bj_database.line_mapping m ON c.lineCode = m.line_id LEFT JOIN bj_database.part_category pc ON c.factoryName = pc.工厂 AND LEFT(c.itemNo, 12) = LEFT(pc.单板代码, 12) LEFT JOIN bj_database.lineteamleader l ON COALESCE(m.line_name, c.lineCode) = l.`线体` WHERE c.scheduleStartDate IS NOT NULL AND c.scheduleEndDate IS NOT NULL GROUP BY c.workOrderNo, c.prodplanId, COALESCE(m.line_name, c.lineCode), c.itemNo, c.itemName, c.taskQty, c.outputQty, c.factoryName, c.craftSection, l.`线体`, pc.计调员, c.externalType, c.scheduleStartDate -- 已添加到 GROUP BY ), -- 6. 生成每个工单在每个班次的计划产出(按工时比例分配) planned_by_shift AS ( SELECT wp.workOrderNo, s.target_date, s.shift_type, ROUND( wp.`剩余数量` * GREATEST( TIMESTAMPDIFF(SECOND, GREATEST(wp.scheduleStartDate, s.shift_start), LEAST(wp.scheduleEndDate, s.shift_end) ), 0 ) / wp.total_duration_seconds, 2 ) AS planned_output FROM work_order_params wp JOIN shift_dimension s ON s.target_date BETWEEN DATE(wp.scheduleStartDate) AND DATE(wp.scheduleEndDate) WHERE wp.is_valid_line AND s.target_date <= DATE_ADD(CURDATE(), INTERVAL 7 DAY) ), -- 7. 合并实际产出(历史)和计划产出(未来) combined_by_shift AS ( -- 历史实际产出(前2天) SELECT workOrderNo, target_date, shift_type, actual_output, target_output, 0 AS planned_output, 'actual' AS data_type FROM actual_by_shift WHERE target_date >= DATE_SUB(CURDATE(), INTERVAL 2 DAY) UNION ALL -- 未来计划产出 SELECT workOrderNo, target_date, shift_type, 0 AS actual_output, 0 AS target_output, planned_output, 'planned' AS data_type FROM planned_by_shift ), -- 8. 最终输出:将班次数据横向展开为列(行转列) final_output AS ( SELECT wp.`批次`, wp.`线体`, wp.`单板代码`, wp.`单板名称`, wp.`计划总数`, wp.`当前产出`, wp.`责任人`, wp.`工厂`, wp.`主工序`, -- 前天 白班 COALESCE(MAX(CASE WHEN cs.target_date = DATE_SUB(CURDATE(), INTERVAL 2 DAY) AND cs.shift_type = '白班' THEN cs.actual_output END), 0) AS `前天白班实际产出`, COALESCE(MAX(CASE WHEN cs.target_date = DATE_SUB(CURDATE(), INTERVAL 2 DAY) AND cs.shift_type = '白班' THEN cs.target_output END), 0) AS `前天白班目标产出`, COALESCE(MAX(CASE WHEN cs.target_date = DATE_SUB(CURDATE(), INTERVAL 2 DAY) AND cs.shift_type = '白班' THEN cs.planned_output END), 0) AS `前天白班计划产出`, -- 前天 夜班 COALESCE(MAX(CASE WHEN cs.target_date = DATE_SUB(CURDATE(), INTERVAL 2 DAY) AND cs.shift_type = '夜班' THEN cs.actual_output END), 0) AS `前天夜班实际产出`, COALESCE(MAX(CASE WHEN cs.target_date = DATE_SUB(CURDATE(), INTERVAL 2 DAY) AND cs.shift_type = '夜班' THEN cs.target_output END), 0) AS `前天夜班目标产出`, COALESCE(MAX(CASE WHEN cs.target_date = DATE_SUB(CURDATE(), INTERVAL 2 DAY) AND cs.shift_type = '夜班' THEN cs.planned_output END), 0) AS `前天夜班计划产出`, -- 昨天 白班 COALESCE(MAX(CASE WHEN cs.target_date = DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND cs.shift_type = '白班' THEN cs.actual_output END), 0) AS `昨天白班实际产出`, COALESCE(MAX(CASE WHEN cs.target_date = DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND cs.shift_type = '白班' THEN cs.target_output END), 0) AS `昨天白班目标产出`, COALESCE(MAX(CASE WHEN cs.target_date = DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND cs.shift_type = '白班' THEN cs.planned_output END), 0) AS `昨天白班计划产出`, -- 昨天 夜班 COALESCE(MAX(CASE WHEN cs.target_date = DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND cs.shift_type = '夜班' THEN cs.actual_output END), 0) AS `昨天夜班实际产出`, COALESCE(MAX(CASE WHEN cs.target_date = DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND cs.shift_type = '夜班' THEN cs.target_output END), 0) AS `昨天夜班目标产出`, COALESCE(MAX(CASE WHEN cs.target_date = DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND cs.shift_type = '夜班' THEN cs.planned_output END), 0) AS `昨天夜班计划产出`, -- 今天 白班 COALESCE(MAX(CASE WHEN cs.target_date = CURDATE() AND cs.shift_type = '白班' THEN cs.actual_output END), 0) AS `今天白班实际产出`, COALESCE(MAX(CASE WHEN cs.target_date = CURDATE() AND cs.shift_type = '白班' THEN cs.target_output END), 0) AS `今天白班目标产出`, COALESCE(MAX(CASE WHEN cs.target_date = CURDATE() AND cs.shift_type = '白班' THEN cs.planned_output END), 0) AS `今天白班计划产出`, -- 今天 夜班 COALESCE(MAX(CASE WHEN cs.target_date = CURDATE() AND cs.shift_type = '夜班' THEN cs.actual_output END), 0) AS `今天夜班实际产出`, COALESCE(MAX(CASE WHEN cs.target_date = CURDATE() AND cs.shift_type = '夜班' THEN cs.target_output END), 0) AS `今天夜班目标产出`, COALESCE(MAX(CASE WHEN cs.target_date = CURDATE() AND cs.shift_type = '夜班' THEN cs.planned_output END), 0) AS `今天夜班计划产出` FROM work_order_params wp LEFT JOIN combined_by_shift cs ON wp.workOrderNo = cs.workOrderNo GROUP BY wp.`批次`, wp.`线体`, wp.`单板代码`, wp.`单板名称`, wp.`计划总数`, wp.`当前产出`, wp.`责任人`, wp.`工厂`, wp.`主工序` ) SELECT * FROM final_output;
最新发布
08-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值