我正在尝试创建一个小应用程序,但有很多问题)我有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不是一个函数”
AsyncStorage可能不是您正在尝试的最佳解决方案。使用react-navigation
进行数据传输并不是最好的。我建议检查redux是否存储全局状态,并在需要时将其传递给页面。还有另一种方法是将函数传递给子组件的props,以便将任何数据从子组件提取到父组件。您可以查看this和this或下面的示例代码。
亲
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>
}
}