reactjs - React component does not react to mobx observable data -
i using mobx react native project. please consider store class:
class birds { @observable listone = []; @observable fetchinglistone = false; @observable fetcherrorone = ''; @action setlistone = () => { this.fetchinglistone = true; api.getlist() .then((data) => { this.listone.replace(data); this.fetchinglistone = false; }) .catch((error) => { this.fetchinglistone = false; this.fetcherrorone = error; }); }; } and react component:
@inject('birdstore') @observer export default class flat extends react.component { componentdidmount() { this.props.birdstore.setlistone(); } _renderheader = () => { return <text style={styles.listheadertext}> hello {this.props.birdstore.listone.length} {this.props.birdstore.fetchinglistone.tostring()} </text>; }; _renderitem = ({item}) => { return <text style={styles.item}>{item.name}</text> }; _renderfooter = () => { if (this.props.birdstore.fetchinglistone) { return <activityindicator/> } else { return null } }; render() { const datasource = this.props.birdstore.listone.slice(); return ( <view style={styles.container}> <text>fetching: {this.props.birdstore.fetchinglistone.tostring()}</text> <flatlist style={styles.listcontainer} listheadercomponent={this._renderheader} data={datasource} renderitem={this._renderitem} keyextractor={(item, i) => item.id} listfootercomponent={this._renderfooter} /> </view> ) } } from above looks me that:
- when
flatcomponent mounts, call method of storesetlistone(). setlistone()setsfetchinglistonetrue , makes api call.- on component side, when
fetchinglistonetrue, activityindicator displays, , in listheadercomponent should display true. - on store side, after successful/unsuccessful response, sets
fetchinglistonefalse. - finally on component side, because
fetchinglistoneset false, activityindicator should not display , in listheadercomponent should display false.
however, not what's happening. here when setlistone() method called, after sets fetchinglistone true, component not react changes made after api call. , activityindicator keeps displaying , in listheadercomponent displaying true.
what doing wrong here? please me. thank you
update
i have added text component before flatlist. adding text component or console logging inside component class's render method makes flatlist react changes. don't know why happening though.
the problem running here probably, although flat observer component, flatlist not (it's built-in component after all). in setup _renderfooter , others part rendered render of flatlist, not of flatlist. hence not part of lifecycle of flat, of flatlist , such not tracked mobx
there 2 ways fix this, both pretty simple:
1) declare _renderitem observer component:
_renderitem = observer(({item}) => <text style={styles.item}>{item.name}</text> ); 2) use inline anonymous observer component:
_renderitem = ({item}) => <observer>{ () => <text style={styles.item}>{item.name}</text>} </observer>
Comments
Post a Comment