omi v6.8.0

* New syntax, prop supports reading prop from data centers(Omi.$)
This commit is contained in:
dntzhang 2019-07-28 10:05:49 +08:00
parent 2bc0aeb8c4
commit 230a0a2b77
19 changed files with 2057 additions and 31 deletions

View File

@ -203,6 +203,9 @@ declare namespace Omi {
event?: (event: Event) => Event;
};
//props data center
var $: object
var elements: object
}

View File

@ -1,5 +1,5 @@
/**
* omi v6.7.1 http://omijs.org
* omi v6.8.0 http://omijs.org
* Omi === Preact + Scoped CSS + Store System + Native Support in 3kb javascript.
* By dntzhang https://github.com/dntzhang
* Github: https://github.com/Tencent/omi
@ -203,6 +203,14 @@
return str.replace(hyphenateRE, '-$1').toLowerCase();
}
function getValByPath(path, current) {
var arr = path.replace(/]/g, '').replace(/\[/g, '.').split('.');
arr.forEach(function (prop) {
current = current[prop];
});
return current;
}
// DOM properties that should NOT have "px" added when numeric
var IS_NON_DIMENSIONAL = /acit|ex(?:s|g|n|p|$)|rph|ows|mnc|ntw|ine[ch]|zoo|^ord/i;
@ -1455,7 +1463,11 @@
break;
case Array:
case Object:
ele.props[key] = JSON.parse(val.replace(/(['"])?([a-zA-Z0-9_-]+)(['"])?:([^\/])/g, '"$2":$4').replace(/'([\s\S]*?)'/g, '"$1"').replace(/,(\s*})/g, '$1'));
if (val[0] === ':') {
ele.props[key] = getValByPath(val.substr(1), Omi.$);
} else {
ele.props[key] = JSON.parse(val.replace(/(['"])?([a-zA-Z0-9_-]+)(['"])?:([^\/])/g, '"$2":$4').replace(/'([\s\S]*?)'/g, '"$1"').replace(/,(\s*})/g, '$1'));
}
break;
}
} else {
@ -1772,6 +1784,7 @@
return {};
}
var $ = {};
var Component = WeElement;
var defineElement = define;
var elements = options.mapping;
@ -1799,12 +1812,13 @@
html: html,
htm: htm,
o: o,
elements: elements
elements: elements,
$: $
};
options.root.Omi = omi;
options.root.omi = omi;
options.root.Omi.version = '6.7.1';
options.root.Omi.version = '6.8.0';
if (typeof module != 'undefined') module.exports = omi;else self.Omi = omi;
}());

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
/**
* omi v6.7.1 http://omijs.org
* omi v6.8.0 http://omijs.org
* Omi === Preact + Scoped CSS + Store System + Native Support in 3kb javascript.
* By dntzhang https://github.com/dntzhang
* Github: https://github.com/Tencent/omi
@ -200,6 +200,14 @@ function hyphenate(str) {
return str.replace(hyphenateRE, '-$1').toLowerCase();
}
function getValByPath(path, current) {
var arr = path.replace(/]/g, '').replace(/\[/g, '.').split('.');
arr.forEach(function (prop) {
current = current[prop];
});
return current;
}
// DOM properties that should NOT have "px" added when numeric
var IS_NON_DIMENSIONAL = /acit|ex(?:s|g|n|p|$)|rph|ows|mnc|ntw|ine[ch]|zoo|^ord/i;
@ -1452,7 +1460,11 @@ var WeElement = function (_HTMLElement) {
break;
case Array:
case Object:
ele.props[key] = JSON.parse(val.replace(/(['"])?([a-zA-Z0-9_-]+)(['"])?:([^\/])/g, '"$2":$4').replace(/'([\s\S]*?)'/g, '"$1"').replace(/,(\s*})/g, '$1'));
if (val[0] === ':') {
ele.props[key] = getValByPath(val.substr(1), Omi.$);
} else {
ele.props[key] = JSON.parse(val.replace(/(['"])?([a-zA-Z0-9_-]+)(['"])?:([^\/])/g, '"$2":$4').replace(/'([\s\S]*?)'/g, '"$1"').replace(/,(\s*})/g, '$1'));
}
break;
}
} else {
@ -1769,6 +1781,7 @@ function createRef() {
return {};
}
var $ = {};
var Component = WeElement;
var defineElement = define;
var elements = options.mapping;
@ -1796,13 +1809,14 @@ var omi = {
html: html,
htm: htm,
o: o,
elements: elements
elements: elements,
$: $
};
options.root.Omi = omi;
options.root.omi = omi;
options.root.Omi.version = '6.7.1';
options.root.Omi.version = '6.8.0';
export default omi;
export { tag, WeElement, Component, render, h, h as createElement, options, define, observe, cloneElement, getHost, rpx, tick, nextTick, ModelView, defineElement, classNames, extractClass, createRef, html, htm, o, elements };
export { tag, WeElement, Component, render, h, h as createElement, options, define, observe, cloneElement, getHost, rpx, tick, nextTick, ModelView, defineElement, classNames, extractClass, createRef, html, htm, o, elements, $ };
//# sourceMappingURL=omi.esm.js.map

File diff suppressed because one or more lines are too long

View File

@ -84,6 +84,13 @@
function hyphenate(str) {
return str.replace(hyphenateRE, '-$1').toLowerCase();
}
function getValByPath(path, current) {
var arr = path.replace(/]/g, '').replace(/\[/g, '.').split('.');
arr.forEach(function(prop) {
current = current[prop];
});
return current;
}
function isSameNodeType(node, vnode, hydrating) {
if ('string' == typeof vnode || 'number' == typeof vnode) return void 0 !== node.splitText;
if ('string' == typeof vnode.nodeName) return !node._componentConstructor && isNamedNode(node, vnode.nodeName); else if ('function' == typeof vnode.nodeName) return options.mapping[node.nodeName.toLowerCase()] === vnode.nodeName;
@ -984,7 +991,7 @@
case Array:
case Object:
ele.props[key] = JSON.parse(val.replace(/(['"])?([a-zA-Z0-9_-]+)(['"])?:([^\/])/g, '"$2":$4').replace(/'([\s\S]*?)'/g, '"$1"').replace(/,(\s*})/g, '$1'));
if (':' === val[0]) ele.props[key] = getValByPath(val.substr(1), Omi.$); else ele.props[key] = JSON.parse(val.replace(/(['"])?([a-zA-Z0-9_-]+)(['"])?:([^\/])/g, '"$2":$4').replace(/'([\s\S]*?)'/g, '"$1"').replace(/,(\s*})/g, '$1'));
} else if (ele.constructor.defaultProps && ele.constructor.defaultProps.hasOwnProperty(key)) ele.props[key] = ele.constructor.defaultProps[key]; else ele.props[key] = null;
});
}
@ -1052,6 +1059,7 @@
return u[r] || (u[r] = t(n));
};
var html = htm.bind(h);
var $ = {};
var Component = WeElement;
var defineElement = define;
var elements = options.mapping;
@ -1078,11 +1086,12 @@
html: html,
htm: htm,
o: o,
elements: elements
elements: elements,
$: $
};
options.root.Omi = omi;
options.root.omi = omi;
options.root.Omi.version = '6.7.1';
options.root.Omi.version = '6.8.0';
if ('undefined' != typeof module) module.exports = omi; else self.Omi = omi;
}();
//# sourceMappingURL=omi.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1863
packages/omi/examples/$/b.js Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,14 @@
<html>
<head></head>
<body>
<script src="b.js"></script>
<script>
Omi.$.user = { name: 'dntzhang', age: 18 }
</script>
<my-component user=":user" />
</body>
</html>

View File

@ -0,0 +1,13 @@
import { define, render, WeElement } from '../../src/omi'
define('my-component', class extends WeElement {
static propTypes = {
user: Object
}
render(props) {
return (
<div>name: {props.user.name}, age: {props.user.age}</div>
)
}
})

View File

@ -1,6 +1,6 @@
{
"name": "omi",
"version": "6.7.1",
"version": "6.8.0",
"description": "Front End Cross-Frameworks Framework.",
"main": "dist/omi.js",
"jsnext:main": "dist/omi.esm.js",

View File

@ -203,6 +203,9 @@ declare namespace Omi {
event?: (event: Event) => Event;
};
//props data center
var $: object
var elements: object
}

View File

@ -20,6 +20,7 @@ function createRef() {
return {}
}
const $ = {}
const Component = WeElement
const defineElement = define
const elements = options.mapping
@ -47,12 +48,13 @@ const omi = {
html,
htm,
o,
elements
elements,
$
}
options.root.Omi = omi
options.root.omi = omi
options.root.Omi.version = '6.7.1'
options.root.Omi.version = '6.8.0'
export default omi
@ -79,5 +81,6 @@ export {
html,
htm,
o,
elements
elements,
$
}

View File

@ -129,4 +129,12 @@ export function getTargetByPath(origin, path) {
const hyphenateRE = /\B([A-Z])/g
export function hyphenate(str) {
return str.replace(hyphenateRE, '-$1').toLowerCase()
}
}
export function getValByPath(path, current) {
const arr = path.replace(/]/g, '').replace(/\[/g, '.').split('.')
arr.forEach(prop => {
current = current[prop]
})
return current
}

View File

@ -1,4 +1,4 @@
import { cssToDom, nProps, isArray, getUse, hyphenate } from './util'
import { cssToDom, nProps, isArray, getUse, hyphenate, getValByPath } from './util'
import { diff } from './vdom/diff'
import options from './options'
import { proxyUpdate } from './observe'
@ -161,13 +161,13 @@ export default class WeElement extends HTMLElement {
attrsToProps(ignoreAttrs) {
const ele = this
if (ele.normalizedNodeName || ignoreAttrs) return
if (ele.normalizedNodeName || ignoreAttrs) return
ele.props['css'] = ele.getAttribute('css')
const attrs = this.constructor.propTypes
const attrs = this.constructor.propTypes
if(!attrs) return
Object.keys(attrs).forEach(key => {
const type = attrs[key]
const val = ele.getAttribute(hyphenate(key))
const val = ele.getAttribute(hyphenate(key))
if (val !== null) {
switch (type) {
case String:
@ -185,11 +185,15 @@ export default class WeElement extends HTMLElement {
break
case Array:
case Object:
ele.props[key] = JSON.parse(val
.replace(/(['"])?([a-zA-Z0-9_-]+)(['"])?:([^\/])/g, '"$2":$4')
.replace(/'([\s\S]*?)'/g, '"$1"')
.replace(/,(\s*})/g, '$1')
)
if (val[0] === ':') {
ele.props[key] = getValByPath(val.substr(1), Omi.$)
} else {
ele.props[key] = JSON.parse(val
.replace(/(['"])?([a-zA-Z0-9_-]+)(['"])?:([^\/])/g, '"$2":$4')
.replace(/'([\s\S]*?)'/g, '"$1"')
.replace(/,(\s*})/g, '$1')
)
}
break
}
} else {

View File

@ -0,0 +1,77 @@
import {
define,
render,
WeElement,
cloneElement,
createRef,
getHost
} from '../../src/omi'
import {
getValByPath
} from '../../src/util'
describe('$ props data center', () => {
let scratch
//const Empty = () => null
before(() => {
scratch = document.createElement('div')
; (document.body || document.documentElement).appendChild(scratch)
})
beforeEach(() => {
//let c = scratch.firstElementChild;
//if (c) render(<Empty />, scratch, { merge: c })
scratch.innerHTML = ''
})
after(() => {
scratch.parentNode.removeChild(scratch)
scratch = null
})
it('simple test', () => {
var Omi = { $: { user: { name: 'dnt', age: 18 } } }
expect(getValByPath('user', Omi.$)).to.deep.equal({ name: "dnt", age: 18 })
expect(getValByPath('user.age', Omi.$)).to.deep.equal(18)
})
it('array test', () => {
var Omi = { $: { user: { name: 'dnt', age: 18, list: [{ a: 1 }, { b: 2 }] } } }
expect(getValByPath('user.list[1].b', Omi.$)).to.deep.equal(2)
})
it('render test', () => {
define('my-component', class extends WeElement {
static propTypes = {
user: Object
}
render(props) {
return (
<div>name: {props.user.name}, age: {props.user.age}</div>
)
}
})
Omi.$.user = { name: 'dntzhang', age: 18 }
scratch.innerHTML = `
<my-component user=":user" />
`
expect(document.querySelector('my-component').shadowRoot.innerHTML).to.deep.equal('<div>name: dntzhang, age: 18</div>')
})
})