优化上次的组件化小demohtml
上次的组件化demo只是为了简单的实现前端组件化的思想,此次咱们稍微优化一下抽离公共类前端
html
app
<div id="wrapper"></div>
复制代码
js
组件化
/* DOM字符串转DOM节点 */
const createStringToDom = str => {
const ele = document.createElement('div');
ele.innerHTML = str;
return ele;
}
/* Mount */
const mount = (component, wrapper) => {
wrapper.appendChild(component._renderDom());
component.changeState = (oldEl, newEl) => {
wrapper.insertBefore(newEl, oldEl);
wrapper.removeChild(oldEl);
}
}
/* Components */
class Components {
constructor (props = {}) {
this.props = props;
}
setState (context) {
const oldEl = this.el;
Object.assign(this.state, context)
this._renderDom();
if (this.changeState) {
this.changeState(oldEl, this.el)
}
}
_renderDom () {
this.el = createStringToDom(this.render());
this.el.addEventListener('click', this.clickEvent.bind(this), false);
return this.el;
}
}
/* ZanButton */
class ZanButton extends Components {
constructor (props) {
super(props);
this.state = {
isLike: false
}
}
clickEvent () {
this.setState({
isLike: !this.state.isLike
})
}
render () {
return (
` <button style="background-color: ${ this.props.bgColor }"> ${ this.state.isLike ? '取消' : '点赞' } </button> `
)
}
}
const wrapper = document.getElementById('wrapper');
mount(new ZanButton(), wrapper);
mount(new ZanButton({
bgColor: 'red'
}), wrapper);
复制代码
经过抽离公共类继续拆分代码,使得组件复用更简单容易,DOM操做也是自动完成的无需咱们的介入,不过这里还有一个问题就是不断的删除,插入DOM节点会引发页面的重排,加大开销,这个问题经过 Virtual DOM 能够解决。优化