areslabs / alita

一套把React Native代码转换成微信小程序代码的转换引擎工具。我们不造轮子,不发明新框架,只是提供工具把RN扩展到微信小程序端。
https://areslabs.github.io/alita
MIT License
1.96k stars 130 forks source link

支持onLayout事件 #62

Closed canfoo closed 4 years ago

canfoo commented 4 years ago

方案: 编译时:将元素做一个标识,并在生成wxml通过此标识生成id

运行时:通过createElement收集当前所有onLayout事件,并在setState回调中检测是否需要触发onLayout事件

ykforerlang commented 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一下。