React Native:在屏幕之间传递数据

问题描述 投票:2回答:1

我正在尝试创建一个小应用程序,但有很多问题)我有3个屏幕并使用react-navigation传递数据。该计划如下:

1) loading screen (fetch data and save it to AsyncStorage+handling data and save to obj1 for pickers)
(pass obj1)
2)main screen (get data,render pickers based on it, take selected values and pass them next)
(pass pickers selection+input)
3)some results(get data from Asyncstorage, some calculating and render results)

所以我有两个问题。

当我从3)导航回到2)我有一个错误,screen2需要数据,这是从screen1传递的。是的 - 我已经检查过这个数据是否传递到3然后按下后退按钮时为2,并且没有错误,但我确定这是不好的解决方案

在屏幕3上进行了一些关于拣选选择的计算,所以它没有问题。但其余的需要从AsyncStorage获取数据,然后根据Picker值转换它并渲染到ListView。尽管我要在componentWillMount上从AS获取它仍然需要花费很多时间,因此渲染数据是未定义的。当然我正在使用状态,但我认为这是一个糟糕的数据处理逻辑。

UPD所以我正在尝试将数据从子(屏幕)传递到父(index.ios.js),在那里它定义为第一个加载视图(我正在使用导航器的堆栈屏幕)

export default class App extends Component {
  constructor(props) {
      super(props);

      };
  }
  myCallback(dataFromChild) {
      console.log("yeah", dataFromChild);

  }

  render() {
    return (
      <LoadingScreen callbackFromParent={this.myCallback}/>
    );
  }
}

和LoadingScreen.js:

render() {
    return(
        <View style={{flex: 1, backgroundColor: '#dc143c', marginTop:20}}>
          <Image
              source={require('./WhiteLogo.png')}
              style={{flex:3, height: undefined, width: undefined, marginLeft:20, marginRight:20}}
              resizeMode="contain"
              qwer={this.props.callbackFromParent('listInfo').bind(this)}
            />
          <Spinner color='white' style={{flex:1}}/>
        </View>
   );
  }
}

我有一个错误“Unhandled JS Exception:this.props.callbackFromParent不是一个函数”

react-native react-navigation
1个回答
1
投票

AsyncStorage可能不是您正在尝试的最佳解决方案。使用react-navigation进行数据传输并不是最好的。我建议检查redux是否存储全局状态,并在需要时将其传递给页面。还有另一种方法是将函数传递给子组件的props,以便将任何数据从子组件提取到父组件。您可以查看thisthis或下面的示例代码。

class Parent extends Component {
    updateState (data) {
        this.setState(data);
    }
    render() {
        <View>
            <Child updateParentState={this.updateState.bind(this)} />
        </View>
    }
}

儿童

class Child extends Component {    
    render() {
      <View>
        <Button title="Change" onPress={() => {this.props.updateParentState({name: 'test})}} />
      </View>
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.