Skip to content

Commit

Permalink
feat(hippy-vue): perf attribute & style update performance
Browse files Browse the repository at this point in the history
  • Loading branch information
zoomchan-cxj committed Jul 22, 2022
1 parent b365a97 commit e7272ef
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 15 deletions.
3 changes: 3 additions & 0 deletions driver/js/packages/hippy-vue/src/renderer/element-node.js
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,9 @@ class ElementNode extends ViewNode {
setStyle(property, value, notToNative = false) {
if (value === undefined) {
delete this.style[property];
if (!notToNative) {
updateChild(this);
}
return;
}
// Preprocess the style
Expand Down
24 changes: 13 additions & 11 deletions driver/js/packages/hippy-vue/src/runtime/modules/attrs.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@ function updateAttrs(oldVNode, vNode) {
if (!oldVNode.data.attrs && !vNode.data.attrs) {
return;
}
let cur;
let old;
const updatePayload = {};
const { elm } = vNode;
const oldAttrs = oldVNode.data.attrs || {};
let attrs = vNode.data.attrs || {};
Expand All @@ -37,19 +36,22 @@ function updateAttrs(oldVNode, vNode) {
attrs = extend({}, attrs);
vNode.data.attrs = attrs;
}
Object.keys(attrs).forEach((key) => {
cur = attrs[key];
old = oldAttrs[key];
if (old !== cur) {
elm.setAttribute(key, cur);
Object.keys(oldAttrs).forEach((key) => {
const newPropValue = attrs[key];
if (newPropValue === null || newPropValue === undefined) {
updatePayload[key] = undefined;
}
});
Object.keys(oldAttrs).forEach((key) => {
// eslint-disable-next-line eqeqeq
if (attrs[key] == null) {
elm.setAttribute(key);
Object.keys(attrs).forEach((key) => {
const oldPropValue = oldAttrs[key];
const newPropValue = attrs[key];
if (oldPropValue !== newPropValue) {
updatePayload[key] = newPropValue;
}
});
Object.keys(updatePayload).forEach((key) => {
elm.setAttribute(key, updatePayload[key]);
});
}

export default {
Expand Down
9 changes: 5 additions & 4 deletions driver/js/packages/hippy-vue/src/runtime/modules/style.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
/* eslint-disable no-param-reassign */

import { extend, cached, camelize } from 'shared/util';
import { updateChild } from '../../renderer/native';

const normalize = cached(camelize);

Expand Down Expand Up @@ -59,19 +60,19 @@ function updateStyle(oldVNode, vNode) {
// Remove the removed styles at first
Object.keys(oldStyle).forEach((name) => {
if (style[name] === undefined) {
elm.setStyle(normalize(name), undefined);
elm.setStyle(normalize(name), undefined, true);
}
});
// Then set the new styles.
Object.keys(style).forEach((name) => {
cur = style[name];
elm.setStyle(normalize(name), cur);
elm.setStyle(normalize(name), cur, true);
});
updateChild(elm);
}


function createStyle(oldVNode, vNode) {
// console.log(`\t\t ===> createStyle(${oldVNode}, ${vNode})`)
if (!vNode.data.staticStyle) {
updateStyle(oldVNode, vNode);
return;
Expand All @@ -80,7 +81,7 @@ function createStyle(oldVNode, vNode) {
const { staticStyle } = vNode.data;
Object.keys(staticStyle).forEach((name) => {
if (staticStyle[name]) {
elm.setStyle(normalize(name), staticStyle[name]);
elm.setStyle(normalize(name), staticStyle[name], true);
}
});
updateStyle(oldVNode, vNode);
Expand Down

0 comments on commit e7272ef

Please sign in to comment.