Forum » Programiranje » React native props
React native props
![](https://static.slo-tech.com/stili/avatar_gray.gif)
mihy11 ::
Pozdravljeni!
Imam en velik problem in ne vem kaj bi lahko bilo narobe. Vse sem že zdebagiral in ne vem zakaj je tako.
Opis:
Imam dva screena, v prvem (A) imam react native calendar v katerem preko apija dobivam določene podatke. V drugem screenu (B) pa te podatke prikazujem za določen dan itd...Preko props-ov iz screena A v B (react-navigation) prenašam polje z določenimi podatki in jih prikazujem v flatlistu.
screen B: render metoda
Problem nastane pri komponenti TicketDiaryHour
Primer napake:
Iz A v B prenesem podatke, jih shranim v metodi componentDidMount() v state (
Ko zapustim screen B in ponovno vstopim, podatki v flatlistu ostanejo isti kot prej, čeprav bi morali biti drugačni...S propsi namreč prenašam še nekaj drugih stvari recimo besedilo, ki pa ostane prejšnjo tudi, če karkoli spremenim v Textinputu in grem nazaj.
Skratka problem je, da se tudi propsi spreminjajo, čeprav podatke shranjujem v state od screena B, ter jih ravno tako prikazujem.
Koda:
Screen B:
Flatlist v screenu B:
Takole recimo shranim določene podatke v flatlistu:
Skratka....
Ne vem zakaj se propsi spreminjajo, tudi če racimo spremenim določen item v flatlistu se ravnotako updatajo propsi. To sem opazil v metodi
Metoda v screenu B v eni izmed komponent v tem screenu:
Čudno stanje:
Popolnoma isti propsi, ko spremenim item v flatlistu:
Imam en velik problem in ne vem kaj bi lahko bilo narobe. Vse sem že zdebagiral in ne vem zakaj je tako.
Opis:
Imam dva screena, v prvem (A) imam react native calendar v katerem preko apija dobivam določene podatke. V drugem screenu (B) pa te podatke prikazujem za določen dan itd...Preko props-ov iz screena A v B (react-navigation) prenašam polje z določenimi podatki in jih prikazujem v flatlistu.
screen B: render metoda
render() { return ( <View style={{ flex: 1 }}> <CustomHeader {...this.props} /> <TicketDiaryHour {...this.props} /> ....); }
Problem nastane pri komponenti TicketDiaryHour
Primer napake:
Iz A v B prenesem podatke, jih shranim v metodi componentDidMount() v state (
this.setState(...);) od screena B v eni izmed komponent, ter jih prikažem v flatlistu. Naslednji korak je, da nekaj teh podatkov spremenil v flatlist in jih zopet shranim v state od screena B.
Ko zapustim screen B in ponovno vstopim, podatki v flatlistu ostanejo isti kot prej, čeprav bi morali biti drugačni...S propsi namreč prenašam še nekaj drugih stvari recimo besedilo, ki pa ostane prejšnjo tudi, če karkoli spremenim v Textinputu in grem nazaj.
Skratka problem je, da se tudi propsi spreminjajo, čeprav podatke shranjujem v state od screena B, ter jih ravno tako prikazujem.
Koda:
Screen B:
componentDidMount() { //console.log('Izvedem se vedno'); console.log('List of students Diary hours: ' + JSON.stringify(this.props.listOfStudents)); this.setState({ data: this.props.navigation.state.params.props.listOfStudents, textOpombe: this.props.navigation.state.params.props.notes, textVsebinaUre: this.props.navigation.state.params.props.lesson, finished: this.props.navigation.state.params.props.finished, absent: parseInt(this.props.navigation.state.params.props.apsent.substring(0,1)), }); if(this.props.navigation.state.params.props.listOfStudents.length >= 2) { this.setState({ height: 130 }); } }
Flatlist v screenu B:
<FlatList ref={(list) => this.myList = list} style={[styles.flatList,{height: this.state.height}]} data={this.state.data} scrollEnabled = {this.state.scrollingChild} contentContainerStyle={{ padding: 15 }} renderItem={({ item }) => ( <View style={styles.listItemStyle}> <View style={{flexDirection: 'row', marginBottom: 7, }}> { item.checked && <TouchableOpacity onPress={this.changeCheckedToFalse.bind(this,item)}> <View style={styles.checked} /> </TouchableOpacity> || <TouchableOpacity onPress={this.changeCheckedToTrue.bind(this,item)}> <View style={styles.unchecked} /> </TouchableOpacity> } <Text style={{color: '#000', opacity: 0.6}}>{item.key}</Text> { item.checked && <View style={{position: 'absolute', right: 0 }}> <View style={{flexDirection: 'row'}} > { item.o && <TouchableOpacity style={[styles.touchable1Ch,styles.iconStyle1]} onPress={this.changeSelectionO.bind(this,item)}> <Text style={{color: '#fff', fontSize: 18, alignSelf: 'center' }}>O</Text> </TouchableOpacity> || <TouchableOpacity style={[styles.touchable1,styles.iconStyle1]} onPress={this.changeSelectionO.bind(this,item)}> <Text style={{color: '#fff', fontSize: 15, alignSelf: 'center' }}>O</Text> </TouchableOpacity> } { item.n && <TouchableOpacity style={[styles.touchable2Ch,styles.iconStyle1]} onPress={this.changeSelectionN.bind(this,item)}> <Text style={{color: '#fff', fontSize: 18, alignSelf: 'center' }}>N</Text> </TouchableOpacity> || <TouchableOpacity style={[styles.touchable2,styles.iconStyle1]} onPress={this.changeSelectionN.bind(this,item)}> <Text style={{color: '#fff', fontSize: 15, alignSelf: 'center' }}>N</Text> </TouchableOpacity> } </View> </View> } </View> { this.props.navigation.state.params.props.listOfStudents !== undefined && this.props.navigation.state.params.props.listOfStudents.length >= 2 ? <View style={styles.line} /> : <Text></Text> } </View> )} keyExtractor={item => item.id} />
Takole recimo shranim določene podatke v flatlistu:
changeSelectionO(item) { var data2 = this.state.data; var itemIndex = data2.map(function (x) { return x.key; }).indexOf(item.key); if(data2[itemIndex].o) { data2[itemIndex].o = false; } else { data2[itemIndex].o = true; if(data2[itemIndex].n) { data2[itemIndex].n = false; } } this.setState({ data: data2 }); //this.props.listOfStudents }
Skratka....
Ne vem zakaj se propsi spreminjajo, tudi če racimo spremenim določen item v flatlistu se ravnotako updatajo propsi. To sem opazil v metodi
componentDidUpdate()
Metoda v screenu B v eni izmed komponent v tem screenu:
componentDidUpdate(prevProps) { console.log('Prev props: ' + JSON.stringify(prevProps)); console.log('This props: ' + JSON.stringify(this.props)); }
Čudno stanje:
Popolnoma isti propsi, ko spremenim item v flatlistu:
Prev props: {"navigation":{"state":{"params":{"props":{"id":"418103","headingText":"Klavir","roomText":"Mala dvorana","student":"Ives Berlovčnik","apsent":"1/1","startTime":"07:00","endTime":"07:30","finished":"0","listOfStudents":[{"key":"Ives Berlovčnik","id":"43275","checked":false,"o":true,"n":false}],"minutes":"30","notes":"","lesson":""}}}
This props: {"navigation":{"state":{"params":{"props":{"id":"418103","headingText":"Klavir","roomText":"Mala dvorana","student":"Ives Berlovčnik","apsent":"1/1","startTime":"07:00","endTime":"07:30","finished":"0","listOfStudents":[{"key":"Ives Berlovčnik","id":"43275","checked":false,"o":true,"n":false}],"minutes":"30","notes":"","lesson":""}}}
"Computers are good at following instructions, but not at reading your mind."
by Donald Knuth
by Donald Knuth
![](https://static.slo-tech.com/stili/avatar_gray.gif)
zassx ::
Prvo kot prvo - grozno. Nerazumljivo napisano in koda ne veš v katero komponento spada. A ne bi bilo lažje, če bi prilepil kodo v enem kosu (nerelevantne dele lahko pobrišeš) za vsako komponento posebej, pa potem dopisal kje je problem?
A to delaš na screenu B ali v kakšni komponenti iz screena B? Če delaš v kateri komponenti, kako shraniš podatke nazaj v parent B?
WHAT? - Torej ti si na screenu B in v child komponenti preko TextInputa spremeniš podatke? In ko greš nazaj (verjetno iz B na A) in potem nazaj na B se prikažejo stari podatki?
Drugače pa: zakaj uporabljaš
Naslednji korak je, da nekaj teh podatkov spremenil v flatlist in jih zopet shranim v state od screena B.
A to delaš na screenu B ali v kakšni komponenti iz screena B? Če delaš v kateri komponenti, kako shraniš podatke nazaj v parent B?
Ko zapustim screen B in ponovno vstopim, podatki v flatlistu ostanejo isti kot prej, čeprav bi morali biti drugačni...S propsi namreč prenašam še nekaj drugih stvari recimo besedilo, ki pa ostane prejšnjo tudi, če karkoli spremenim v Textinputu in grem nazaj.
WHAT? - Torej ti si na screenu B in v child komponenti preko TextInputa spremeniš podatke? In ko greš nazaj (verjetno iz B na A) in potem nazaj na B se prikažejo stari podatki?
Drugače pa: zakaj uporabljaš
componentDidUpdatein ne
componentWillReceiveProps?
Zgodovina sprememb…
- spremenil: zassx ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [js] json kompresijaOddelek: Programiranje | 3902 (3251) | infiniteLoop |
» | [Java] Prevajanje in šumniki v ubuntuOddelek: Programiranje | 2540 (2157) | mmaestro |
» | java / mysql / počasne poizvedbeOddelek: Programiranje | 771 (700) | BRBR |
» | fortran vprasanjeOddelek: Programiranje | 924 (709) | ql000 |
» | Kako narediti redirect, če uporabnik vpiše napačno ime .htmlOddelek: Izdelava spletišč | 1440 (1341) | darh |