123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- /* @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
- }
|