Closed canfoo closed 4 years ago
我大概看了一下,有点问题。 首先看下面的例子:
class A extends Component {
state = {
height: 100
}
render() {
<View style={{height: this.state.height}}>
<Button
title={"点击我,改变布局!"}
onPress={() => {
this.setState({
height: this.state.height + 100
})
}}
/>
</View>
}
}
class App extends Component {
render() {
return (
<View>
<View onLayout={() => {console.log('one'}}/>
<A/>
<View onLayout={() => {console.log('two'}}/>
</View>
)
}
}
A组件不断的被点击的过程中, two
是一直打印的。 我测试这个代码,不会打印two
另外通过 createElement 收集可能并不好,尤其是数组的时候。
还有一些性能上的考虑。
涉及到内部的更新机制,有点绕,我参考这个思路,实现了一个版本 https://github.com/areslabs/alita/tree/supportOnLayout 你review一下。
方案: 编译时:将元素做一个标识,并在生成wxml通过此标识生成id
运行时:通过createElement收集当前所有onLayout事件,并在setState回调中检测是否需要触发onLayout事件