优化上次的组件化小demo
上次的组件化demo只是为了简单的实现前端组件化的思想,这次我们稍微优化一下抽离公共类
下面代码
html
<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 可以解决。