React Native ListView not rendering correctly in Redux -
i have been trying figure out why listviews not rendering in react native redux. app build deck management syste. deck has set of playing cards associated it. want render decks before add card.
deckactions.js
import { actiontypes } '../constants/actions'; let did=0; export function adddeck(decktitle){ return { type: actiontypes.add_new_deck, payload:{ deckid: "deck-" + did++, decktitle } }; deckreducer.js
import { actiontypes } 'constants/actions'; import { combinereducers } 'redux'; function adddeckentry(state, action){ const {payload} = action; const {deckid, decktitle} = payload; const deck = {id: deckid, title: decktitle}; return { ...state, [deckid]: deck }; } function adddeckbyid(state, action){ const{payload} = action; const {deckid} = payload; return state.concat(deckid); } function decksbyid(state={}, action){ switch(action.type){ case actiontypes.add_new_deck: return adddeckentry(state, action); default: return state; }; } function getalldecks(state=[], action){ switch(action.type){ case actiontypes.add_new_deck: return adddeckbyid(state, action); default: return state; } } const decksreducer = combinereducers({ byid: decksbyid, allids:getalldecks, }); export default decksreducer; store.js
import { createstore, combinereducers } 'redux'; import cardsreducer 'reducers/cardreducer'; import decksreducer 'reducers/deckreducer'; import devtoolsenhancer 'remote-redux-devtools'; const rootreducer = combinereducers({ decks: decksreducer }); export default function configurestore(){ let store = createstore(rootreducer, devtoolsenhancer()); return store; } root.js
import react, { component } 'react'; import { alert, view, text, listview, stylesheet, } 'react-native'; import { button, forminput } 'react-native-elements'; import { adddeck } 'actions/deckactions'; import { bindactioncreators } 'redux'; import { connect } 'react-redux'; export class root extends component{ constructor(props){ super(props); let datasource = new listview.datasource({ rowhaschanged: (r1, r2) => r1 !== r2 }); this.state={ deckname: '', datasource: datasource, }; this.onadddeck = this.onadddeck.bind(this); this.adddeck = adddeck } componentwillreceiveprops(nextprops) { if (nextprops.decks.byid !== this.props.decks.byid){ let data = this._getlistviewdata(nextprops.decks); //alert(nextprops.decks.byid.length); this.setstate({ datasource: this.state.datasource.clonewithrows(data) }); } } _getlistviewdata(decks){ let datas = []; datas = decks.map((deck) => { return deck; }); alert(datas.length); return datas; } _setdeckname(name){ this.setstate({deckname: name}); } onadddeck(){ this.props.adddeck(this.state.deckname); } _renderrow(rowdata){ return( <view style={styles.listitem}> <text>{rowdata.decktitle}</text> </view> ); } render(){ return( <view style={styles.container}> <view> <forminput placeholder={"card topic"} inputstyle={styles.input} onchangetext={(value) => this._setdeckname(value)} /> <button small raised onpress={this.onadddeck} buttonstyle={styles.btnstyle} containerviewstyle={styles.btnstyle} title={"submit"} /> </view> <listview style={{margintop: 25}} datasource={this.state.datasource} renderrow={(rowdata) => this._renderrow(rowdata)} /> </view> ); } } root.proptypes = { adddeck : react.proptypes.func.isrequired, } const styles=stylesheet.create({ container:{ flex:1, backgroundcolor: 'rgba(0,20,90,0.4)', justifycontent: 'center', alignitems: 'center', }, btnstyle:{ backgroundcolor: 'rgb(0, 100, 255)', borderradius: 10, }, input:{ color: '#fff', fontsize:30, }, listitem:{ flexdirection: 'row', }, }); function mapstatetoprops(state){ return{ decks: state.decks, }; } function mapdispatchtoprops(dispatch){ return { adddeck: (decktitle) => {dispatch(adddeck(decktitle))}, }; } export default connect( mapstatetoprops, mapdispatchtoprops, )(root); index.android.js
import react, { component } 'react'; import { appregistry, view } 'react-native'; import root './containers/screenone'; import { provider } 'react-redux'; import configurestore './redux/store/store'; const mainstore = configurestore(); export default class testapp extends component { render() { return ( <provider store={mainstore}> <root /> </provider> ); } } appregistry.registercomponent('testapp', () => testapp); could ayone help? tnanks.
Comments
Post a Comment