/* @flow */ import { extend, cached, camelize } from 'shared/util' const normalize = cached(camelize) function createStyle (oldVnode: VNodeWithData, vnode: VNodeWithData) { if (!vnode.data.staticStyle) { updateStyle(oldVnode, vnode) return } const elm = vnode.elm const staticStyle = vnode.data.staticStyle const supportBatchUpdate = typeof elm.setStyles === 'function' const batchedStyles = {} for (const name in staticStyle) { if (staticStyle[name]) { supportBatchUpdate ? (batchedStyles[normalize(name)] = staticStyle[name]) : elm.setStyle(normalize(name), staticStyle[name]) } } if (supportBatchUpdate) { elm.setStyles(batchedStyles) } updateStyle(oldVnode, vnode) } function updateStyle (oldVnode: VNodeWithData, vnode: VNodeWithData) { if (!oldVnode.data.style && !vnode.data.style) { return } let cur, name const elm = vnode.elm const oldStyle: any = oldVnode.data.style || {} let style: any = vnode.data.style || {} const needClone = style.__ob__ // handle array syntax if (Array.isArray(style)) { style = vnode.data.style = toObject(style) } // clone the style for future updates, // in case the user mutates the style object in-place. if (needClone) { style = vnode.data.style = extend({}, style) } const supportBatchUpdate = typeof elm.setStyles === 'function' const batchedStyles = {} for (name in oldStyle) { if (!style[name]) { supportBatchUpdate ? (batchedStyles[normalize(name)] = '') : elm.setStyle(normalize(name), '') } } for (name in style) { cur = style[name] supportBatchUpdate ? (batchedStyles[normalize(name)] = cur) : elm.setStyle(normalize(name), cur) } if (supportBatchUpdate) { elm.setStyles(batchedStyles) } } function toObject (arr) { const res = {} for (let i = 0; i < arr.length; i++) { if (arr[i]) { extend(res, arr[i]) } } return res } export default { create: createStyle, update: updateStyle }