首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >极简HyperScript实现

极简HyperScript实现
EN

Code Review用户
提问于 2016-02-19 18:18:57
回答 1查看 267关注 0票数 3

我已经尝试推出我自己的HyperScript实现。我有兴趣听取任何改善这项建议的建议,或向我指出仍在维持的任何其他更佳的执行方法。我检查了HyperScript项目,但它似乎没有任何最近的更新,所以我尝试了如下:

代码语言:javascript
运行
复制
var DOM = {
    h: function(tagName, props, children) {
        var element = document.createElement(tagName);
        if (props) {
            for (var item in props) {
                element[item] = props[item];
            }
        }
        if (children && Array.isArray(children) && children.length > 0) {
            children.forEach(function(child) {
                element.appendChild(child);
            });
        }
        return element;
    },
    div: function(props, children) {
        return this.h('div', props, children);
    },
    label: function(props, children) {
        return this.h('label', props, children);
    },
    input: function(props, children) {
        return this.h('input', props, children);
    },
    button: function(props, children) {
        return this.h('button', props, children);
    },
    li: function(props, children) {
        return this.h('li', props, children);
    }
};

用法:

代码语言:javascript
运行
复制
DOM.button({ className: "destroy" });
EN

回答 1

Code Review用户

发布于 2016-02-19 23:42:44

这类库的有趣之处在于它们的实现很有趣。可悲的是,和他们一起工作并不是很有趣。从长远来看,您将乞求类似标记的语法。

但不管怎样,

代码语言:javascript
运行
复制
div: function(props, children) {
    return this.h('div', props, children);
},
label: function(props, children) {
    return this.h('label', props, children);
},
input: function(props, children) {
    return this.h('input', props, children);
},
button: function(props, children) {
    return this.h('button', props, children);
},
li: function(props, children) {
    return this.h('li', props, children);
}

这可以简化为元素名称的列表。您可以运行它,并为每个名称分配一个函数给DOM

代码语言:javascript
运行
复制
['div', 'li', ...].forEach(elementName => {
  DOM[elementName] = function(props, children){
    return this.h(elementName, props, children);
  };
});

至于您的h函数,您应该使用hasOwnProperty来保护for-in,以避免对原型元素进行迭代。或者,您可以使用Object.keysforEach。此外,当调试时,沉默错误是可怕的。如果用户传入的不是数组,最好立即通知他们。在下面的代码中,它只捕获假值。其他任何东西,比如非数组或其他东西,都会抛出,因为forEach需要一个数组。

代码语言:javascript
运行
复制
h: function(tagName, props, children) {
    var element = document.createElement(tagName);

    Object.keys(props || []).forEach( prop => {
      element[prop] = props[prop];
    });

    (children || []).forEach(child => {
      element.appendChild(child);
    });

    return element;
},
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/120559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档